InstantRun編譯時做的事
1、替換我們應(yīng)用的application為BootstrapApplication,同時會修改AndroidMainifest.xml中application為BootstrapApplication,BootstrapApplication將做為一個宿主來加載我們的程序和資源。
2、用asm工具修改我們的類增加靜態(tài)$change變量 。($change為IncrementalChange類型此后我們修改任何類,都將新生成類并實現(xiàn)此接口,像給我們的類添加了個代理類)
3、修改每個方法判斷新增加的變量$change是否為空,如果$change不為空就執(zhí)行$change.access$dispath方法,這個方法通過第一個參數(shù)(即方法簽名)從而確定到補(bǔ)丁 Dex 中的相應(yīng)方法
AndroidInstantRun運(yùn)行時做的事
1、執(zhí)行BootstrapApplication的attachBaseContext方法
修改ClassLoader繼承關(guān)系,用IncrementalClassLoader加載類
2、創(chuàng)建真實的RealApplication(自已的Application)執(zhí)行attachBaseContext方法
3、替換我們應(yīng)用所有的application為realApplication
4、替換我們應(yīng)用所有的mAssets為newAssetManager
5、調(diào)用realApplication的onCreate方法
6、啟動Server,Socket接收patch列表