不关是Android 客户端还是Android SDK等,在平时工作的时候都会遇到过生成Apk的时候,用AS的话的确是一键就可以生成一个Apk,但是很多小伙伴还不知道从代码到一个Apk文件这中间到底经历了什么,接下来我们就大致说说,先上一张官方的图:
这里先大致讲一下图中涉及到的一些工具:
工具 | 用处 |
---|---|
aapt | Android的资源打包工具 |
aidl | 用于将Android的接口语言转换成.java的工具 |
javac | Java Compiler |
dex | 将.class文件转换成Davik VM能识别的.dex文件 |
apkbuilder | 用于生成一个不带签名的Apk |
jarsigner | Apk签名工具 |
zipalign | 字节码对齐工具 |
大致的一个流程:
- 用aapt将Android的一些资源(Resource资源、assets文件、AndroidManifest.xml文件等)转换成R.Java文件(生成的R文件在gen目录下)
- 将AIDL文件通过aidl工具转换成对应的.java文件
- 然后通过javac工具把.java文件转换成对应的.class文件
- 然后用javac将.class文件转换成Davik VM支持的dex文件
- 通过apkbuilder打包成圣一个不带签名文件的Apk
- 使用jarsigner对apk文件进行签名(签名后才能安装到手机上)
- 用zipalign对签名后的.apk文件进行对齐处理
Android7.0之后引入了APK Signature Scheme v2,这里要说一下Android 的V1签名和V2签名的区别:
V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。
V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间,从而加快应用安装速度。
v1和v2的签名使用
1)只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式
2)只勾选V2签名7.0以下安装不了,7.0以上则使用了V2的方式验证
3)同时勾选V1和V2则所有机型都没问题
开发者可以在build.gradle文件中标明使用哪种签名进行打包