说说 ByteX 的能力
今天以笔者简陋的知识说下对 ByteX 的了解。
ByteX 是一个 Android gradle 插件管理库,其中默认提供了很多功能。今天只是希望可以简明地述说一下 ByteX 的功能,以及其实现的一些重点。因为笔者理解能力有限,可能有些错误,希望可以有朋友指出哈。
ByteX 的能力说明
Android 使用 gradle 进行编译的时候,java 源码部分会先编译成 class 文件,然后 class 文件再经过打包处理,成为 dex 文件。为了简化理解的步骤,可以认为 dex 文件就是最后 Android 应用执行时候的代码。
在开发的时候,很多情况下都会有这样的需求:在符合某些条件的方法执行的某个位置,执行某操作。例如:给现在的代码里的所有方法的第一句都增加一条 log。我们以 “给现在的代码里的所有方法都增加一条 log” 为例,做法可以是
- 在 java 文件转成 class 之前,在所有的 java 方法第一句都增加 log 。(为了简化表述,这里不考虑构造方法需要先 super 了。)
- 在 class 文件生成后,在所有的 class 方法第一句都增加 log。 (为了简化表述,这里也忽略有的不应该加了。)
这里通常会选择第二种方式,原因有:
- 因为 java 文件的处理相比 class 文件不够通用(比如 Kotlin 文件也会转成 class 文件,但是如果是按照 java 文件进行处理的话,还需要新增一份对 kotlin 文件的处理)。
- 目前 Android 编译提供的就是 class 的遍历处理,而不是 java 的文件处理。
而 class 文件的处理很简单,就是将许多个 class 文件依次进行遍历并进行处理,处理之后会生成新的 class 文件。
假设有多个修改代码的需求的话,比如说除了 给现在的代码里的所有方法的第一句都增加一条 log , 我们还要 给现在的代码里的所有方法的最后一句都增加一条 log 。那么我们有两种方式:
- 是在一次 class 的遍历之中做两件事情。
- 进行两次遍历,一次在头部加一句 log,一次在尾部加一句 log。
上面的只是类比,实际上肯定会有很多类似“给每个方法增加 log”这类需求,比如说检测并拦截对敏感设备字段的访问 、给某些关键方法增加性能统计以及日志上报 等。我们一般的应对也是上面两种,但是前者是不能接受的,因为 各个需求是互不相干的代码执行的(甚至大部分是第三方库里提供的处理),无法整合到一起,因此只能接受第二种模式——重复遍历处理 class。
这样的话,循环遍历 class 文件会导致 class 处理用了太多的时间,增加了编译时间。
而 ByteX 的诞生,就是为了将这些处理整合到一起,即将第二种模式修改为第三种模式。
ByteX 的实现
那么我们推测一下 ByteX 所作的事情 :
- 作为一个普通的 class 处理者,遍历 class 进行处理
- 作为一个 “class 处理者” 的容器,将 遍历 class 的操作 传递到其中每个元素上面。
其实基本上也差不多哈。