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