Apply Changes 是通过利用Android 8.0(API级别26)或更高版本中支持的 Android JVMTI(https://docs.oracle.com/javase/8/docs/platform/jvmti/jvmti.html#bc1)技术。所以如果想使用Apply Changes有两个条件:
Apk必须是debug包
必须在Android 8.0以上的手机上运行
Apply Changes按钮在菜单栏上,在运行的右侧新增两个按钮,如下图
1,Apply Changes and Restart Activity:尝试通过重新启动活动但不重新启动应用程序来应用资源和代码更改。如果有代码和资源的修改可以使用这个来使代码和资源即时生效。
2,Apply Code Changes:尝试仅应用代码更改而不重新启动任何内容。如果只有代码修改,可以使用这个来使代码生效。如果修改了代码和资源,请使用“Apply Changes and Restart Activity ”。
架构
接下来我们研究下ApplyChanges的实现原理。ApplyChanges的核心是要找出AndroidStudio构建出来的apk和已经安装到手机设备apk的差异。找出差异后,然后将差异发送到手机上执行差异合并。
Instant Run
1、Gradle版本是2.0.0以上 2、minSdkVrsion设置到21以上。
热修复
Android Studio会监听在开发过程中哪个文件发生了改变,并且通过一个自定义的Gralde task来只对修改的class文件生成对应的.dex文件。
这些新的.dex文件会通过Studio传递发布给应用中运行的App Server。每次一个方法被调用时(不管在应用中的任何地方),被注入到最初的class文件中的instrumentation都讲去连接App Server来检查它们是否有更新了。 如果有更新,执行操作将被指派到新的充在的class文件,这样就会执行新修改的方法。
暖修复
冷修复
需要依赖Android Runtime能支持加载多个.dex文件,这是一个在ART中新增的功能,它只有在Android 5.0(API 21)以上的设备总才支持。
对于API 20一下的设备,他们仍在使用Dalvik虚拟机,Android Studio需要部署整个APK。
修复类型
热修复: 更改的内容不需要重启应用甚至不需要重启当前的activity就可以让显示内容的改变,对于大部分通过方法内容改变的更改都可以通过这种方式来修改。
暖修复: 需要重启activity才能让改变生效,在改变资源时会通过该方式。
冷修复: 应用需要重启(不是重新安装)。对于一些方法方法结构和实现等结构性的改变需要通过该方式。
参考博文: