parent
2ebae3778f
commit
27d8cd2ac6
@ -0,0 +1,81 @@ |
|||||||
|
--- |
||||||
|
Android APK 构建流程以及 APK 安装流程 |
||||||
|
--- |
||||||
|
|
||||||
|
#### 目录 |
||||||
|
|
||||||
|
1. 思维大图 |
||||||
|
2. 前言 |
||||||
|
3. 构建流程 |
||||||
|
4. 安装流程 |
||||||
|
|
||||||
|
#### 思维导图 |
||||||
|
|
||||||
|
#### 前言 |
||||||
|
|
||||||
|
本篇文章大量摘自 [Apk 打包流程梳理](https://juejin.im/entry/58b78d1b61ff4b006cd47e5b) 以及其文章中的参考文章,我觉得你只要把那篇文章及其参考文看完,熟悉 APK 构建流程和安装流程完全不在话下。 |
||||||
|
|
||||||
|
当然,看完文章之后,你可以试试自己画一下构建流程图。 |
||||||
|
|
||||||
|
本篇主要用来记录学习过程,再次感谢大佬们的分享精神~ |
||||||
|
|
||||||
|
#### 构建流程 |
||||||
|
|
||||||
|
先来一张 [Android 配置构建]() 官网上的一张图: |
||||||
|
|
||||||
|
![](https://i.loli.net/2019/05/07/5cd1888bcfafa.png) |
||||||
|
|
||||||
|
这个新版的图,比较好理解,就不过阐述了,我还是喜欢老版的经典构建图: |
||||||
|
|
||||||
|
![](https://i.loli.net/2019/05/07/5cd14ad86262c.png) |
||||||
|
|
||||||
|
从上面的流程图,我可以看出 APK 构建流程可以分为以下七步: |
||||||
|
|
||||||
|
1. 通过 aapt 打包 res 资源文件,生成 R.java、resources.arsc 和 res 文件(二进制和非二进制) |
||||||
|
2. 处理 .aidl 文件,生成对应的 Java 接口文件 |
||||||
|
3. 通过 Java Compiler 编译 R.java、Java 接口文件、Java 源文件,生成 .class 文件 |
||||||
|
4. 通过 dx/d8 工具,将 .class 文件和第三方库中的 .class 文件处理生成 classes.dex |
||||||
|
5. 通过 apkbuilder 工具,将 aapt 生成的 resources.arsc 和 res 文件、assets 文件和 classes.dex 一起打包生成 apk |
||||||
|
6. 通过 Jarsigner 工具,对上面的 apk 进行 debug 或 release 签名 |
||||||
|
7. 通过 zipalign 工具,对签名后的 apk 进行对齐处理 |
||||||
|
|
||||||
|
##### 第一步:aapt |
||||||
|
|
||||||
|
aapt(Android Asset Packaging Tool),用于打包资源文件,生成 R.java 和编译后的资源。aapt 的源码位于 frameworks/base/tools/aapt2 目录下。 |
||||||
|
|
||||||
|
##### 第二步:aidl |
||||||
|
|
||||||
|
用于处理 aidl 文件,源码位于 frameworks/base/tools/aidl。输入 aidl 后缀的文件,输出可用于进程通信的 C/S 端 Java 代码,位于 build/generated/source/aidl。 |
||||||
|
|
||||||
|
##### 第三步:Java 源码编译 |
||||||
|
|
||||||
|
有了 R.java 和 aidl 生成的 Java 文件,再加上工程的源代码,现在就可以使用 javac 进行正常的 java 编译生成 class 文件了。 |
||||||
|
|
||||||
|
输入:java source 的文件夹(另外还包括了 build/generated 下的:R.java,aidl 生成的 Java 文件以及 BuildConfig.java) |
||||||
|
|
||||||
|
输出:对于 gradle 编译,可以在 build/intermediates/classes 里,看到输出的 class 文件。 |
||||||
|
|
||||||
|
##### 第四步:dex |
||||||
|
|
||||||
|
使用 dx/d8 工具将 class 文件转化为 dex 文件,生成常量池,消除冗余数据等。 |
||||||
|
|
||||||
|
##### 第五步:apkbuilder |
||||||
|
|
||||||
|
打包生成 APK 文件,现在都已经通过 sdklib.jar 的 ApkBuilder 类进行打包了,输入为我们之前生成的包含 resources.arsc 的 .ap_ 文件,上一步生成的 dex 文件,以及其他资源如 jni、jar 包内的资源。 |
||||||
|
|
||||||
|
##### 第六步:Jarsigner |
||||||
|
|
||||||
|
对 apk 文件进行签名,APK 需要签名才能在设备上进行安装。现在不仅可以使用 jarsigner,还可以使用 apksigner。 |
||||||
|
|
||||||
|
##### 第七步:zipalign |
||||||
|
|
||||||
|
对签名后的 apk 文件进行对齐处理,使得 apk 中所有资源文件距离文件起始偏移为四个字节的整数倍,从而在通过内存映射访问 apk 文件时会更快。 |
||||||
|
|
||||||
|
需要注意的,使用不同的签名工具对对齐是有影响的。如果使用 jarsigner,则只能在 APK 文件签名后执行 zipalign;如果使用 apksigner,则只能在 APK 文件签名之前执行 zipalign。 |
||||||
|
|
||||||
|
详见官网描述:[zipalign](https://developer.android.com/studio/command-line/zipalign) |
||||||
|
|
||||||
|
#### 安装流程 |
||||||
|
|
||||||
|
#### 参考 |
||||||
|
|
@ -0,0 +1,9 @@ |
|||||||
|
--- |
||||||
|
读书笔记之二 |
||||||
|
--- |
||||||
|
|
||||||
|
#### 目录 |
||||||
|
|
||||||
|
1. 思维导图 |
||||||
|
2. |
||||||
|
|
After Width: | Height: | Size: 54 KiB |
After Width: | Height: | Size: 87 KiB |
Loading…
Reference in new issue