Android APK打包流程详解
??在日常开发过程中,由于IDE提供了良好的可视化操作和便捷的打包签名流程,所以很多人对APK是如何打包的并不十分了解。作为一个有追求的程序猿,我们并不满足只会点点按钮,按部就班。理解apk的打包流程有助于我们加深Android 应用从开发到部署的整个生命周期过程的掌握,也会对Android开发有自己更清晰透彻的认识,本篇着重于介绍这一流程。
Android APK内容介绍 【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的整个编译过程
文章图片
- 首先.aidl(Android Interface Description Language)通过AIDL工具转换成编译器能处理的Java接口文件,如果项目没有用到AIDL则略过这一步骤,工具路径为:
${ANDROID_SDK_HOME}/build-tools/aidl.exe
。
- 资源文件被aapt(Android Asset Packaging Tool)处理为最终的resources.arsc,并生成R.java文件以保证源码编写时可以方便的访问这些资源,aapt工具的路径为
${ANDROID_SDK_HOME}/build-tools/appt.exe
。
- java将生成R.java文件和源代码文件以及上述生成的接口文件统一编译成.class文件。
- 因为class文件并不是Android系统所能识别的格式,所以还要利用dex工具将它们转化成Dalvlik字节码。这个过程还会加入程序所依赖的所有第三方库,
${ANDROID_SDK_HOME}/build-tools/dx.bat
。
- 接下来,系统将会上面生成的dex,资源包,以及其它资源,通过apkbuilder生成初始的apk文件包。注意:此时,apk还没有经过签名和优化。
- 通过签名工具签名,例如Jarsinger等工具。如果在Debug模式下,签名所使用的keystore是系统自带的默认值,否则开发者需要提供自己的私钥来完成签名过程。
- 将签名后的apk通过zipalign进行优化。优化的目的是提高程序的运行和加载速度。基本原理是对apk包中的数据进行边界对齐,从而加快读取和处理过程,zipaligin工具路径为
${ANDROID_SDK_HOME}/tools/zipalign.exe
。
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- Beego打包部署到Linux
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)