InstantRun编译时做的事
1、替换我们应用的application为BootstrapApplication,同时会修改AndroidMainifest.xml中application为BootstrapApplication,BootstrapApplication将做为一个宿主来加载我们的程序和资源。
2、用asm工具修改我们的类增加静态$change变量 。($change为IncrementalChange类型此后我们修改任何类,都将新生成类并实现此接口,像给我们的类添加了个代理类)
3、修改每个方法判断新增加的变量$change是否为空,如果$change不为空就执行$change.access$dispath方法,这个方法通过第一个参数(即方法签名)从而确定到补丁 Dex 中的相应方法
AndroidInstantRun运行时做的事
1、执行BootstrapApplication的attachBaseContext方法
修改ClassLoader继承关系,用IncrementalClassLoader加载类
2、创建真实的RealApplication(自已的Application)执行attachBaseContext方法
3、替换我们应用所有的application为realApplication
4、替换我们应用所有的mAssets为newAssetManager
5、调用realApplication的onCreate方法
6、启动Server,Socket接收patch列表