Android APK打包流程详解

  在日常开发过程中,由于IDE提供了良好的可视化操作和便捷的打包签名流程,所以很多人对APK是如何打包的并不十分了解。作为一个有追求的程序猿,我们并不满足只会点点按钮,按部就班。理解apk的打包流程有助于我们加深Android 应用从开发到部署的整个生命周期过程的掌握,也会对Android开发有自己更清晰透彻的认识,本篇着重于介绍这一流程。


Android APK内容介绍

以apk为后缀的文件是Android 应用程序的标准格式。它其实是一个zip压缩包。所以可用解压工具winRaR等解压出来。可以看到,一个典型的apk应用程序通常包含以下几部分内容:

    ├─AndroidManifest.xml
    ├─classes.dex
    ├─resources.arsc
    ├─res
    │  ├─anim
    │  ├─color
    │  ├─drawable
    │  ├─layout
    │  └─menu
    ├─META-INF
    │  ├─MANIFEST.MF
    │  ├─CERT.RSA
    │  └─CERT.SF

下面对几个重要的组成部分,加以说明。
AndroidManifest.xml

记录了应用程序的名称,权限声明,所包含的组件等一系列信息。直接从apk解压出来的AndroidMainifest文件无法打开,因为发布时做了加密保护处理。

classes.dex
它是apk应用的核心,由项目源码生成的.class文件。进一步转化成Android系统可以识别的Dalvik 二级制代码。

resources.arsc

编译过后的资源文件。

res
未编译的资源文件。

META-INF

用于保存应用程序的签名和校验信息,以保证程序的完整性。生成apk包时,系统会对包中的所有内容做一次校验,然后将结果保存在这里。设备在安装这一应用程序时,还会对内容在做一次校验,并和META-INF的值进行比对,以避免程序包被恶意篡改,这就是为什么只简单通过替换文件二次打包,程序不能正常安装的原因。

APK打包流程

下图描述了APK的整个编译过程

Android APK打包流程详解_第1张图片

  1. 首先.aidl(Android Interface Description Language)通过AIDL工具转换成编译器能处理的Java接口文件,如果项目没有用到AIDL则略过这一步骤,工具路径为:${ANDROID_SDK_HOME}/build-tools/aidl.exe

  2. 资源文件被aapt(Android Asset Packaging Tool)处理为最终的resources.arsc,并生成R.java文件以保证源码编写时可以方便的访问这些资源,aapt工具的路径为
    ${ANDROID_SDK_HOME}/build-tools/appt.exe

  3. java将生成R.java文件和源代码文件以及上述生成的接口文件统一编译成.class文件。

  4. 因为class文件并不是Android系统所能识别的格式,所以还要利用dex工具将它们转化成Dalvlik字节码。这个过程还会加入程序所依赖的所有第三方库,${ANDROID_SDK_HOME}/build-tools/dx.bat

  5. 接下来,系统将会上面生成的dex,资源包,以及其它资源,通过apkbuilder生成初始的apk文件包。注意:此时,apk还没有经过签名和优化。

  6. 通过签名工具签名,例如Jarsinger等工具。如果在Debug模式下,签名所使用的keystore是系统自带的默认值,否则开发者需要提供自己的私钥来完成签名过程。

  7. 将签名后的apk通过zipalign进行优化。优化的目的是提高程序的运行和加载速度。基本原理是对apk包中的数据进行边界对齐,从而加快读取和处理过程,zipaligin工具路径为 ${ANDROID_SDK_HOME}/tools/zipalign.exe

你可能感兴趣的:(Android)