打包流程
- aapt工具将所有的资源文件生成二进制文件,R.java文件和resource.asc索引文件
- aidl工具将所有的aidl文件生成.java文件
- javac 将所有的.java文件生成.class文件
- dextool工具将.class文件生成dex文件
- apkbuilder将资源文件、dex文件、so库打包成未签名的apk文件
- zipalign tool将apk中未压缩的资源文件按4字节对齐,加快cpu读取速度。
- apksigner将apk文件签名
签名流程
- 将apk中所有的文件生成消息摘要,生成Mainifest.SF文件(SHA1 + base64编码)
- 将Manifest.SF文件中每项用 SHA1 + base64编码 生成 CERT.SF文件
- 将CERT.SF文件的摘要信息通过私钥 rsa加密生成签名,同时将签名、公钥信息、数字证书一起打包到CERT.RSA中
注意:Android的签名机制,并不保证外界不对文件本身做修改,而是防止被篡改。CERT.SF文件可以保证Manifest.SF文件不被篡改,CERT.RSA文件又可保证CERT.SF文件不被篡改,而公钥和私钥又是一对的,唯一的私钥在开发者的手上。
校验流程
- 确认证书文件.RSA和校验签名文件.SF没有被更改过
- 使用.SF文件判断Manifest.SF文件没有被篡改过
- 保证apk所有文件对应的摘要值与Manifest.SF文件保持一致
安装流程
拷贝apk至指定目录下,一般app安装到/data/app下,解析AndroidManifest文件,检验apk是否被篡改过,如果被篡改过则提示安装失败,则进入下一流程,将dex拷贝到 /data/dalvik-cache下,并调用守护进程installd做dex优化,如果是art虚拟机则直接生成机器码,然后会AndroidManifest文件的内容解析至内存中(mSettings),分配权限uid,gids,向pms注册组件,并发送广播,在launcher创建快捷方式。
后面有时间会从源码角度分析下安装流程