AndroidStudio 3.5预览版推出了一个新功能——ApplyChange,替换原来的InstantRun功能。ApplyChange采用了跟InstantRun不一样的原理来加快AndroidStudio的部署安装apk的流程。
InstantRun
InstantRun主要解决以下两个问题,(1)减少构建和部署app到手机的时间;(2)热更新代码改动,无需重启app或者activity。为了实现这两个目标,InstantRun通过重写apk的构建流程往每个类里面去注入钩子来达到类的热替换。详细的实现原理,可以查看这些博文。
对于小型的应用,InstantRun确实很好用,能够节省构建和部署的时间,并且不会出错。但是对于大型复杂应用,它会导致更长的构建时间,同时由于InstantRun构建过程和正常的app构建存在冲突,常常出现另开发者抓狂的错误。as开发团队在连续几个大版本中都去尝试去解决这些问题,但是效果不理想。
所以基于此,as开发者团队重新设计了底层的架构,推出了ApplyChangs。和InstantRun不同的是,它不会在构建过程中去修改apk。它依赖的是安卓8.0开始虚拟机支持的特殊指令来进行类的替换。
ApplyChanges
当连接上安卓8.0及以上的设备时,as将会多出三个按钮
ApplyChanges部署资源和代码改动到手机,重启activity,但是无需重启应用。
仅部署代码改动到手机,不需要重启activity和应用。
架构
接下来我们研究下ApplyChanges的实现原理。ApplyChanges的核心是要找出AndroidStudio构建出来的apk和已经安装到手机设备apk的差异。找出差异后,然后将差异发送到手机上执行差异合并。