系列文章:
前言
我們知道在Android Studio中點(diǎn)擊運(yùn)行按鈕(下圖中的Run)即可對(duì)編寫的代碼進(jìn)行編譯疫向,打包(生成APK)煤蚌,安裝APK到目標(biāo)設(shè)備,運(yùn)行APP舷礼。這一系列流程背后都是Gradle這個(gè)構(gòu)建工具幫我們?cè)谧龉ぷ骶槌梗嘘P(guān)Gradle的基本知識(shí)已經(jīng)在Android Gradle原理解釋一文中做了很多介紹。
本文我們換個(gè)角度妻献,從點(diǎn)擊按鈕這一行為出發(fā)來(lái)研究背后的具體流程和原理蛛株。除了Run按鈕外,還有build育拨,Apply Changes谨履, Debug等按鈕也做了類似工作,但應(yīng)用場(chǎng)景不同熬丧。
build按鈕:對(duì)應(yīng)的是Make Project笋粟,編譯Project下所有Module,一般是自上次編譯后Project下有更新的文件析蝴,不生成apk害捕。
Apply Changes按鈕:將代碼和資源更改推送到正在運(yùn)行的應(yīng)用,而無(wú)需重啟應(yīng)用(在某些情況下闷畸,無(wú)需重啟當(dāng)前 Activity)尝盼,是Instant Run功能的替代者。
Debug按鈕:在調(diào)試模式下部署應(yīng)用佑菩,在調(diào)試模式下運(yùn)行應(yīng)用可在代碼中設(shè)置斷點(diǎn)盾沫、在運(yùn)行時(shí)檢查變量和對(duì)表達(dá)式求值裁赠,以及運(yùn)行調(diào)試工具
Run按鈕背后流程
Run背后的Gradle tasks
Gradle生命周期分為三個(gè)階段,分別是Initialization(初始化階段)疮跑,Configuration(配置階段)组贺,和Execution(執(zhí)行階段),而執(zhí)行階段會(huì)執(zhí)行一系列task祖娘,進(jìn)行主要的構(gòu)建工作。
那么自然Run按鈕背后的構(gòu)建工作也是由一系列task組成的啊奄,那么我們有辦法去查看這些task都有哪些么渐苏?Android Studio提供了強(qiáng)大的日志記錄功能,主要需要進(jìn)行以下3步工作:
- 點(diǎn)擊View > Tool Windows > Build菇夸,將在Android Studio界面下方顯示Build過(guò)程琼富;
- 點(diǎn)擊右下角的EventLog按鈕
- 點(diǎn)擊Run按鈕
完成上述點(diǎn)擊后,等待APK安裝并運(yùn)行完成庄新,可以在Android Studio界面下方見(jiàn)到如下日志:
Tasks名稱:
> Task :app:preBuild UP-TO-DATE
> Task :app:preDebugBuild UP-TO-DATE
> Task :app:generateDebugBuildConfig UP-TO-DATE
> Task :app:javaPreCompileDebug UP-TO-DATE
> Task :app:mainApkListPersistenceDebug UP-TO-DATE
> Task :app:compileDebugRenderscript NO-SOURCE
> Task :app:compileDebugAidl NO-SOURCE
> Task :app:generateDebugResValues UP-TO-DATE
> Task :app:generateDebugResources UP-TO-DATE
> Task :app:mergeDebugResources UP-TO-DATE
> Task :app:createDebugCompatibleScreenManifests UP-TO-DATE
> Task :app:extractDeepLinksDebug UP-TO-DATE
> Task :app:processDebugManifest
> Task :app:processDebugResources
> Task :app:compileDebugJavaWithJavac UP-TO-DATE
> Task :app:compileDebugSources UP-TO-DATE
> Task :app:mergeDebugShaders UP-TO-DATE
> Task :app:compileDebugShaders UP-TO-DATE
> Task :app:generateDebugAssets UP-TO-DATE
> Task :app:mergeDebugAssets UP-TO-DATE
> Task :app:processDebugJavaRes NO-SOURCE
> Task :app:mergeDebugJavaResource UP-TO-DATE
> Task :app:dexBuilderDebug UP-TO-DATE
> Task :app:checkDebugDuplicateClasses UP-TO-DATE
> Task :app:mergeExtDexDebug UP-TO-DATE
> Task :app:mergeDexDebug UP-TO-DATE
> Task :app:mergeDebugJniLibFolders UP-TO-DATE
> Task :app:mergeDebugNativeLibs UP-TO-DATE
> Task :app:stripDebugDebugSymbols UP-TO-DATE
> Task :app:validateSigningDebug UP-TO-DATE
> Task :app:packageDebug
> Task :app:assembleDebug
上述tasks大概可分為五個(gè)階段:
- 準(zhǔn)備依賴包(Preparation of dependecies):在這個(gè)階段gradle檢測(cè)module依賴的所有l(wèi)ibrary是否就緒鞠眉。如果這個(gè)module依賴于另一個(gè)module,則另一個(gè)module也要被編譯;
- 合并資源并處理清單(Merging resources and processing Manifest):打包資源和 Manifest 文件;
- 編譯(Compiling):處理編譯器的注解择诈,源碼被編譯成字節(jié)碼;
- 后期處理(Postprocessing): 所有帶 “transform”前綴的task都是這個(gè)階段進(jìn)行處理的;
- 包裝和出版(Packaging and publishing):library生成.aar文件械蹋,application生成.apk文件。
部分Tasks詳細(xì)說(shuō)明
- mergeDebugResources:解壓所有的 aar 包羞芍,并且把所有的資源文件合并相關(guān)目錄里哗戈;
- processDebugManifest:把所有 aar 包里的AndroidManifest.xml中的節(jié)點(diǎn),合并到項(xiàng)目的AndroidManifest.xml中
- processDebugResources:
a. 調(diào)用 aapt 生成項(xiàng)目和所有 aar 依賴的R.java
b. 生成資源索引文件
c. 輸出符號(hào)表
- compileDebugJavaWithJavac:用來(lái)把 java 文件編譯成 class 文件
此過(guò)程可參考詳解Android Gradle生成字節(jié)碼流程
下圖是詳細(xì)版的Android 構(gòu)建過(guò)程荷科,可對(duì)應(yīng)上述系列tasks中的某些工作: