Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DiDi
Booster
提交
7dc64461
B
Booster
项目概览
DiDi
/
Booster
通知
31
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
B
Booster
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
7dc64461
编写于
6月 07, 2019
作者:
N
neighbWang
提交者:
Johnson Lee
6月 10, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ActivityThread optimization
上级
285a6d34
变更
7
隐藏空白更改
内联
并排
Showing
7 changed file
with
236 addition
and
0 deletion
+236
-0
booster-android-instrument-activity-thread/build.gradle
booster-android-instrument-activity-thread/build.gradle
+7
-0
booster-android-instrument-activity-thread/src/main/java/com/didiglobal/booster/instrument/ActivityThreadHooker.java
...m/didiglobal/booster/instrument/ActivityThreadHooker.java
+76
-0
booster-transform-activity-thread/build.gradle
booster-transform-activity-thread/build.gradle
+9
-0
booster-transform-activity-thread/src/main/kotlin/com/didiglobal/booster/transform/activitythread/ActivityThreadTransformer.kt
...ter/transform/activitythread/ActivityThreadTransformer.kt
+119
-0
booster-transform-activity-thread/src/main/kotlin/com/didiglobal/booster/transform/activitythread/ActivityThreadVarinatProcessor.kt
...ransform/activitythread/ActivityThreadVarinatProcessor.kt
+22
-0
booster-transform-all/build.gradle
booster-transform-all/build.gradle
+1
-0
settings.gradle
settings.gradle
+2
-0
未找到文件。
booster-android-instrument-activity-thread/build.gradle
0 → 100644
浏览文件 @
7dc64461
sourceCompatibility
=
JavaVersion
.
VERSION_1_7
targetCompatibility
=
JavaVersion
.
VERSION_1_7
dependencies
{
compileOnly
project
(
':booster-android-api'
)
compile
project
(
':booster-android-instrument'
)
}
booster-android-instrument-activity-thread/src/main/java/com/didiglobal/booster/instrument/ActivityThreadHooker.java
0 → 100644
浏览文件 @
7dc64461
package
com.didiglobal.booster.instrument
;
import
android.os.Handler
;
import
android.util.Log
;
import
com.didiglobal.booster.android.bugfix.CaughtCallback
;
import
static
com
.
didiglobal
.
booster
.
android
.
bugfix
.
Constants
.
TAG
;
import
static
com
.
didiglobal
.
booster
.
android
.
bugfix
.
Reflection
.
getFieldValue
;
import
static
com
.
didiglobal
.
booster
.
android
.
bugfix
.
Reflection
.
getStaticFieldValue
;
import
static
com
.
didiglobal
.
booster
.
android
.
bugfix
.
Reflection
.
invokeMethod
;
import
static
com
.
didiglobal
.
booster
.
android
.
bugfix
.
Reflection
.
setFieldValue
;
/**
* @author neighbWang
*/
public
class
ActivityThreadHooker
{
private
volatile
static
boolean
hooked
;
public
static
void
hook
()
{
if
(
hooked
)
{
return
;
}
Object
thread
=
null
;
try
{
thread
=
android
.
app
.
ActivityThread
.
currentActivityThread
();
}
catch
(
final
Throwable
t1
)
{
Log
.
w
(
TAG
,
"ActivityThread.currentActivityThread() is inaccessible"
,
t1
);
try
{
thread
=
getStaticFieldValue
(
android
.
app
.
ActivityThread
.
class
,
"sCurrentActivityThread"
);
}
catch
(
final
Throwable
t2
)
{
Log
.
w
(
TAG
,
"ActivityThread.sCurrentActivityThread is inaccessible"
,
t1
);
}
}
if
(
null
==
thread
)
{
Log
.
w
(
TAG
,
"ActivityThread instance is inaccessible"
);
return
;
}
try
{
final
Handler
handler
=
getHandler
(
thread
);
if
(
null
==
handler
||
!(
hooked
=
setFieldValue
(
handler
,
"mCallback"
,
new
CaughtCallback
(
handler
))))
{
Log
.
i
(
TAG
,
"Hook ActivityThread.mH.mCallback failed"
);
}
}
catch
(
final
Throwable
t
)
{
Log
.
w
(
TAG
,
"Hook ActivityThread.mH.mCallback failed"
,
t
);
}
if
(
hooked
)
{
Log
.
i
(
TAG
,
"Hook ActivityThread.mH.mCallback success!"
);
}
}
private
static
Handler
getHandler
(
final
Object
thread
)
{
Handler
handler
;
if
(
null
!=
(
handler
=
getFieldValue
(
thread
,
"mH"
)))
{
return
handler
;
}
if
(
null
!=
(
handler
=
invokeMethod
(
thread
,
"getHandler"
)))
{
return
handler
;
}
try
{
if
(
null
!=
(
handler
=
getFieldValue
(
thread
,
Class
.
forName
(
"android.app.ActivityThread$H"
))))
{
return
handler
;
}
}
catch
(
final
ClassNotFoundException
e
)
{
Log
.
w
(
TAG
,
"Main thread handler is inaccessible"
,
e
);
}
return
null
;
}
}
booster-transform-activity-thread/build.gradle
0 → 100644
浏览文件 @
7dc64461
apply
from:
'../gradle/booster.gradle'
dependencies
{
kapt
"com.google.auto.service:auto-service:1.0-rc4"
implementation
project
(
':booster-android-gradle-api'
)
implementation
project
(
':booster-task-spi'
)
implementation
project
(
':booster-transform-asm'
)
compileOnly
'com.android.tools.build:gradle:3.0.0'
}
booster-transform-activity-thread/src/main/kotlin/com/didiglobal/booster/transform/activitythread/ActivityThreadTransformer.kt
0 → 100644
浏览文件 @
7dc64461
package
com.didiglobal.booster.transform.activitythread
import
com.didiglobal.booster.kotlinx.file
import
com.didiglobal.booster.kotlinx.touch
import
com.didiglobal.booster.transform.ArtifactManager
import
com.didiglobal.booster.transform.TransformContext
import
com.didiglobal.booster.transform.activity.thread.Build
import
com.didiglobal.booster.transform.asm.ClassTransformer
import
com.didiglobal.booster.transform.asm.className
import
com.didiglobal.booster.transform.asm.findAll
import
com.didiglobal.booster.util.ComponentHandler
import
com.google.auto.service.AutoService
import
org.objectweb.asm.Opcodes
import
org.objectweb.asm.Opcodes.ACC_PUBLIC
import
org.objectweb.asm.Opcodes.ALOAD
import
org.objectweb.asm.Opcodes.ATHROW
import
org.objectweb.asm.Opcodes.INVOKESPECIAL
import
org.objectweb.asm.Opcodes.INVOKESTATIC
import
org.objectweb.asm.Opcodes.RETURN
import
org.objectweb.asm.tree.ClassNode
import
org.objectweb.asm.tree.InsnList
import
org.objectweb.asm.tree.InsnNode
import
org.objectweb.asm.tree.MethodInsnNode
import
org.objectweb.asm.tree.MethodNode
import
org.objectweb.asm.tree.VarInsnNode
import
java.io.PrintWriter
import
javax.xml.parsers.SAXParserFactory
/**
* @author neighbWang
*/
@AutoService
(
ClassTransformer
::
class
)
class
ActivityThreadTransformer
:
ClassTransformer
{
private
lateinit
var
logger
:
PrintWriter
private
val
applications
=
mutableSetOf
<
String
>()
override
fun
onPreTransform
(
context
:
TransformContext
)
{
val
parser
=
SAXParserFactory
.
newInstance
().
newSAXParser
()
context
.
artifacts
.
get
(
ArtifactManager
.
MERGED_MANIFESTS
).
forEach
{
manifest
->
val
handler
=
ComponentHandler
()
parser
.
parse
(
manifest
,
handler
)
applications
.
addAll
(
handler
.
applications
)
}
this
.
logger
=
context
.
reportsDir
.
file
(
Build
.
ARTIFACT
).
file
(
context
.
name
).
file
(
"report.txt"
).
touch
().
printWriter
()
}
override
fun
onPostTransform
(
context
:
TransformContext
)
{
this
.
logger
.
close
()
}
override
fun
transform
(
context
:
TransformContext
,
klass
:
ClassNode
):
ClassNode
{
if
(!
this
.
applications
.
contains
(
klass
.
className
))
{
return
klass
}
val
clinit
=
klass
.
methods
?.
find
{
"${it.name}${it.desc}"
==
"<clinit>()V"
}
?:
klass
.
defaultClinit
clinit
.
instructions
?.
findAll
(
RETURN
,
ATHROW
)
?.
forEach
{
clinit
.
instructions
?.
insertBefore
(
it
,
MethodInsnNode
(
INVOKESTATIC
,
ACTIVITY_THREAD_HOOKER
,
"hook"
,
"()V"
,
false
))
logger
.
println
(
" + $ACTIVITY_THREAD_HOOKER.hook()V before @${if (it.opcode == ATHROW) "
athrow
" else "
return
"}: ${klass.name}.${clinit.name}${clinit.desc}"
)
}
val
init
=
klass
.
methods
?.
find
{
"${it.name}${it.desc}"
==
"<init>()V"
}
?:
klass
.
defaultInit
init
.
instructions
?.
findAll
(
RETURN
,
ATHROW
)
?.
forEach
{
init
.
instructions
?.
insertBefore
(
it
,
MethodInsnNode
(
INVOKESTATIC
,
ACTIVITY_THREAD_HOOKER
,
"hook"
,
"()V"
,
false
))
logger
.
println
(
" + $ACTIVITY_THREAD_HOOKER.hook()V before @${if (it.opcode == ATHROW) "
athrow
" else "
return
"}: ${klass.name}.${init.name}${init.desc}"
)
}
val
onCreate
=
klass
.
methods
?.
find
{
"${it.name}${it.desc}"
==
"onCreate()V"
}
?:
klass
.
defaultOnCreate
onCreate
.
instructions
?.
findAll
(
RETURN
,
ATHROW
)
?.
forEach
{
onCreate
.
instructions
?.
insertBefore
(
it
,
MethodInsnNode
(
INVOKESTATIC
,
ACTIVITY_THREAD_HOOKER
,
"hook"
,
"()V"
,
false
))
logger
.
println
(
" + $ACTIVITY_THREAD_HOOKER.hook()V before @${if (it.opcode == ATHROW) "
athrow
" else "
return
"}: ${klass.name}.${onCreate.name}${onCreate.desc}"
)
}
return
klass
}
}
private
val
ClassNode
.
defaultClinit
:
MethodNode
get
()
=
MethodNode
(
Opcodes
.
ACC_STATIC
,
"<clinit>"
,
"()V"
,
null
,
null
).
apply
{
maxStack
=
1
instructions
.
insert
(
InsnNode
(
RETURN
))
methods
?.
add
(
this
)
}
private
val
ClassNode
.
defaultInit
:
MethodNode
get
()
=
MethodNode
(
ACC_PUBLIC
,
"<init>"
,
"()V"
,
null
,
null
).
apply
{
maxStack
=
1
instructions
.
insert
(
InsnList
().
apply
{
add
(
VarInsnNode
(
ALOAD
,
0
))
add
(
MethodInsnNode
(
INVOKESPECIAL
,
superName
,
name
,
desc
,
false
))
add
(
InsnNode
(
RETURN
))
})
methods
?.
add
(
this
)
}
private
val
ClassNode
.
defaultOnCreate
:
MethodNode
get
()
=
MethodNode
(
ACC_PUBLIC
,
"onCreate"
,
"()V"
,
null
,
null
).
apply
{
instructions
?.
add
(
InsnList
().
apply
{
add
(
VarInsnNode
(
ALOAD
,
0
))
add
(
MethodInsnNode
(
INVOKESPECIAL
,
superName
,
name
,
desc
,
false
))
add
(
InsnNode
(
RETURN
))
})
maxStack
=
1
methods
?.
add
(
this
)
}
const
val
ACTIVITY_THREAD_HOOKER
=
"com/didiglobal/booster/instrument/ActivityThreadHooker"
\ No newline at end of file
booster-transform-activity-thread/src/main/kotlin/com/didiglobal/booster/transform/activitythread/ActivityThreadVarinatProcessor.kt
0 → 100644
浏览文件 @
7dc64461
package
com.didiglobal.booster.transform.activitythread
import
com.android.build.gradle.api.BaseVariant
import
com.android.build.gradle.api.LibraryVariant
import
com.didiglobal.booster.gradle.scope
import
com.didiglobal.booster.task.spi.VariantProcessor
import
com.didiglobal.booster.transform.activity.thread.Build
import
com.google.auto.service.AutoService
/**
* @author neighbWang
*/
@AutoService
(
VariantProcessor
::
class
)
class
ActivityThreadVarinatProcessor
:
VariantProcessor
{
override
fun
process
(
variant
:
BaseVariant
)
{
if
(
variant
!
is
LibraryVariant
)
{
variant
.
scope
.
globalScope
.
project
.
dependencies
.
add
(
"implementation"
,
"${Build.GROUP}:booster-android-instrument-activity-thread:${Build.VERSION}"
)
}
}
}
\ No newline at end of file
booster-transform-all/build.gradle
浏览文件 @
7dc64461
dependencies
{
compile
project
(
':booster-transform-lint'
)
compile
project
(
':booster-transform-logcat'
)
compile
project
(
':booster-transform-activity-thread'
)
compile
project
(
':booster-transform-finalizer-watchdog-daemon'
)
compile
project
(
':booster-transform-media-player'
)
compile
project
(
':booster-transform-res-check'
)
...
...
settings.gradle
浏览文件 @
7dc64461
include
':booster-aapt2'
include
':booster-android-api'
include
':booster-android-instrument'
include
':booster-android-instrument-activity-thread'
include
':booster-android-instrument-finalizer-watchdog-daemon'
include
':booster-android-instrument-logcat'
include
':booster-android-instrument-media-player'
...
...
@@ -20,6 +21,7 @@ include ':booster-task-compression'
include
':booster-task-dependency'
include
':booster-task-permission'
include
':booster-task-spi'
include
':booster-transform-activity-thread'
include
':booster-transform-all'
include
':booster-transform-asm'
include
':booster-transform-finalizer-watchdog-daemon'
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录