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ù)(即方法簽名)從而確定到補丁 Dex 中的相應(yīng)方法
AndroidInstantRun運行時做的事
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列表