我爱编程

Android的Apk打包流程

2018-04-16  本文已影响179人  木有粗面_9602

1.概况

解压了一个普通的apk文件,解压出来的文件如下:


image.png

classes.dex 是.dex文件。
resources.arsc是resources resources文件。
AndroidManifest.xml是AndroidManifest.xml文件。
res是uncompiled resources。
META-INF是签名文件夹。

MANIFEST.MF文件
版本号以及每一个文件的哈希值(BASE64)。包括资源文件。这个是对每个文件的整体进行SHA1(hash)。

Manifest-Version: 1.0
Built-By: Generated-by-ADT
Created-By: Android Gradle 2.2.0
Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo=
Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY=
……

CERT.SF
这个是对每个文件的头3行进行SHA1 hash。


Signature-Version: 1.0
X-Android-APK-Signed: 2
SHA1-Digest-Manifest: QxOfCCAuQtZnHh0YRNnoxmiHT80=
Created-By: 1.0 (Android)
Name: res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png
SHA1-Digest: I9s6aQ5VyOLrNo4odqSij549Oyo=
Name: res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png
SHA1-Digest: D6dilO+UMcglambujyMOhNbLZuY=
……

CERT.RSA
这个文件保存了签名和公钥证书。

2. 具体打包过程

image.png

2.1 aapt阶段

Resources res = getResources();  
InputStream is = res .openRawResource(R.raw.filename);  

--values。这类资源以XML文件保存在res/values目录下,用来描述一些简单值,例如,数组、颜色、尺寸、字符串和样式值等,一般来说,这六种不同的值分别保存在名称为arrays.xml、colors.xml、dimens.xml、strings.xml和styles.xml文件中。
--xml。这类资源以XML文件保存在res/xml目录下,一般就是用来描述应用程序的配置信息。

这就是R.java的源代码,里面拥有很多个静态内部类,比如layout,string等。
每当有这种资源添加时,就在R.java文件中添加一条静态内部类里的静态常量类成员,且所有成员都是int类型。


image.png

里面的资源可以有两种方法引用:
1.在java程序中引用资源按照java的语法来引用即:R.resource_type.resource_
name注意:resource_name不需要文件的后缀名
2.在XML文件中引用资源格式:@[package:]type/nam

resources.arsc这个文件记录了所有的应用程序资源目录的信息,包括每一个资源名称、类型、值、ID以及所配置的维度信息。我们可以将这个resources.arsc文件想象成是一个资源索引表,这个资源索引表在给定资源ID和设备配置信息的情况下,能够在应用程序的资源目录中快速地找到最匹配的资源。

2.2 aidl阶段

2.3 Java Compiler阶段

2.4 dex阶段

2.5 apkbuilder阶段

2.6 Jarsigner阶段

参考链接:
https://www.jianshu.com/p/7c288a17cda8

上一篇 下一篇

猜你喜欢

热点阅读