Android基础之编译打包签名流程
Android编译打包的步骤如下:
1.生成R.java文件
2.将aidl文件生成java文件
3.将java文件编译成class文件
4.将class文件打包成classes.dex文件
5.打包资源文件(res、assets、AndroidManifest.xml等)
6.生成未签名的apk文件
7.对apk进行签名
KeyStore文件
给应用签名需要用到一个签名文件,即keystore文件,后缀是 .jks
1.keystore文件内容:秘钥库类型、秘钥库提供方、别名、创建日期、条目类型、证书链长度、证书(所有者、发布者、***、有效期、证书指纹),其中证书指纹包括MD5、SHA1、SHA256、签名算法名称、版本。
2.如何查看keystore里面的内容
keytool -list -v -keystore xxx.jks
其中xxx.jks是你的keystore文件,以上命令是在keystore文件当前目录执行
3.内容截图
APK文件里面的内容
1.META-INF目录:该目录下存放签名后的CERT.RSA CERT.SF 和 MANIFEST.MF 以及一个services目录,services目录是干嘛的大家可以查阅 Java SPI相关知识点
2.res目录:该目录下存放Android各种原始资源,包括anim、drawable、layout、menu、mipmap、xml等。xml文件在Android N上将私有目录暴露出来的时候会用到
3.lib 目录:lib目录下存放的是一些so文件(有些时候为了验证so有没有被编译出来,我们可以通过打包,解压查看lib下有没有对应的so文件)
4.content-provider.ftl:Android N新特性里面权限操作相关内容
5.resources.arsc:所有本地资源的编译产物,就是一个资源映射文件
6.AndroidManifest.xml:编码后的AndroidManifest.xml
7.classes.dex:编译后的class文件被dx转成成Dalvik虚拟机可识别的字节码文件
Android签名
Android签名就是用来保证文件的完整性以及有效性,防止文件被篡改,Android签名采用非对称加密算法,用KeyStore文件里面的私钥进行文件内容的加密,校验的时候用公钥进行解密。而直接对apk内容进行加密的话,apk内容太多,所以会先对apk文件里面的文件进行一个摘要处理。
1.MANIFEST.MF:这个是摘要文件。apk签名的时候会遍历apk里面的所有文件,对非文件夹非签名文件的文件、逐一生成SHA1值(摘要信息),在用Base64进行编码,如果你改变了apk里面的某个文件,那么该文件的SHA1值自然和MANIFEST.MF里面的对不上,校验自然而然不会通过
2.CERT.SF:这个是摘要的签名文件。对上面生成的MANIFEST.MF,对MANIFST.MF中的每一条内容分别计算SHA1值,然后再进行Base64编码。此外,把整个MANIFEST.MF的内容进行SHA1值计算,并进行Base64编码,然后将上述内容写入CERT.SF文件中(这样如果MANIFEST.MF被篡改了,就跟CERT.SF里面的摘要对不上,自然校验也不会通过)
3.CERT.RSA文件:CERT.RSA文件中保存了KeyStore中的证书(公钥)、所采用的加密算法等信息,同时还包括对CERT.SF中的内容用私钥进行加密之后的值
总结:Android签名的时候先对apk文件进行摘要处理,所有文件对应的SHA1值会存放在META-INFO下面的MANIFEST.MF文件中;然后再对MANIFEST.MF中的每一条内容以及整个文件进行SHA1值计算存放在CERT.SF中;最后将Keystore中的公钥、所采用的加密算法等信息以及对CERT.SF用私钥加密后的值存入CERT.RSA中
参考资料
1.https://blog.****.net/xiqingnian/article/details/27338677