Small icon indicating copy to clipboard operation
Small copied to clipboard

能说下插件的源码与资源是怎么编译成DEX,arsc的文件吗

Open linjson opened this issue 8 years ago • 3 comments

linjson avatar Oct 23 '17 02:10 linjson

简单地说,Android Gradle Plugin 封装了 ant 实现了一套流程来编译 Android 代码(javac, dex)与资源(aapt)。Small 对这些过程进行了 hook,分离出了纯粹的插件 dex 与 arsc。

Dex 的分离,借助于 Android Gradle Plugin 1.5.0 之后的 android.registerTransform API(类似于管道的一种机制),可以方便地控制 Stream Input / Output (*.class, *.jar)。

Arsc 的分离相对复杂一些,其格式是二进制的,Small基于 aapt 源码,用 groovy 语言实现了一套 Arsc 二进制文件的解析、重建算法,包括对 StringPool、ResEntry、DynamicRefTable 等的过滤、构造处理。

这部分的代码也是开放的,可以查看 buildSrc 部分的源码。

另外,我在GMTC上演讲的 PPT,对此也有一些形象的动画演示。

galenlin avatar Oct 26 '17 15:10 galenlin

你好,比如插件apk的生成,是在生成apk后,然后调用plugin gradle解析apk然后解析arsc,然后对arsc进行重构么?

nianzixin avatar Nov 09 '17 08:11 nianzixin

@nianzixin 不是在生成 apk 之后,而是生成 apk 过程中的 aapt 这一步骤之后。就是在编译中进行的。

galenlin avatar Nov 19 '17 08:11 galenlin