resources.arsc 编译后的二进制资源文件。
classes.dex
是
.dex
文件。最终生成的
Dalvik
字节码
AndroidManifest.xml
程序的全局清单配置文件
res
是
uncompiled resources
。存放资源文件的目录。
META-INF
是签名文件夹。 存放签名信息
MANIFEST.MF
(清单文件):其中每一个资源文件都有一个
SHA-256-Digest
签名,MANIFEST.MF文件的 SHA256(SHA1)并
base64
编码的结果即为
CERT.SF
中的
SHA256-Digest-Manifest
值。
CERT.SF(待签名文件):除了开头处定义的SHA256
(
SHA1
)
-Digest-Manifest
值,后面几项的值是对 MANIFEST.MF文件中的每项再次
SHA256
并
base64
编码后的值。
CERT.RSA
(签名结果文件):其中包含了公钥、加密算法等信息。首先对前一步生成的
MANIFEST.MF
使用了 SHA256(
SHA1
)
-RSA
算法,用开发者私钥签名,然后在安装时使用公钥解密。最后,将其与未加密的摘要信息 (MANIFEST.MF
文件)进行对比,如果相符,则表明内容没有被修改。
具体打包过程
1.aapt
打包资源文件生成
R.java
文件;
aidl
生成
java
文件
2.
将
java
文件编译为
class
文件
3.将工程及第三方的 class 文件转换成
dex
文件
4.将
dex
文件、
so
、编译过的资源、原始资源等打包成
apk
文件
5.签名
6.资源文件对 齐,减少运行时内存
通过
AAPT
工具进行资源文件 打包,生成
R.java
、
resources.arsc
和
res
文件
通过
AIDL
工具处理
AIDL
文件,生成对应的
Java
接口文件。
通过
Java Compiler
编译
R.java
、
Java
接口文件、
Java
源文件,生成
.class
文件。
通过
dex
命令,将
.class
文件和第三方库中的
.class
文件处理生成
classes.dex
,该过程主要完成
Java
字节码转换成
Dalvik
字节码,压缩常量池以及清除冗余信息等工作。
通过
ApkBuilder
工具将资源文件、
DEX
文件打包生成
APK
文件。
通过
Jarsigner
工具,利用
KeyStore
对生成的
APK
文件进行签名。
assets
和
res/raw:
这两个文件目录里的文件都会直接在打包
apk
的时候直接打包到
apk
中,携带在应用里面供应用访问,而且不会被编 译成二进制;
他们的不同点在于:
1
、
assets
中的文件资源不会映射到
R
中,而
res
中的文件都会映射到
R
中,所以
raw
文件夹下的资源都有对应的
ID;
2
、
assets
可以能有更深的目录结构,而
res/raw
里面只能有一层目录;
3
、资源存取方式不同,
assets
中利用
AssetsManager
,而
res/raw
直接利用
getResource()
,
openRawResource(R.raw.fileName),
很多人认为是
R.id.filename,
其实正确的是
R.raw.filename,
就像 R.drawable.filename一样,整体表示一个
ID
值,并非是
R.id.filename;