揭祕最新android studio instant run(一)

2遠發表於2018-06-03

問題引出

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裡面做一些事情好了,於是我們可以看到

image.png
此處執行了server的create函式。好了,我們的開篇就到這裡,第一個問題就是:ContentProvider的初始化真的先於Application 麼?

接下來我們就從原始碼和實踐兩個方面驗證一下,

一、首先看下原始碼

對於Activity的啟動流程,很多文章也講過,這裡也不再贅述,以找到我們問題的答案為主,一切從ActivityThread的main函式入手:

1. attach

image.png

2. attachApplication

image.png

3. attachApplication

image.png

你是不是想問ActivityManagerService和IActivityManager的關係?這裡先不說,大家看文末的原始碼,檢視下ActivityManagerService的繼承關係就明白了

4. attachApplicationLocked

image.png

這個函式比較長,我截個開頭,然後截一段後面的關鍵

image.png

5. bindApplication

image.png

這個函式比較長,我截個開頭,然後截一段後面的關鍵

image.png

此處發了個訊息交給handler處理了, 繼續截圖

image.png

6. handleBindApplication

image.png

我是分割線*************************** ##第六點這裡就是本文的關鍵了,此處表明ContentProvider的onCreate確實是先於Application的的onCreate執行的。 ##當然你說我沒看到onCreate啊,別急下面的截圖為你詮釋,展開installContentProviders和callApplicationOnCreate最終會看到oncreate的 我是分割線***************************

7. installContentProviders installProvider

image.png

installProvider

image.png

attachInfo

image.png

8. callApplicationOnCreate

image.png

二、實踐驗證

首先我們再看一遍InstantRunContentProvider的onCreate方法

image.png

好了,既然谷歌大神已經在這裡打了日誌了,真是天助我也,驗證就變得異常簡單了,我們只需要新建一個工程,開啟instant run,然後新建一個Application,在其中的onCreate方法中打個日誌,看下二者的時間先後即可,我的Application裡面的程式碼如下,

image.png

驗證結果如下:

image.png

驗證的結果也表明確實ContentProvider的初始化真的先於Application,好了,揭祕最新android studio instant run(一)就到這裡了,喜歡的朋友幫忙點贊哦

ActivityThread.java

ActivityManagerService.java

instant run

相關文章