Android Studio點(diǎn)擊Run背后發(fā)生了什么?

系列文章

  1. Android Gradle原理解釋
  2. Android Studio點(diǎn)擊Run背后發(fā)生了什么?

前言

我們知道在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原理解釋一文中做了很多介紹。

Android Studio Run

本文我們換個(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步工作:

  1. 點(diǎn)擊View > Tool Windows > Build,將在Android Studio界面下方顯示Build過(guò)程;
  2. 點(diǎn)擊右下角的EventLog按鈕
  3. 點(diǎn)擊Run按鈕

完成上述點(diǎn)擊后,等待APK安裝并運(yùn)行完成,可以在Android Studio界面下方見到如下日志:

run_log.png

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è)階段:

  1. 準(zhǔn)備依賴包(Preparation of dependecies):在這個(gè)階段gradle檢測(cè)module依賴的所有l(wèi)ibrary是否就緒。如果這個(gè)module依賴于另一個(gè)module,則另一個(gè)module也要被編譯;
  2. 合并資源并處理清單(Merging resources and processing Manifest):打包資源和 Manifest 文件;
  3. 編譯(Compiling):處理編譯器的注解,源碼被編譯成字節(jié)碼;
  4. 后期處理(Postprocessing): 所有帶 “transform”前綴的task都是這個(gè)階段進(jìn)行處理的;
  5. 包裝和出版(Packaging and publishing):library生成.aar文件,application生成.apk文件。

部分Tasks詳細(xì)說(shuō)明

  1. mergeDebugResources解壓所有的 aar 包,并且把所有的資源文件合并相關(guān)目錄里;
  2. processDebugManifest把所有 aar 包里的AndroidManifest.xml中的節(jié)點(diǎn),合并到項(xiàng)目的AndroidManifest.xml中
  3. processDebugResources

a. 調(diào)用 aapt 生成項(xiàng)目和所有 aar 依賴的R.java
b. 生成資源索引文件
c. 輸出符號(hào)表

  1. compileDebugJavaWithJavac用來(lái)把 java 文件編譯成 class 文件

此過(guò)程可參考詳解Android Gradle生成字節(jié)碼流程

下圖是詳細(xì)版的Android 構(gòu)建過(guò)程,可對(duì)應(yīng)上述系列tasks中的某些工作:


apk_build.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 為什么需要學(xué)Gradle? Gradle 是 Android 現(xiàn)在主流的編譯工具,雖然在Gradle 出現(xiàn)之...
    真笨笨魚閱讀 1,592評(píng)論 0 0
  • 'Run' 按鈕,一點(diǎn)下,Android Studio 就會(huì)開動(dòng),代碼奇跡般地變成 APK,被安裝到手機(jī)上,顯示 ...
    ChuckChan閱讀 12,181評(píng)論 1 57
  • 前言 為什么需要學(xué)Gradle? Gradle 是 Android 現(xiàn)在主流的編譯工具,雖然在Gradle 出現(xiàn)之...
    Liuuuuuuzi閱讀 2,073評(píng)論 0 18
  • 東施效顰 邯鄲學(xué)步 說(shuō)不盡離奇荒誕 道不完諷刺幽默 書本一合 考試一百 離開校園 走進(jìn)生活 卻發(fā)現(xiàn)你我 又都身不由...
    劉歸真閱讀 204評(píng)論 0 10
  • 82019/9/29 一、主題:關(guān)于停車沖突的視頻問(wèn)題。 二、事件:在學(xué)校車庫(kù)的某個(gè)車位要臨時(shí)停車,保安說(shuō)這個(gè)車位...
    876fd30ac2c7閱讀 447評(píng)論 0 0

友情鏈接更多精彩內(nèi)容