DroidAssist 轻量级的 Android 字节码编辑插件开源项目

我要开发同款
匿名用户2019年05月14日
79阅读
开发技术JavaGroovy
所属分类手机开发工具、手机/移动开发
授权协议Apache

作品详情

DroidAssist 是一个轻量级的Android字节码编辑插件,基于 Javassist 对字节码操作,根据xml配置处理class文件,以达到对class文件进行动态修改的效果。和其他AOP方案不同,DroidAssist提供了一种更加轻量,简单易用,无侵入,可配置化的字节码操作方式,你不需要Java字节码的相关知识,只需要在Xml插件配置中添加简单的Java代码即可实现类似AOP的功能,同时不需要引入其他额外的依赖。

功能替换:把指定位置代码替换为指定代码插入:在指定位置的前后插入指定代码环绕:在指定位置环绕插入指定代码增强:TryCatch 对指定代码添加trycatch代码Timing 对指定代码添加耗时统计代码特点灵活的配置化方式,使得一个配置就可以处理项目中所有的class文件。丰富的字节码处理功能,针对Android移动端的特点提供了例如代码替换,添加trycatch,方法耗时等功能。简单易用,只需要依赖一个插件,处理过程以及处理后的代码中也不需要添加额外的依赖。处理速度较快,只占用较少的编译时间。使用指南

DroidAssist适用于 AndroidStudio 工程 applicationmodel 或者 librarymodel,使用DroidAssist需要接入DroidAssist插件并编写专有配置文件。

在rootproject的 build.gradle 里添加:

dependencies{classpath"com.didichuxing.tools:droidassist:1.0.8"}

在需要处理的modelproject的build.gradle里添加:

applyplugin:'com.didichuxing.tools.droidassist'droidAssistOptions{configfile("droidassist.xml"),file("droidassist2.xml")//插件配置文件(必选配置,支持多配置文件)}

其他配置:

enable 如果需要停用DroidAssist插件功能,可以添加 enablefalse 以停用插件(可选配置)logLevel 日志输出等级:0 关闭日志输出,1 输出日志到控制台 2 输出日志到文件 3 输出日志到控制台以及日志(可选配置)logDir 日志输出目录,当日志输出到文件时,默认的输出目录是当前 model 的 build/outputs/logs 目录(可选配置)示例

下面例子将把项目中所有使用系统 android.util.Log 类进行 DEBUG 日志输出的代码替换为自定义的日志输出类,以方便对线上日志进行策略化,动态化管理。

<Replace><MethodCall><Source>intandroid.util.Log.d(java.lang.String,java.lang.String)</Source><Target>$_=com.didichuxing.tools.test.LogUtils.log($1,$2);</Target></MethodCall></Replace>

处理前的class:

publicclassMainActivityextendsActivity{publicstaticfinalStringTAG="MainActivity";@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);Log.d(TAG,"MainActivityonCreate");}}

处理后的class:

publicclassMainActivityextendsActivity{publicstaticfinalStringTAG="MainActivity";protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);Stringvar2="MainActivity";Stringvar3="MainActivityonCreate";intvar4=LogUtils.log(var2,var3);//Thetargetmethodusingcustomlogmethod.}}完整文档

完整开发文档和配置见 开发文档wiki

局限由于Javassist的机制,DroidAssist在处理的过程中将会产生额外的局部变量用以指向参数变量和保存返回值,但处理后有一些局部变量并没有实际作用。DroidAssist在处理某些代码时可能会新增一些额外的代理方法。DroidAssist插件用于 librarymodel 只能处理Java源码产生的class,不能处理本地依赖中的jar。
声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论