問題引出
android studio 3.0之後的instant run和2.0有了一些變化,其中一個變化便是2.0的時候需要生成一個BootStrapApplication,在其中執行一些classloader的初始化和委託工作等等(具體我就不展開了,這篇文章寫的不錯深入理解Android Instant Run執行機制),但是3.0之後去掉了, 多了一個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裡面做一些事情好了,於是我們可以看到
此處執行了server的create函式。好了,我們的開篇就到這裡,第一個問題就是:ContentProvider的初始化真的先於Application 麼?接下來我們就從原始碼和實踐兩個方面驗證一下,
一、首先看下原始碼
對於Activity的啟動流程,很多文章也講過,這裡也不再贅述,以找到我們問題的答案為主,一切從ActivityThread的main函式入手:
1. attach
2. attachApplication
3. attachApplication
你是不是想問ActivityManagerService和IActivityManager的關係?這裡先不說,大家看文末的原始碼,檢視下ActivityManagerService的繼承關係就明白了
4. attachApplicationLocked
這個函式比較長,我截個開頭,然後截一段後面的關鍵
5. bindApplication
這個函式比較長,我截個開頭,然後截一段後面的關鍵
此處發了個訊息交給handler處理了, 繼續截圖
6. handleBindApplication
我是分割線*************************** ##第六點這裡就是本文的關鍵了,此處表明ContentProvider的onCreate確實是先於Application的的onCreate執行的。 ##當然你說我沒看到onCreate啊,別急下面的截圖為你詮釋,展開installContentProviders和callApplicationOnCreate最終會看到oncreate的 我是分割線***************************
7. installContentProviders installProvider
installProvider
attachInfo
8. callApplicationOnCreate
二、實踐驗證
首先我們再看一遍InstantRunContentProvider的onCreate方法
好了,既然谷歌大神已經在這裡打了日誌了,真是天助我也,驗證就變得異常簡單了,我們只需要新建一個工程,開啟instant run,然後新建一個Application,在其中的onCreate方法中打個日誌,看下二者的時間先後即可,我的Application裡面的程式碼如下,
驗證結果如下:
驗證的結果也表明確實ContentProvider的初始化真的先於Application,好了,揭祕最新android studio instant run(一)就到這裡了,喜歡的朋友幫忙點贊哦