Android 资源、代码打包 && 签名过程&&资源查找过程

Android 资源、代码打包 && 签名过程
Android APK安装过程
Android 多渠道打包

打包过程

在这里插入图片描述
大致流程

  1. 利用aapt打包res资源文件,生成R.java、resources.arsc和res(二进制 & 非二进制 raw和图片保持原样)
  2. 处理.aidl文件,生成对应的Java接口文件
  3. 利用Java SDK 的Compiler编译R.java 、Java接口文件、Java源文件,生成对应的一个个.class文件
  4. 利用Android SDK的dx.bat将一个个的.class文件和三方库中的.class文件处理生成classes.dex
  5. 利用apkbuilder将resources.arsc和res文件、assets文件、classes.dex一起打包生成apk
  6. 利用jarsigner或signapk对apk文件进行debug或release签名
  7. 利用zipalign工具,将签名后的apk进行对齐处理

android的打包大致可以分为资源的打包和代码的打包,以及签名

资源打包过程

AssetManager用于管理Android应用程序的资源,主要分为两大类:

  • assets:该目录下的文件会保存原始的文件打包到apk中,通过AssetManager来获取这部分的资源
  • res:这部分文件包括animator、anim、color、drawable、layout、menu、raw、values、xml九种。res下的所有文件都将生成一个资源id,保存在R.java中,应用程序通过资源id来进行访问。除了raw和drawable其他均为xml格式,都将编译成二进制的xml文件,同时生成一个resources.arsc文件作为资源索引表,关联R.java中常量对应的资源位置,一起打包进apk。
    PS:AndroidManifest.xml也一样会编译成二进制的xml文件打包进apk中

应用资源编译和打包过程

  1. 解析AndroidManifest.xml;获得包名,创建ResourceTable对象(该对象会保存所有资源信息)
  2. 添加被引用的资源包;至少包括应用本身的资源包和系统资源包(不同类型的资源,其id会是会有区分度的)
  3. 收集资源文件;aapt会创建一个AaptAssets对象来收集drawable、layout、values三种资源文件
  4. 将AaptAssets收集到的drawable、layout添加到上述的ResourceTable对象中
  5. 编译values类资源
  6. 为values的特殊资源分配id;比如android:orientation这个自定义的属性、style、plurals、array等类型的资源
  7. 编译xml资源文件;除了values类资源其他所有xml资源文件都将在这步编译成二进制xml文件
  8. 生成资源符号;如R.string.start_in_process出现次序是3,则其资源符号为0x7f050002,其中0x7f表示Package ID,05表示string的Type ID,0002则是次序。
  9. 生成资源索引表;所有资源文件都在ResourceTable对象中记录,根据这个对象生成资源索引表
  10. 编译AndroidManifest.xml文件;编译成二进制的xml文件
  11. 生成R.java文件
  12. 打包APK

代码打包过程

大致流程:

  1. 用Java SDK 将.java文件编译成一个个的.class文件,Java的步骤(使用javac命令)
  2. 用Android SDK将多个.class文件编译成一个.dex文件,Android的优化

签名机制

数据摘要

消息摘要算法(Message Digest Algorithm)是一种能产生特殊输出格式的算法,其原理是根据一定的运算规则对原始数据进行某种形式的信息提取,被提取出的信息就被称作原始数据的消息摘要。
特点有:
1)无论输入的消息有多长,计算出来的消息摘要的长度总是固定的。例如应用MD5算法摘要的消息有128个比特位,用SHA-1算法摘要的消息最终有160比特位的输出。
2)一般来说(不考虑碰撞的情况下),只要输入的原始数据不同,对其进行摘要以后产生的消息摘要也必不相同,即使原始数据稍有改变,输出的消息摘要便完全不同。但是,相同的输入必会产生相同的输出。
3)具有不可逆性,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的原始消息。

签名文件和证书

数字签名是为了保障通信的可靠性,解决以下两个问题
①要确定消息的来源确实是其申明的那个人?
②要保证信息在传递的过程中不被第三方篡改,即使被篡改了,也可以发觉出来?
解决方案:
发送方生成一对公私钥,公钥交给消息接收方。
发送方发送消息:对要发送的原始消息提取消息摘要。再用私钥加密该摘要。
接收方收到消息:
a.对附加上的那段数字签名,使用预先得到的公钥解密。(确认消息来源)
b.对原始消息部分提取消息摘要,注意这里使用的消息摘要算法要和发送方使用的一致(确认消息未被篡改)

数字证书主要是用来解决公钥的安全发放问题。
数字证书内容包含

证书的发布机构(Issuer)
证书的有效期(Validity)
消息发送方的公钥
证书所有者(Subject)
数字签名所使用的算法
数字签名

数字签名由有公信力的机构签名。
发送方提交公钥到有公信力的机构,接收方向公信力机构获取公钥(该过程也是数字签名的,只不过公信力机构的公钥设备出厂的时候就已经有了)

jarsign和signapk

jarsign+keystore 是 Java自带的,可对jar进行签名。keystore即私钥
signapk + pk8,x509.pem 是专门对Android程序进行签名的。
keystore和pk8,x509.pem可以互转,二者没有本质差别。

使用微信SDK等第三方SDK时,需要我们上传MD5或者SHA1,这个就是私钥keystore的摘要了。

在这里插入图片描述

那么签名都做了啥呢?
1、对Apk中的每个文件做一次算法(数据摘要+Base64编码),保存到MANIFEST.MF文件中
2、对MANIFEST.MF整个文件做一次算法(数据摘要+Base64编码),存放到CERT.SF文件的头属性中,在对MANIFEST.MF文件中各个属性块做一次算法(数据摘要+Base64编码),存到到一个属性块中。
3、对CERT.SF文件做签名,内容存档到CERT.RSA中

最后

最终将资源打包部分经过编译的res、不做处理的assets、资源索引文件resources.arsc以及代码打包生成的classes.dex打包进apk中;META-INF则是签名部分的产物。

Apk打包流程梳理


资源查找过程

Android资源有两大类res和assets,这两类资源获取的时候分别通过Resources类和AssetMnager类来获取,其中Resources通过资源ID来寻找(其实Resources也是通过资源ID+资源索引表定位到文件位置再通过AssetManager来获取资源的),AssetManager通过文件名。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值