Skip to content

APK的打包流程

zhpanvip edited this page Feb 19, 2021 · 4 revisions

APK中包含的内容

1.resources.arsc:包含了所有资源文件的映射,可以理解为索引,通过该文件能找到对应的资源文件信息

2.AndroidManifest.xml:Project中AndroidManifest.xml编译后得到的二进制xml文件

3.META-INF:主要保存各个资源文件的SHA1 hash值,用于校验资源文件是否被篡改,防止二次打包时资源文件被替换,该目录下主要包括下面三个文件:

  • CERT.RSA:保存签名和公钥证书
  • MANIFEST.MF:保存版本号以及对每个文件(包括资源文件)整体的SHA1 hash
  • CERT.SF:保存对每个文件头3行的SHA1 hash
  • res:Project中res目录下资源文件编译后得到的二进制xml文件

3.classes.dex:Dex是DalvikVM executes的缩写,即Android Dalvik执行程序

4.lib:对应Project中的libs目录,包含.so文件。因为本项目为新建项目,没有libs目录,所以解压APK也没有lib

打包APK用到的工具

在APK编译打包过程中,用到了以下工具,这些工具大部分位于Android SDK的build-tools目录下:

1.aapt:全称Android Asset Packaging Tool,即Android资源打包工具

2.aidl:将.aidl文件转换为.java文件的工具

3.Java Compiler:java编译器,将.java文件转换为.class文件的工具,运行命令javac

4.dex:将.class文件转换为Davik VM能识别的.dex文件的工具,运行命令dx

5.apkbuilder:生成APK的工具

6.Jarsigner:.jar文件的签名工具

7.zipalign:字节码对齐工具

打包流程

                     (方形:表示文件,椭圆:表示工具及操作)

上面这张图,显示了更为详细的构建流程。以虚线为界,前半部分描述了 编译流程 ,后半部分则描述了 打包流程。

下面具体分析构建流,分为七步(其中编译1-4、打包5-7):

    1、使用__aapt__工具,编译res/文件,生成编译后的二进制资源文件(.ap_文件)、R.java文件。(目前新版使用aapt2工具,R.java也替换成了R.jar)

    2、使用__aidl__工具,根据aidl文件生成对应的Java接口文件

    3、使用__Java Compiler__工具,Java Compiler(俗称javac)将R.java、项目中的代码、Aidl接口文件编译成.class文件。

    4、使用__dex__工具,将上一步产生的.class文件和第三方依赖中的.class编译成.dex文件。(目前新版使用d8工具)

    5、使用__apkbuilder__工具,将编译后的资源(.ap_文件)、dex文件及其他资源文件(例如:so文件、asset文件等),压缩成一个.apk文件。

    6、使用__Jarsigner__工具,读取签名文件,对上一步中产生的apk文件进行签名,生成一个已签名的apk文件。

    7、使用__zipalign__工具,对已签名的apk文件进行体积优化(只有v1签名才有这一步,v2签名的apk会在zipalign后签名被破坏)。

公众号:玩转安卓Dev

Java基础

面向对象与Java基础知识

Java集合框架

JVM

多线程与并发

设计模式

Kotlin

Android

Android基础知识

Android消息机制

Framework

View事件分发机制

Android屏幕刷新机制

View的绘制流程

Activity启动

性能优化

Jetpack&系统View

第三方框架实现原理

计算机网络

算法

其它

Clone this wiki locally