一、 APK 共同组成导出

在已经开始导出 Android 构筑业务流程以后,他们先上看下构筑的最后乙醛 APK 的总体共同组成:

APK 主要就由五个部份共同组成,依次是:

Dex:.class 文档处置后的乙醛,Android 控制系统的可执行文档

Resource:天然资源文档,主要就主要包括 layout、drawable、animator,透过 R.XXX.id 提及

Assets:天然资源文档,透过 AssetManager 展开读取

Library:so 库存量放产品目录

META-INF:APK 亲笔签名相关的重要信息

1.1 Apk 预测辅助工具

工欲善其事,工欲善其事,难道想预测 APK 必定免不了称心的辅助工具。

Android Studio 便携式的 APK 解析器

透过 APK 解析器,他们可以完成这些操作:

查看 APK 中文档(如 DEX 和 Android 天然资源文档)的绝对大小和相对大小

了解 DEX 文档的共同组成

快速查看 APK 中文档(如 AndroidManifest.xml)的最后版本

对两个 APK 展开并排比较

ClassyShark可以做为 AS 便携式 APK 解析器的补充,帮他们预测 dex 中的详细数据,以及查看 APK 中的总方法数以及各个模块的方法数分布。

1.2 Dex 知识点拓展

当他们在 Android 查看一个 APK 的时候,可以看到右上角有 Defined Methods 和 Referenced Methods,但大多数人可能不知道这两者的区别,这里简单说明下:

Defined Methods:在这个 Dex 中定义的方法;Referenced Methods:Defined Methods 以及 Defined Methods 提及到的方法。

Android 有 64K 提及限制,当 type_ids、method_ids 或者 field_ids 超过 65536(64 * 1024)的时候,需要展开 dex 分包,为了 Dex 的数量尽可能少,他们需要尽量实现「Dex 重要信息有效率」的提升。

二、 构筑源码导读

当他们用 Android Studio 展开安装包构筑的时候,会发现其实是运行了一连串的 Task,也就是说其实是这些 task 的配合,最后构筑出他们的 APK 的。

2.1 源码引入

如果他们想更了解 Android 的构筑业务流程,对于相关的源码肯定是要有所了解的。那他们如何看到这些 Task 相关的源码呢,他们知道 Android 是用 Gradle 展开构筑的,也就意味着这些 task 其实都是放在 Gradle 中,他们想看 Gradle 中源码的话,可以在 build.gradle 将 Gradle 展开编译。

编译完之后,可以在 ApplicationTaskManagercreateTasksForVariantScope 中找到创建这些 Task 相关的代码,也就意味着顺藤摸瓜找到这些 Task 的真正实现逻辑。

2.2 BuildConfig Task 详解

这里以 BuildConfig 文档的生成为例,来梳理下如何查看某个 task 的代码逻辑。

生成 BuildConfig 文档,是透过 ApplicationTaskManager 中透过 createBuildConfigTask 来创建对应的 task。

顺着代码逻辑,他们找到最后真正实现这个逻辑的是:GenerateBuildConfig 这个 task,GenerateBuildConfig 是继承自 BaseTask,这里有个小技巧是,Task 中真正的执行逻辑都是在带着 @TaskAction 注解的方法上的,所以他们能很快找到对应的 generate() 方法。可以看到生成 BuildConfig 总体的逻辑还是比较简单的,其实就是将 build.gradle 中便携式的属性以及他们自定义的属性展开读取,然后透过 JavaWriter 生成对应的 BuildConfig 文档。

2.3 获取所有 task 对应的类名

看到上面的例子,可能有些人会抛出一个疑问就是那他们是不是确定构筑中执行的 task 具体对应哪个类呢,这里提供一个小技巧,其实他们可以在 taskGraph 构筑完成之后,将所有 task name 以及对应的 class 展开打印。例如在 build.gradle 中加入这个代码之后,他们在运行的时候,就会把 task 所对应的类名也都一起打印出来。

三、构筑业务流程梳理

可以看到 Android 构筑中会涉及到多个辅助工具,他们可以透过 open $ANDROID_HOME/build-tools 来查看相关的构筑辅助工具。

四、手动构筑 APK

最后他们透过命令行来手动打包一个可执行的 APK,能让他们对 APK 构筑的理解更加深入。首先需要准备下 代码、天然资源文档、AndroidManifest 这些构筑 APK 的必要文档。

透过 aapt2 compile 将 res 天然资源编译成 .flat 的二进制文档:

aapt2 compile -o build/res.zip –dir res

透过 aapt2 link 将 .flat 和 AndroidManifest 展开连接,转化成不包含 dex 的 apk 和 R.java:

aapt2 link build/res.zip -I $ANDROID_HOME/platforms/android-30/android.jar –java build –manifest AndroidManifest.xml -o build/app-debug.apk

透过 javac 将 Java 文档编译成 .class 文档:

javac -d build -cp $ANDROID_HOME/platforms/android-30/android.jar com/**/**/**/*.java

透过 d8 将 .class 文档转化成 dex 文档:

d8 –output build/ –lib $ANDROID_HOME/platforms/android-30/android.jar build/com/tencent/hockeyli/androidbuild/*.class

合并 dex 件和天然资源 件:

zip -j build/app-debug.apk build/classes.dex

对 apk 透过 apksigner 展开亲笔签名:

apksigner sign -ks ~/.android/debug.keystore build/appdebug.apk

1.本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2.分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3.不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4.本站提供的源码、模板、插件等其他资源,都不包含技术服务请大家谅解!
5.如有链接无法下载或失效,请联系管理员处理!
6.本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!