問題引出
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里面做一些事情好了,于是我們可以看到

此處執(zhí)行了server的create函數(shù)。好了,我們的開篇就到這里,第一個(gè)問題就是:ContentProvider的初始化真的先于Application 么?
接下來我們就從源碼和實(shí)踐兩個(gè)方面驗(yàn)證一下,
一、首先看下源碼
對(duì)于Activity的啟動(dòng)流程,很多文章也講過,這里也不再贅述,以找到我們問題的答案為主,一切從ActivityThread的main函數(shù)入手:
1.<ActivityThread> attach

2.<ActivityThread> attachApplication

3.<ActivityManagerService> attachApplication

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

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

5.<ActivityThread> bindApplication

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

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

6.<ActivityThread> handleBindApplication

********************************我是分割線***********************************************************
第六點(diǎn)這里就是本文的關(guān)鍵了,此處表明ContentProvider的onCreate確實(shí)是先于Application的的onCreate執(zhí)行的。
當(dāng)然你說我沒看到onCreate啊,別急下面的截圖為你詮釋,展開installContentProviders和callApplicationOnCreate最終會(huì)看到oncreate的
********************************我是分割線***********************************************************
7.<ActivityThread> installContentProviders installProvider

installProvider

attachInfo

8.<Instrumentation> callApplicationOnCreate

二、實(shí)踐驗(yàn)證
首先我們?cè)倏匆槐镮nstantRunContentProvider的onCreate方法

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

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

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