提交 fa8dfa9d 编写于 作者: J jackjintai

modify:

[Android]-通过auto_server代替反射创建kit
上级 73998038
package com.didichuxing.doraemonkit.plugin.classtransformer
import com.didichuxing.doraemonkit.plugin.DoKitExtUtil
import com.didichuxing.doraemonkit.plugin.isRelease
import com.didiglobal.booster.transform.TransformContext
import com.didiglobal.booster.transform.asm.ClassTransformer
import com.didiglobal.booster.transform.asm.className
import org.objectweb.asm.tree.ClassNode
/**
* ================================================
* 作 者:jint(金台)
* 版 本:1.0
* 创建日期:2021/5/12-18:06
* 描 述:
* 修订历史:
* ================================================
*/
open class AbsClassTransformer : ClassTransformer {
fun onCommInterceptor(context: TransformContext, klass: ClassNode): Boolean {
if (context.isRelease()) {
return true
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
return true
}
return false
}
}
\ No newline at end of file
......@@ -23,16 +23,13 @@ import org.objectweb.asm.tree.VarInsnNode
*/
@Priority(1)
@AutoService(ClassTransformer::class)
class BigImgTransformer : ClassTransformer {
class BigImgTransformer : AbsClassTransformer() {
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (context.isRelease()) {
if (onCommInterceptor(context, klass)) {
return klass
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
return klass
}
if (!DoKitExtUtil.commExt.bigImgSwitch) {
return klass
......@@ -101,7 +98,15 @@ class BigImgTransformer : ClassTransformer {
private fun createGlideInsnList(): InsnList {
return with(InsnList()) {
add(VarInsnNode(ALOAD, 0))
add(MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/glide/GlideHook", "proxy", "(Ljava/lang/Object;)V", false))
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/bigimg/glide/GlideHook",
"proxy",
"(Ljava/lang/Object;)V",
false
)
)
this
}
}
......@@ -112,7 +117,15 @@ class BigImgTransformer : ClassTransformer {
private fun createPicassoInsnList(): InsnList {
return with(InsnList()) {
add(VarInsnNode(ALOAD, 0))
add(MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/picasso/PicassoHook", "proxy", "(Ljava/lang/Object;)V", false))
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/bigimg/picasso/PicassoHook",
"proxy",
"(Ljava/lang/Object;)V",
false
)
)
this
}
......@@ -126,11 +139,43 @@ class BigImgTransformer : ClassTransformer {
return with(InsnList()) {
add(VarInsnNode(ALOAD, 1))
add(VarInsnNode(ALOAD, 1))
add(MethodInsnNode(INVOKEVIRTUAL, "com/facebook/imagepipeline/request/ImageRequestBuilder", "getSourceUri", "()Landroid/net/Uri;", false))
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/facebook/imagepipeline/request/ImageRequestBuilder",
"getSourceUri",
"()Landroid/net/Uri;",
false
)
)
add(VarInsnNode(ALOAD, 1))
add(MethodInsnNode(INVOKEVIRTUAL, "com/facebook/imagepipeline/request/ImageRequestBuilder", "getPostprocessor", "()Lcom/facebook/imagepipeline/request/Postprocessor;", false))
add(MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/fresco/FrescoHook", "proxy", "(Landroid/net/Uri;Lcom/facebook/imagepipeline/request/Postprocessor;)Lcom/facebook/imagepipeline/request/Postprocessor;", false))
add(MethodInsnNode(INVOKEVIRTUAL, "com/facebook/imagepipeline/request/ImageRequestBuilder", "setPostprocessor", "(Lcom/facebook/imagepipeline/request/Postprocessor;)Lcom/facebook/imagepipeline/request/ImageRequestBuilder;", false))
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/facebook/imagepipeline/request/ImageRequestBuilder",
"getPostprocessor",
"()Lcom/facebook/imagepipeline/request/Postprocessor;",
false
)
)
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/bigimg/fresco/FrescoHook",
"proxy",
"(Landroid/net/Uri;Lcom/facebook/imagepipeline/request/Postprocessor;)Lcom/facebook/imagepipeline/request/Postprocessor;",
false
)
)
add(
MethodInsnNode(
INVOKEVIRTUAL,
"com/facebook/imagepipeline/request/ImageRequestBuilder",
"setPostprocessor",
"(Lcom/facebook/imagepipeline/request/Postprocessor;)Lcom/facebook/imagepipeline/request/ImageRequestBuilder;",
false
)
)
this
}
......@@ -143,7 +188,15 @@ class BigImgTransformer : ClassTransformer {
private fun createImageLoaderInsnList(): InsnList {
return with(InsnList()) {
add(VarInsnNode(ALOAD, 6))
add(MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/bigimg/imageloader/ImageLoaderHook", "proxy", "(Lcom/nostra13/universalimageloader/core/listener/ImageLoadingListener;)Lcom/nostra13/universalimageloader/core/listener/ImageLoadingListener;", false))
add(
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/bigimg/imageloader/ImageLoaderHook",
"proxy",
"(Lcom/nostra13/universalimageloader/core/listener/ImageLoadingListener;)Lcom/nostra13/universalimageloader/core/listener/ImageLoadingListener;",
false
)
)
add(VarInsnNode(ASTORE, 6))
this
}
......
......@@ -23,7 +23,7 @@ import org.objectweb.asm.tree.*
*/
@Priority(0)
@AutoService(ClassTransformer::class)
class CommTransformer : ClassTransformer {
class CommTransformer : AbsClassTransformer() {
private val SHADOW_URL =
"com/didichuxing/doraemonkit/aop/urlconnection/HttpUrlConnectionProxyUtil"
private val DESC = "(Ljava/net/URLConnection;)Ljava/net/URLConnection;"
......@@ -33,14 +33,12 @@ class CommTransformer : ClassTransformer {
* 转化
*/
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (context.isRelease()) {
return klass
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
if (onCommInterceptor(context, klass)) {
return klass
}
val className = klass.className
val superName = klass.formatSuperName
......@@ -80,7 +78,13 @@ class CommTransformer : ClassTransformer {
"${context.projectDir.lastPath()}->hook LocationManager#getGpsStatus method succeed in : ${className}_${method.name}_${method.desc}".println()
method.instructions.insert(
it,
MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/location/GpsStatusUtil", "wrap", "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;", false)
MethodInsnNode(
INVOKESTATIC,
"com/didichuxing/doraemonkit/aop/location/GpsStatusUtil",
"wrap",
"(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;",
false
)
)
}
}
......@@ -314,7 +318,6 @@ class CommTransformer : ClassTransformer {
}
//hook Androidx的ComponentActivity
if (className != "com.didichuxing.doraemonkit.aop.mc.DoKitProxyActivity" && superName == "android.app.Activity") {
createComponentActivitySuperActivityImpl(klass)
......
......@@ -25,16 +25,14 @@ import org.objectweb.asm.tree.*
*/
@Priority(3)
@AutoService(ClassTransformer::class)
class EnterMethodStackTransformer : ClassTransformer {
class EnterMethodStackTransformer : AbsClassTransformer() {
private val thresholdTime = DoKitExtUtil.slowMethodExt.stackMethod.thresholdTime
private val level = 0
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (context.isRelease()) {
return klass
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
if (onCommInterceptor(context, klass)) {
return klass
}
......
......@@ -22,15 +22,11 @@ import org.objectweb.asm.tree.*
*/
@Priority(2)
@AutoService(ClassTransformer::class)
class GlobalSlowMethodTransformer : ClassTransformer {
class GlobalSlowMethodTransformer : AbsClassTransformer() {
val thresholdTime = DoKitExtUtil.slowMethodExt.normalMethod.thresholdTime
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (context.isRelease()) {
return klass
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
if (onCommInterceptor(context, klass)) {
return klass
}
......
......@@ -21,17 +21,14 @@ import org.objectweb.asm.tree.*
* 原理:transform()方法的调用是无序的 原因:哪一个class会先被transformer执行是不确定的 但是每一个class被transformer执行顺序是遵循transformer的Priority规则的
* ================================================
*/
class MethodStackDepTransformer(private val level: Int = 1) : ClassTransformer {
class MethodStackDepTransformer(private val level: Int = 1) : AbsClassTransformer() {
private val thresholdTime = DoKitExtUtil.slowMethodExt.stackMethod.thresholdTime
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (context.isRelease()) {
if (onCommInterceptor(context, klass)) {
return klass
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
return klass
}
if (!DoKitExtUtil.dokitSlowMethodSwitchOpen()) {
return klass
......
......@@ -26,16 +26,13 @@ import org.objectweb.asm.tree.MethodInsnNode
*/
//@Priority(1)
//@AutoService(ClassTransformer::class)
class UrlConnectionTransformer : ClassTransformer {
private val SHADOW_URL = "com/didichuxing/doraemonkit/aop/urlconnection/HttpUrlConnectionProxyUtil"
class UrlConnectionTransformer : AbsClassTransformer() {
private val SHADOW_URL =
"com/didichuxing/doraemonkit/aop/urlconnection/HttpUrlConnectionProxyUtil"
private val DESC = "(Ljava/net/URLConnection;)Ljava/net/URLConnection;"
override fun transform(context: TransformContext, klass: ClassNode): ClassNode {
if (context.isRelease()) {
return klass
}
if (!DoKitExtUtil.dokitPluginSwitchOpen()) {
if (onCommInterceptor(context, klass)) {
return klass
}
......@@ -48,15 +45,19 @@ class UrlConnectionTransformer : ClassTransformer {
}
klass.methods.forEach { method ->
method.instructions?.iterator()?.asIterable()?.filterIsInstance(MethodInsnNode::class.java)?.filter {
it.opcode == INVOKEVIRTUAL &&
it.owner == "java/net/URL" &&
it.name == "openConnection" &&
it.desc == "()Ljava/net/URLConnection;"
}?.forEach {
"${context.projectDir.lastPath()}-> hook urlconnection succeed:${klass.name}_${it.name}_${it.desc}".println()
method.instructions.insert(it, MethodInsnNode(INVOKESTATIC, SHADOW_URL, "proxy", DESC, false))
}
method.instructions?.iterator()?.asIterable()
?.filterIsInstance(MethodInsnNode::class.java)?.filter {
it.opcode == INVOKEVIRTUAL &&
it.owner == "java/net/URL" &&
it.name == "openConnection" &&
it.desc == "()Ljava/net/URLConnection;"
}?.forEach {
"${context.projectDir.lastPath()}-> hook urlconnection succeed:${klass.name}_${it.name}_${it.desc}".println()
method.instructions.insert(
it,
MethodInsnNode(INVOKESTATIC, SHADOW_URL, "proxy", DESC, false)
)
}
}
return klass
......
......@@ -36,10 +36,15 @@ android {
buildConfigField("String", "DOKIT_VERSION", "\"" + dokitVersion + "\"")
}
}
// compileOptions {
// sourceCompatibility JavaVersion.VERSION_1_8
// targetCompatibility JavaVersion.VERSION_1_8
// }
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = "1.8"
}
dataBinding {
......@@ -47,9 +52,7 @@ android {
}
kotlinOptions {
jvmTarget = "1.8"
}
}
......
......@@ -4,11 +4,7 @@ import android.content.Context;
import com.didichuxing.doraemonkit.R;
import com.didichuxing.doraemonkit.config.LogInfoConfig;
import com.didichuxing.doraemonkit.constant.FragmentIndex;
import com.didichuxing.doraemonkit.kit.AbstractKit;
import com.didichuxing.doraemonkit.kit.Category;
import com.didichuxing.doraemonkit.kit.core.DokitIntent;
import com.didichuxing.doraemonkit.kit.core.DokitViewManager;
import com.didichuxing.doraemonkit.kit.core.SimpleDokitStarter;
import com.google.auto.service.AutoService;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册