DroidAssist

轻量级的 Android 字节码编辑插件
授权协议 Apache
开发语言 Java Groovy
所属分类 手机/移动开发、 手机开发工具
软件类型 开源软件
地区 国产
投 递 者 蒋正平
操作系统 Android
开源组织 滴滴出行
适用人群 未知
 软件概览

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

功能

  • 替换:把指定位置代码替换为指定代码
  • 插入:在指定位置的前后插入指定代码
  • 环绕:在指定位置环绕插入指定代码
  • 增强
    • TryCatch 对指定代码添加 try catch 代码
    • Timing 对指定代码添加耗时统计代码

特点

  • 灵活的配置化方式,使得一个配置就可以处理项目中所有的 class 文件。
  • 丰富的字节码处理功能,针对 Android 移动端的特点提供了例如代码替换,添加try catch,方法耗时等功能。
  • 简单易用,只需要依赖一个插件,处理过程以及处理后的代码中也不需要添加额外的依赖。
  • 处理速度较快,只占用较少的编译时间。

使用指南

DroidAssist 适用于 Android Studio 工程 application model 或者 library model,使用 DroidAssist 需要接入 DroidAssist 插件并编写专有配置文件。

在 root project 的 build.gradle 里添加:

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

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

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

其他配置:

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

示例

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

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

处理前的class:

public class MainActivity extends Activity {
    public static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "MainActivity onCreate");
    }
}

处理后的 class:

public class MainActivity extends Activity {
    public static final String TAG = "MainActivity";

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        String var2 = "MainActivity";
	    String var3 = "MainActivity onCreate";
        int var4 = LogUtils.log(var2, var3); // The target method using custom log method.
    }
}

完整文档

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

局限

  1. 由于 Javassist 的机制,DroidAssist 在处理的过程中将会产生额外的局部变量用以指向参数变量和保存返回值,但处理后有一些局部变量并没有实际作用。
  2. DroidAssist 在处理某些代码时可能会新增一些额外的代理方法。
  3. DroidAssist 插件用于 library model 只能处理 Java 源码产生的 class,不能处理本地依赖中的 jar 。
  • 无痕埋点概念 无痕埋点也叫无埋点、全埋点,它是一种数据采集的重要方法。由于业务更新迭代快、代码量大,手动埋点错误率高并且还费时费力,所以手动埋点不是明智的选择。这时候就需要无痕埋点,它不需要开发人员手动的写数据采集的代码,而是通过动态插入代码的方式,大大地减少了程序员的工作量。 无痕埋点方案 方式一:全局Hook App中的View 方式二:AOP编程(Aspect-Oriented Progra

  • 先来了解一下这个DroidAssist的能帮我们做什么?都有哪些功能呢? 替换:把指定位置代码替换为指定代码 插入:在指定位置的前后插入指定代码 环绕:在指定位置环绕插入指定代码 增强: TryCatch 对指定代码添加 try catch 代码 Timing 对指定代码添加耗时统计代码 恩,功能确实挺强大的,咱们可以用它来实现动态的更改方法里的字节码,可以插入指定代码,比如打印信息、耗时操作等,

  • > 滴滴开源框架 1. 质量优化框架Booster- https://github.com/didi/booster   滴滴在 Github 上开源了一个 Android App 的质量优化工具 Booster,通过动态发现和加载机制,提供了可扩展的能力。等于是一款移动应用的质量优化框架。 从特性上笼统来说,Booster 可以做到性能检测和优化、包体积瘦身、代码注入等。。   Booster

 相关资料
  • 问题内容: 什么是好的免费字节码编辑器?我想要一个带有GUI的编辑器… 我没有运气尝试了jbe-0.1b(无法保存字节码更改)。 问题答案: UI并不完美,但是您可以使用Eclipse Bytecode Outline插件将任何Java类转换为ASM代码,对其进行编辑,并生成更改后的类。这可能是目前最轻松的方式。 http://asm.ow2.org/eclipse/index.html

  • 本文向大家介绍轻量级JS Cookie插件js-cookie的使用方法,包括了轻量级JS Cookie插件js-cookie的使用方法的使用技巧和注意事项,需要的朋友参考一下 Cookie是网站设计者放置在客户端的小文本文件,一般后台语言使用的比较多,可以实现用户个性化的一些需求。js-cookie插件是一个JS操作cookie的插件,源文件只有3.34 KB,非常轻量级。js-cookie也支持

  • 下面的编辑器插件package可用: TextMate Mocha的TextMate包包含了能够加速测试编写的代码片段。 JetBrains JetBrains为它们的IDE套件(IntelliJ IDEA,WebStorm等)提供了一个NodeJS插件,包含了一个Mocha test runner,和一些周边。 该插件名为NodeJS,可以通过Preference > Plugins安装,如果你

  • 问题内容: 是否有用于 编辑Java类文件 的实用程序(或eclipse插件)?我想操作Java类文件的字节码,而无需重新编译它或没有完整的buildpath。 例如重命名方法,添加/删除指令,更改常量等。 我发现的唯一实用程序是: classeditor, 但功能非常有限( 例如,无法重命名和操作指令 )。 jbe不会保存更改(可能是因为类验证失败-在进行任何更改之前,尽管类运行良好) (jbe

  • 问题内容: JPanel和JFrame有什么区别,以及与轻量级,重量级的关系? 问题答案: JPanel是允许将多个UI组件放在一起的容器。JFrame是使用Swing编写的窗口。 所有的Swing组件都是所谓的“轻型”组件,因为它们是用Java编写的。例如,如果您运行Swing应用程序并尝试使用UI分析工具(例如Windows中的WinSpy)对其进行分析,则只会看到一个元素:窗口(JFrame

  • 本文向大家介绍基于zepto的移动端轻量级日期插件--date_picker,包括了基于zepto的移动端轻量级日期插件--date_picker的使用技巧和注意事项,需要的朋友参考一下 前言 做过移动Web开发的同学都知道,移动端日期选择是很常见的需求。在PC端,我们有很丰富的选择,比较出名的就有Mobiscroll和jQuery UI Datepicker。个人看来,这些插件存在的两个显而易见