Android Studio點擊Run背後發生了什麼?

系列文章java

  1. Android Gradle原理解釋
  2. Android Studio點擊Run背後發生了什麼?

前言

咱們知道在Android Studio中點擊運行按鈕(下圖中的Run)便可對編寫的代碼進行編譯,打包(生成APK),安裝APK到目標設備,運行APP。這一系列流程背後都是Gradle這個構建工具幫咱們在作工做,有關Gradle的基本知識已經在Android Gradle原理解釋一文中作了不少介紹。bash

Android Studio Run

本文咱們換個角度,從點擊按鈕這一行爲出發來研究背後的具體流程和原理。除了Run按鈕外,還有build,Apply Changes, Debug等按鈕也作了相似工做,但應用場景不一樣。app

build按鈕:對應的是Make Project,編譯Project下全部Module,通常是自上次編譯後Project下有更新的文件,不生成apk。工具

Apply Changes按鈕:將代碼和資源更改推送到正在運行的應用,而無需重啓應用(在某些狀況下,無需重啓當前 Activity),是Instant Run功能的替代者。post

Debug按鈕:在調試模式下部署應用,在調試模式下運行應用可在代碼中設置斷點、在運行時檢查變量和對錶達式求值,以及運行調試工具gradle

Run按鈕背後流程

Run背後的Gradle tasks

Gradle生命週期分爲三個階段,分別是Initialization(初始化階段),Configuration(配置階段),和Execution(執行階段),而執行階段會執行一系列task,進行主要的構建工做ui

那麼天然Run按鈕背後的構建工做也是由一系列task組成的,那麼咱們有辦法去查看這些task都有哪些麼?Android Studio提供了強大的日誌記錄功能,主要須要進行如下3步工做:spa

  1. 點擊View > Tool Windows > Build,將在Android Studio界面下方顯示Build過程
  2. 點擊右下角的EventLog按鈕
  3. 點擊Run按鈕

完成上述點擊後,等待APK安裝並運行完成,能夠在Android Studio界面下方見到以下日誌:3d

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大概可分爲五個階段:

  1. 準備依賴包(Preparation of dependecies):在這個階段gradle檢測module依賴的全部library是否就緒。若是這個module依賴於另外一個module,則另外一個module也要被編譯;
  2. 合併資源並處理清單(Merging resources and processing Manifest):打包資源和 Manifest 文件;
  3. 編譯(Compiling):處理編譯器的註解,源碼被編譯成字節碼;
  4. 後期處理(Postprocessing): 全部帶 「transform」前綴的task都是這個階段進行處理的;
  5. 包裝和出版(Packaging and publishing):library生成.aar文件,application生成.apk文件。

部分Tasks詳細說明

  1. mergeDebugResources解壓全部的 aar 包,而且把全部的資源文件合併相關目錄裏;
  2. processDebugManifest把全部 aar 包裏的AndroidManifest.xml中的節點,合併到項目的AndroidManifest.xml中
  3. processDebugResources

a. 調用 aapt 生成項目和全部 aar 依賴的R.java b. 生成資源索引文件 c. 輸出符號表

  1. compileDebugJavaWithJavac用來把 java 文件編譯成 class 文件

此過程可參考詳解Android Gradle生成字節碼流程

下圖是詳細版的Android 構建過程,可對應上述系列tasks中的某些工做:

apk_build.png
相關文章
相關標籤/搜索