现在项目组的打包工作基本借助gradle化集成打包。最近想熟悉下gradle的自动化构建原理以及后续想学习下apk包体优化及热修复,过程中了解了这个打包过程。故自己动手打包体验一下,加深细节了解。
概念了解
- aar,即Android Archive,是Android库项目的二进制归档文件。
- aapt,即Android Asset Packaging Tool,SDK的build-tools目录的可执行文件,可查看,创建, 更新ZIP格式的文档附件(zip, jar, apk),也可将资源文件编译成二进制文件。
- aidl,即Android Interface Definition Language Android接口定义语言,定义android跨进程通信接口文件。
apk结构
- AndroidMainfest.xml:编译后的压缩文件,包括了一些应用的信息如包名、版本号、权限、组件注册。
- resources.arsc :通过AAPT编译后的资源索引表文件。
- res目录: 存放APP的资源,包括图片,字符串、布局等等文件。
- classes.dex:java源码编译后生成的java字节码文件被转化为android虚拟机可执行文件
- META-INF目录:存放的是签名信息,用来保证apk包的完整性和系统的安全。
构建打包过程
- 测试项目目录为:E:\AndroidArea\AndroidWorkspace\PackageTest
- 打包过程中产生的中间文件都存放在 E:\AndroidArea\AndroidWorkspace\PackageTest\topack中
- aapt版本/目录:E:\AndroidArea\AndroidSdk\build-tools\23.0.3\aapt.exe
- dx工具目录:E:\AndroidArea\AndroidSdk\build-tools\23.0.3\dx
- zipalign工具目录:E:\AndroidArea\AndroidSdk\build-tools\23.0.3\zipalign
- 安装过jdk1.8版本
生成R.java文件
1 | 执行命令: |
生成.class文件
1 | 执行命令: |
生成dex文件
1 | 执行命令: |
打包项目资源
1 | 执行命令: |
生成未签名apk
目前sdk tools目录下apkbuilder已经被移除,可以把tools目录下android.bat进行修改
“复制android.bat一份并重新命名为apkbuilder.bat,把apkbuilder.bat中change com.android.sdkmanager.Main替换为com.android.sdklib.build.ApkBuilderMain”1
2
3
4
5
6
7
8
9
10
11
12
13执行命令:
E:\AndroidArea\AndroidSdk\tools\apkbuilder E:\AndroidArea\AndroidWorkspace\PackageTest\topack\bin\unsign_app.apk -v -u
-z E:\AndroidArea\AndroidWorkspace\PackageTest\topack\bin\resources.ap_
-f E:\AndroidArea\AndroidWorkspace\PackageTest\topack\bin\classes.dex
-rf E:\AndroidArea\AndroidWorkspace\PackageTest\app\src\main\java
参数说明:
-v 构建过程显示log信息
-u 创建一个无签名的包
-z 指定resources.ap_资源路径
-f 指定dex文件路径
-rf 指定源码路径
执行结果:
在.\topack\bin生成unsign_app.apk,该apk还不能安装,提示解析失败,需要签名。
生成密钥
1 | 执行命令: |
对apk签名
1 | 执行命令: |
4字节对齐优化
1 | 执行命令: |
自此,整个apk的打包过程基本完成。