Android项目的编译过程
2018-03-15 本文已影响0人
海重山青
当按下这个绿色的小三角形按钮后,AS
到底对我们的Android
项目做了什么。当然编译之前必须选择要部署apk
的设备。
下面是Gradle Console
窗口打印的日志:
Executing tasks: [:app:assembleDebug]
:app:buildInfoDebugLoader
:app:preBuild UP-TO-DATE
:app:preDebugBuild UP-TO-DATE
:app:compileDebugAidl UP-TO-DATE
:app:compileDebugRenderscript UP-TO-DATE
:app:checkDebugManifest UP-TO-DATE
:app:generateDebugBuildConfig UP-TO-DATE
:app:prepareLintJar UP-TO-DATE
:app:generateDebugResValues UP-TO-DATE
:app:generateDebugResources UP-TO-DATE
:app:mergeDebugResources UP-TO-DATE
:app:createDebugCompatibleScreenManifests UP-TO-DATE
:app:processDebugManifest
:app:splitsDiscoveryTaskDebug UP-TO-DATE
:app:processDebugResources
:app:generateDebugSources
:app:javaPreCompileDebug UP-TO-DATE
:app:compileDebugJavaWithJavac UP-TO-DATE
:app:mergeDebugShaders UP-TO-DATE
:app:compileDebugShaders UP-TO-DATE
:app:generateDebugAssets UP-TO-DATE
:app:mergeDebugAssets UP-TO-DATE
:app:packageInstantRunResourcesDebug UP-TO-DATE
:app:checkManifestChangesDebug
:app:transformClassesWithExtractJarsForDebug UP-TO-DATE
:app:transformClassesWithInstantRunVerifierForDebug UP-TO-DATE
:app:transformClassesWithDependencyCheckerForDebug UP-TO-DATE
:app:compileDebugNdk NO-SOURCE
:app:mergeDebugJniLibFolders UP-TO-DATE
:app:transformNativeLibsWithMergeJniLibsForDebug UP-TO-DATE
:app:processDebugJavaRes NO-SOURCE
:app:transformResourcesWithMergeJavaResForDebug UP-TO-DATE
:app:transformNativeLibsAndResourcesWithJavaResourcesVerifierForDebug UP-TO-DATE
:app:transformClassesWithInstantRunForDebug UP-TO-DATE
:app:transformClassesEnhancedWithInstantReloadDexForDebug UP-TO-DATE
:app:incrementalDebugTasks UP-TO-DATE
:app:preColdswapDebug
:app:fastDeployDebugExtractor UP-TO-DATE
:app:generateDebugInstantRunAppInfo UP-TO-DATE
:app:transformClassesWithInstantRunSlicerForDebug UP-TO-DATE
:app:transformClassesWithDexBuilderForDebug
:app:transformDexArchiveWithExternalLibsDexMergerForDebug
:app:transformDexArchiveWithDexMergerForDebug
:app:validateSigningDebug
:app:transformDexWithInstantRunDependenciesApkForDebug
:app:transformDexWithInstantRunSlicesApkForDebug
:app:packageDebug
:app:buildInfoGeneratorDebug
:app:compileDebugSources UP-TO-DATE
:app:assembleDebug
BUILD SUCCESSFUL in 9s
41 actionable tasks: 13 executed, 28 up-to-date
英语好的,可以把这五十多行看一遍也就了解的差不多了。
我大概总结了下:
- 首先是预编译,如果主
module
依赖了其它module
,那么被依赖的module
也要进行编译。 - 然后是打包资源文件。
- 处理配置清单文件和处理资源文件。
- 编译,源码被编译成字节码。
- 执行所有transform开头的任务。
- 依赖的
library
生成.aar文件,application
生成.apk文件。
可能从日志看不出这些步骤,但这是大致总结。
下面从网上找到这张图片,描述从aapt
工具开始到生成签名apk
文件的过程。
具体过程如下:
- 上图从左上角开始,
aapt
工具执行两次。-
第一次生成R文件,联合源码和
aidl
文件一起进行javac
编译生成.class
文件。- 接着用
dx
工具将.class
文件和库文件生成dex
文件
- 接着用
-
第二次对
res
里面的资源文件进行编译
-
第一次生成R文件,联合源码和
- 最后
APKBuilder
会把DEX
文件与编译好的资源文件进行打包和签名生成最终的APK。