9-aapt构建流程
Android 构建流程
AAPT ( Android 资源打包工具, Android Asset Packaging Tool) 是一种编译工具, 供 Android studio 和 Android Gradle plugin 用于编译和打包应用资源。而 AAPT2是在 AAPT 上做了优化。 Android Gradle Plugin0.0或者更高版本默认开启AAPT2。AAPT2会解析资源、为资源编索引并资源编译为针对 Android平台进行过优化的二进制格式。
其实里面都是用的命令生成的
- 编译资源,使⽤ aapt2 ⼯具对资源进⾏编译,产出:资源⼆进制⽂件压缩包 zip
- 链接资源使⽤。 aapt2 ⼯具将资源整合,产出:资源⽂件及 R.java ⽂件,arsc
- 编译 Java ⽂件。使⽤ javac ⼯具编译 Java ⽂件,产出:class 字节码⽂件
- 使⽤ dex ⼯具编译 class 代码,产出:dex ⽂件
- 合并 dex ⽂件和资源⽂件,产出:还未签名的 apk ⽂件
- 使⽤ apksigner ⼯具对 apk 签名,产出:已签名的 apk ⽂件
⼿动⽣成⼀个安装包的过程
配置 buildCofig 里的参数
apk 目录
arsc 文件
编译后的二进制资源文件,主要作用是 App 的资源索引表,可以从二进制的文件中查找到资源的相关信息,或者根据资源的 id 可以定位到二进制文件中的位置
除了 assets、图片、布局资源之外,其它的资源都会被赋予一个资源 ID。打包工具负责编译和打包资源,编译完成之后,会生成一个 resources. arsc 文件和一个R.java,前者保存的是一个资源索引表,后者定义了各个资源 ID 常量,供在代码中索引资源。id 都是16进制 0X1212,字符串没了
META-INF
进入目录,发现会有3个文件:CERT. RSA,CERT. SF,MANIFEST. MF。
MANIFEST:版本号以及对每一个文件的哈希值(BASE64)。包括资源文件。这个是对每个文件的整体进行 SHA1 hash。
CERT. SF 文件:看到跟 manifest. mf 中的很类似,也是 BASE64编码的哈希值,这个是对每个文件的头3行进行 SHA1 hash。这两个文件中的内容仅仅是个摘要,也就是仅仅对文件做个 hash。
CERT. RSA:最后一个文件是 CERT. RSA,这个文件中放的是 apk 包的签名,同时还有证书的公钥。
Android 的签名机制
对 APK 中所有文件内容分别进行 Hash 计算,并将结果以 BASE64编码格式保存在 MANIFEST. MF。使用开发者的私钥对 MANIFEST. MF 进行加密,将加密结果保存在 CERT. SF。最后 CERT.RSA (证书信息包括公钥)和上面的两个文件,放入 APK 的META-INF目录下。
如何判断证书是否有效
因为签名的时候是使用私钥对 MANIFEST. MF 进行加密保存在 CERT. SF 中,之后只需要用证书中的公钥对 CERT. SF 进行解密,将结果和 MANIFEST. MF 进行比较即可
注意,在证书正确的情况下如果更改的 APK 里面文件内容,此时以上判断还是不会通过。因为 MANIFEST. MF 保存的是 APK 里面所有文件的 Hash 值,只要改变了 APK 里文件内容,Hash 值就会变化
v2 签名机制是在 Android 7.0 以及以上版本才支持。因此对于 Android 7.0 以及以上版本,在安装过程中,如果发现有 v2 签名块,则必须走 v2 签名机制,不能绕过。否则降级走 v1 签名机制。v1 和 v2 签名机制是可以同时存在的
使用 python 实现多渠道打包
实现思路:
如果能直接修改 apk 的渠道号,而不需要再重新签名能节省不少打包的时间。解压 apk,解压后的根目录会有一个 META-INF 目录。如果在 META-INF 目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
思路已经很清晰了,在 META-INF 目录添加一个空文件,文件名即渠道号,如 channel_wandoujia。然后在 java 代码中对文件进行遍历,找到该渠道文件,读出文件名,即获取到了渠道号。
加快编译速度
- 你可以把编译简单理解为,将高级语言转化为机器或者虚拟机所能识别的低级语言的过程。对于 Android 来说,这个过程就是把 Java 或者 Kotlin 转变为 Android 虚拟机运行的Dalvik 字节码
- 关闭 JITandroid:vmSafeMode=“true”,关闭虚拟机的 JIT 优化
Android Q 大幅改进了 ART 运行时。所谓运行时改进就是对编译器 (JIT) 的改进, 开发者无需进行任何操作,便可有效缩短应用的启动时间,减少内存消耗,并提高应用的运行流畅度。
ART 配置文件,允许 ART 在应用开始运行之前就预编译一部分代码。基于云的编译文件适用于所有应用,而且运行 Android P 或更高版本系统的设备目前已提供相关支持。
- r8/d8
d8Dex 编译时间更短,dex 文件大小更小,D8编译的. dex 文件将拥有相同或者是更好的运行时性能