平时开发过程中我们通过Android Studio编写完成Android项目之后直接点击 Run ‘app’就可以在build/outputs/apk生成可以在Android设备中安装的apk文件了,那么整个Android源码的构建过程是怎么样的呢?
根据Google官方提供的流程图来具体了解构建的过程:
图中绿色标注为其中用到的相应工具,蓝色代表的是中间生成的各类文件类型。
第一步:打包资源文件,生成R.java文件(使用工具AAPT)
第二步:处理AIDL文件,生成对应的.java文件(没有可以省略,使用工具AIDL)
第三步:编译Java文件,生成对应的.class文件(使用工具Java Compiler)
第四步:把.class文件转化成Davik VM支持的.dex文件(使用工具dex)
第五步:打包生成未签名的.apk文件(使用工具apkbuilder)
第六步:对未签名.apk文件进行签名(使用工具Jarsigner)
第七步:对签名后的.apk文件进行对齐处理,不进行对齐处理不能发布到Google Market(使用工具zipalign)
我们也可以通过打开gradle assembleRelease,看看Task的执行代码
Task的执行如下:
16:49:13: Executing task 'assembleRelease'...
Executing tasks: [assembleRelease]
:ZDB:preBuild UP-TO-DATE
:ZDB:preReleaseBuild UP-TO-DATE
:ZDB:compileReleaseAidl UP-TO-DATE
:ZDB:compileReleaseRenderscript UP-TO-DATE
:ZDB:checkReleaseManifest UP-TO-DATE
:ZDB:generateReleaseBuildConfig UP-TO-DATE
:ZDB:prepareLintJar UP-TO-DATE
:ZDB:mainApkListPersistenceRelease UP-TO-DATE
:ZDB:generateReleaseResValues UP-TO-DATE
:ZDB:generateReleaseResources UP-TO-DATE
:ZDB:mergeReleaseResources UP-TO-DATE
:ZDB:createReleaseCompatibleScreenManifests UP-TO-DATE
:ZDB:processReleaseManifest UP-TO-DATE
:ZDB:splitsDiscoveryTaskRelease UP-TO-DATE
:ZDB:processReleaseResources UP-TO-DATE
:ZDB:generateReleaseSources UP-TO-DATE
:ZDB:javaPreCompileRelease UP-TO-DATE
:ZDB:compileReleaseJavaWithJavac UP-TO-DATE
:ZDB:compileReleaseNdk NO-SOURCE
:ZDB:compileReleaseSources UP-TO-DATE
:ZDB:lintVitalRelease
:ZDB:mergeReleaseShaders UP-TO-DATE
:ZDB:compileReleaseShaders UP-TO-DATE
:ZDB:generateReleaseAssets UP-TO-DATE
:ZDB:mergeReleaseAssets UP-TO-DATE
:ZDB:transformClassesWithDexBuilderForRelease UP-TO-DATE
:ZDB:transformClassesWithMultidexlistForRelease UP-TO-DATE
:ZDB:transformDexArchiveWithDexMergerForRelease UP-TO-DATE
:ZDB:mergeReleaseJniLibFolders UP-TO-DATE
:ZDB:transformNativeLibsWithMergeJniLibsForRelease UP-TO-DATE
:ZDB:processReleaseJavaRes NO-SOURCE
:ZDB:transformResourcesWithMergeJavaResForRelease UP-TO-DATE
:ZDB:packageRelease UP-TO-DATE
:ZDB:assembleRelease
BUILD SUCCESSFUL in 4s
26 actionable tasks: 1 executed, 25 up-to-date
16:49:18: Task execution finished 'assembleRelease'.
弄明白这些,对APK的构建原理就有了一个大概的认识了。