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界面下方見(jiàn)到如下日志:

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)系作者
  • 序言:七十年代末唯咬,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子畏浆,更是在濱河造成了極大的恐慌胆胰,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,207評(píng)論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刻获,死亡現(xiàn)場(chǎng)離奇詭異蜀涨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)将鸵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門勉盅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人顶掉,你說(shuō)我怎么就攤上這事草娜。” “怎么了痒筒?”我有些...
    開(kāi)封第一講書人閱讀 170,031評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵宰闰,是天一觀的道長(zhǎng)茬贵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)移袍,這世上最難降的妖魔是什么解藻? 我笑而不...
    開(kāi)封第一講書人閱讀 60,334評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮葡盗,結(jié)果婚禮上螟左,老公的妹妹穿的比我還像新娘。我一直安慰自己觅够,他們只是感情好胶背,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,322評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著喘先,像睡著了一般钳吟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窘拯,一...
    開(kāi)封第一講書人閱讀 52,895評(píng)論 1 314
  • 那天红且,我揣著相機(jī)與錄音,去河邊找鬼涤姊。 笑死暇番,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的砂轻。 我是一名探鬼主播奔誓,決...
    沈念sama閱讀 41,300評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼搔涝!你這毒婦竟也來(lái)了厨喂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 40,264評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤庄呈,失蹤者是張志新(化名)和其女友劉穎蜕煌,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體诬留,經(jīng)...
    沈念sama閱讀 46,784評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斜纪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,870評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了文兑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒刚。...
    茶點(diǎn)故事閱讀 40,989評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖绿贞,靈堂內(nèi)的尸體忽然破棺而出因块,到底是詐尸還是另有隱情,我是刑警寧澤籍铁,帶...
    沈念sama閱讀 36,649評(píng)論 5 351
  • 正文 年R本政府宣布涡上,位于F島的核電站趾断,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏吩愧。R本人自食惡果不足惜芋酌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,331評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望雁佳。 院中可真熱鬧脐帝,春花似錦、人聲如沸甘穿。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,814評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)温兼。三九已至,卻和暖如春武契,著一層夾襖步出監(jiān)牢的瞬間募判,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,940評(píng)論 1 275
  • 我被黑心中介騙來(lái)泰國(guó)打工咒唆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留届垫,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,452評(píng)論 3 379
  • 正文 我出身青樓全释,卻偏偏與公主長(zhǎng)得像装处,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浸船,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,995評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

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