APK的构建过程
每当编译项目的时候,看着AS执行一系列的task并输出一堆build日志,就非常好奇AndroidStudio做了哪些工作?
抽空了解一下Android APK的构建过程,这其中涉及到的内容非常多。应用开发者只需要知道大概的流程,了解一些底层工作原理。不是专业的集成构建开发工程师不需要花时间钻太深,深挖的话每一步都能挖出一本书。
从AndroidStudio官方文档 Android Studio > 用户指南 > 配置构建">Android Studio > 用户指南 > 配置构建,可以看到标准的Android 应用模块构建流程如下:
开发者每次点击build菜单构建项目或者编译Apk的时候,AndroidStudio会自动帮开发者完成打包Apk的一系列操作,Google官方文档将Apk构建分为如下七步(加*的步骤应用开发者应该专门去深入理解):
①AAPT资源编译
使用Android SDK提供用aapt.exe生成R.Java文件。打包资源文件(包括res、assets、androidmanifest.xml等),生成资源包文件resources.arsc。
②生成AIDL阶段*
使用Android SDK提供的aidl.exe将.aidl文件生成相应Java文件。AIDL这方面开发者也是必须要掌握的,java文件的生成以后再看。
③Java/Kotlin编译
使用Jdk的javac命令编译Java源文件生成class文件。项目中如果有使用到Kotlin,还会编译Kotlin。
④dex打(分)包阶段
将class文件打包生成classes.dex文件,使用Android SDK提供的dx.bat将class文件转换成classes.dex文件。
⑤ApkBuilder打包
使用Android SDK提供apkbuilder.bat打包资源和classes.dex文件,生成生成未签名的apk。
⑥JarSigner签名处理*
用jarsinger命令对apk认证,生成signed.apk。
⑦zipAlign对齐优化*
使用zipalign对签名后的apk进行优化处理,对齐处理后通过内存映射访问apk文件会更快。
Apk构建中涉及不同工具的详细流程图如下,参考 Building and Running">Building and Running。

回到开头的问题:编译运行项目时,那一系列的输出对应哪些构建操作?
举个例子:新建一个项目,完整编译过程中输出的build信息如下。通过上面的学习,现在应该能知道下面大部分build信息的含义。
Executing tasks: [:app:assembleRelease] in project D:\code\PowerGroup
//预编译
> Task :app:preBuild UP-TO-DATE
> Task :app:preReleaseBuild UP-TO-DATE
> Task :app:compileReleaseAidl NO-SOURCE
//AIDL编译
> Task :app:compileReleaseRenderscript NO-SOURCE
> Task :app:dataBindingMergeDependencyArtifactsRelease UP-TO-DATE
> Task :app:dataBindingMergeGenClassesRelease UP-TO-DATE
> Task :app:generateReleaseResValues UP-TO-DATE
> Task :app:generateReleaseResources UP-TO-DATE
> Task :app:dataBindingTriggerRelease UP-TO-DATE
//生成BuildConfig
> Task :app:generateReleaseBuildConfig UP-TO-DATE
> Task :app:checkReleaseAarMetadata
> Task :app:createReleaseCompatibleScreenManifests
> Task :app:extractDeepLinksRelease UP-TO-DATE
> Task :app:processReleaseMainManifest
> Task :app:processReleaseManifest
> Task :app:javaPreCompileRelease UP-TO-DATE
> Task :app:mergeReleaseNativeDebugMetadata NO-SOURCE
> Task :app:mergeReleaseShaders UP-TO-DATE
> Task :app:compileReleaseShaders NO-SOURCE
//asset资源整合
> Task :app:generateReleaseAssets UP-TO-DATE
> Task :app:mergeReleaseAssets
> Task :app:compressReleaseAssets UP-TO-DATE
> Task :app:desugarReleaseFileDependencies UP-TO-DATE
> Task :app:processReleaseJavaRes NO-SOURCE
> Task :app:collectReleaseDependencies
> Task :app:sdkReleaseDependencyData
> Task :app:mergeReleaseJniLibFolders UP-TO-DATE
> Task :app:checkReleaseDuplicateClasses
> Task :app:mergeReleaseResources
> Task :app:dataBindingGenBaseClassesRelease UP-TO-DATE
//生成APK中Manifest文件
> Task :app:processReleaseManifestForPackage
//生成R.jar文件
> Task :app:processReleaseResources
//编译Kotlin
> Task :app:compileReleaseKotlin
//编译Java
> Task :app:compileReleaseJavaWithJavac
#注: 某些输入文件使用或覆盖了已过时的 API。
#注: 有关详细信息, 请使用 -Xlint:deprecation 重新编译。
> Task :app:compileReleaseSources
> Task :app:lintVitalRelease
> Task :app:dexBuilderRelease
> Task :app:mergeExtDexRelease
> Task :app:mergeReleaseNativeLibs
> Task :app:stripReleaseDebugSymbols
> Task :app:mergeReleaseJavaResource
//合并.dex文件
> Task :app:mergeDexRelease
//将.dex等文件打包进apk文件中并签名,这里编译的是release版本apk
> Task :app:packageRelease
//使用zipalign对apk进行优化
> Task :app:assembleRelease
//成功构建APK
BUILD SUCCESSFUL in 40s
33 actionable tasks: 21 executed, 12 up-to-date
Build Analyzer results available至此,对Apk的构建流程有一个初步的认识,应用开发者了解一下Apk的构建过程即可,想要了解Apk的构建细节详见更多资料。
更多资料:
Androiddevnotes > the internals of android apk build process
How Android Apps are Built and Run
How does the Android build process work?



