揭秘最新android studio instant run(一)

問題引出

android studio 3.0之后的instant run和2.0有了一些變化,其中一個(gè)變化便是2.0的時(shí)候需要生成一個(gè)BootStrapApplication,在其中執(zhí)行一些classloader的初始化和委托工作等等(具體我就不展開了,這篇文章寫的不錯(cuò)深入理解Android Instant Run運(yùn)行機(jī)制),但是3.0之后去掉了, 多了一個(gè)InstantRunContentProvider,源碼里面是這樣說的

/**
 * Content Provider that abuses a quirk of early Android initialization to start the instant run
 * service very early, before Application.onCreate(): content providers get initialized before
 * Application.onCreate() is called.
 *
 * ActivityThread initializes the application by creating and binding the Application object,
 * which we don't want to replace right now, creating content providers, and _then_ calling
 * Application.onCreate(), so by starting the IR server in the ContentProvider, we initialize
 * early without risking the ANR we'd get by doing an explicit service start.
 *
 * A ContentProvider also simplifies the client code, which doesn't have to do anything special
 * (like am startservice) in order to cause the instant run server to start on
 * application startup.
 */

大意就是既然ContentProvider的初始化是先于Application.onCreate(),那我就在content providers 的oncreate里面做一些事情好了,于是我們可以看到


image.png

此處執(zhí)行了server的create函數(shù)。好了,我們的開篇就到這里,第一個(gè)問題就是:ContentProvider的初始化真的先于Application 么?

接下來我們就從源碼和實(shí)踐兩個(gè)方面驗(yàn)證一下,

一、首先看下源碼

對(duì)于Activity的啟動(dòng)流程,很多文章也講過,這里也不再贅述,以找到我們問題的答案為主,一切從ActivityThread的main函數(shù)入手:

1.<ActivityThread> attach

image.png

2.<ActivityThread> attachApplication

image.png

3.<ActivityManagerService> attachApplication

image.png

你是不是想問ActivityManagerService和IActivityManager的關(guān)系?這里先不說,大家看文末的源碼,查看下ActivityManagerService的繼承關(guān)系就明白了

4.<ActivityManagerService> attachApplicationLocked

image.png

這個(gè)函數(shù)比較長(zhǎng),我截個(gè)開頭,然后截一段后面的關(guān)鍵


image.png

5.<ActivityThread> bindApplication

image.png

這個(gè)函數(shù)比較長(zhǎng),我截個(gè)開頭,然后截一段后面的關(guān)鍵

image.png

此處發(fā)了個(gè)消息交給handler處理了, 繼續(xù)截圖

image.png

6.<ActivityThread> handleBindApplication

image.png

********************************我是分割線***********************************************************

第六點(diǎn)這里就是本文的關(guān)鍵了,此處表明ContentProvider的onCreate確實(shí)是先于Application的的onCreate執(zhí)行的。

當(dāng)然你說我沒看到onCreate啊,別急下面的截圖為你詮釋,展開installContentProviders和callApplicationOnCreate最終會(huì)看到oncreate的

********************************我是分割線***********************************************************

7.<ActivityThread> installContentProviders installProvider

image.png

installProvider

image.png

attachInfo

image.png

8.<Instrumentation> callApplicationOnCreate

image.png

二、實(shí)踐驗(yàn)證

首先我們?cè)倏匆槐镮nstantRunContentProvider的onCreate方法


image.png

好了,既然谷歌大神已經(jīng)在這里打了日志了,真是天助我也,驗(yàn)證就變得異常簡(jiǎn)單了,我們只需要新建一個(gè)工程,開啟instant run,然后新建一個(gè)Application,在其中的onCreate方法中打個(gè)日志,看下二者的時(shí)間先后即可,我的Application里面的代碼如下,


image.png

驗(yàn)證結(jié)果如下:


image.png

驗(yàn)證的結(jié)果也表明確實(shí)ContentProvider的初始化真的先于Application,好了,揭秘最新android studio instant run(一)就到這里了,喜歡的朋友幫忙點(diǎn)贊哦

ActivityThread.java
ActivityManagerService.java
instant run

?著作權(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)容

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