转载

Android编译插桩

记得去年曾经分享过xposed框架的使用,那是在系统层面去hook住方法,不足之处是系统要先刷入框架包,优点是可以对该系统里面所有的app进行hook

是否可以对我们自己的应用进行代码的修改?比如上面提到的有java hook,还有编译插桩:下面是比较流行的框架

  1. aspectJ (面向切面框架) 跟普通代码一样,理解容易
  2. Asm (操作字节码框架)需要使用asm字节码,相对复杂

而插桩的应用场景:apm,无埋点

三、比较一下aspectJ 与asm分别插桩后的代码

1. aspectJ

Android编译插桩

2. asm

Android编译插桩

通过上面两个图可以看出插桩后的代码还是有所区别,aspectJ采用插入方法的方式,这种代码混淆的时候一定要注意,不然会出现找不到方法名。而asm采用直接把差异代码嵌入原有的方法里,显然执行起来更加高效。

asm实现的插桩

1. 原代码

Android编译插桩

2. 字节码

Android编译插桩

3. asm代码

Android编译插桩

可以看出代码相对来说是比较复杂的,可能需要工具才能正确去编写asm代码,比如idea插件bytecode outline

Android编译插桩

asm在编译打包的哪个步骤插桩呢

Android编译插桩

如图所示:在编译成.class文件后,执行asm步骤,对class文件进行处理。而后就把各种编译后的文件打包进dex文件的过程。

demo-采用asm为某个方法插入代码

一个简单的demo,对一个方法进行asm插桩

github.com/ydpzg/TestP…

附录

自定义gradle plugin

guides.gradle.org/writing-gra…

docs.gradle.org/current/use…

Asm 字节码插件: Asm Bytecode Outline

java字节码: javac Apple.java javap -verbose Apple.class

原文  https://juejin.im/post/5d4a3e90e51d4561c94b0f85
正文到此结束
Loading...