浅谈instant run
当我接触Compose的时候,我曾经发现过一个奇怪的问题,当我改变一个
TextView里面的Text的时候,我可以不用通过重新run一遍,而是直接改变该text,手机上该APP的text也随之发生改变,当时候以为这个是Compose的新特性,可以不用重新编译,自动在app上展示发生改变的部分。后来知道了热修复这个概念,并且得知热修复是以instant run为基础,然后就浅浅地看了一下instant run,发现instant run和compose的这种现象是有关联的
1.什么是instant run
Instant Run 是 Android Studio 提供的一项功能,它允许开发者在修改应用代码后,无需完整重建和重新安装应用就能将改动推送到已运行在设备上的应用程序中。这意味着对于某些类型的代码更改,开发人员可以在不进行全量编译和安装的情况下,直接看到手机上运行的APP反映出代码变更的结果。然而,并非所有类型的修改都能通过Instant Run立即生效,有些复杂的改变仍需要进行完整的构建与部署流程。
2.instant run遇到的三种不同的场景
2.1 hot swap
比如我就是单纯的想将一个text展示在textview上,我们就可以通过
textview.setText(text);
让textview展示出text的东西,但是现在我想展示text1而不是text
那么我们就可以单纯的将text改成text1
textview.setText(text1);
当你的gradle和配置都满足instant run的条件后,并且已经开启instant run的时候你会发现,你的textview在不用重新run的时候,textview的展示的数据就发生改变了,这种就叫做hot swap
2.2 warm swap
现在我不改变textview了,我改变button,怎么变呢?我们都知道button默认是一个蓝色偏一点那个紫色的,现在我们改变button的颜色,从蓝色变为红色,当你的gradle和配置都满足instant run的条件后,并且已经开启instant run的时候你会发现可能你这个app原本可能正在执行某件事,现在突然停下来了,然后button的颜色变为红色,这个就是warm swap
2.3 cold swap
最后这次,我不改变什么button的颜色了,不改变什么textview了,我现在直接改变了整个类,并且使用这个类,当你的gradle和配置都满足instant run的条件后,并且已经开启instant run的时候你会发现你的这个app重启了并且重启后这个app展示的是你新修改的东西
2.4三者的区别
首先我们可以发现,hot swap改变的是一段逻辑,warm swap改变的是一个布局,而cold swap改变的是一个类 然后我们会发现,hot swap基本上不会对app运行的进程有什么影响,而warm swap它是会暂停原有的进程,cold swap它直接重启app
3.instant run的原理
Instant run的原理其实挺简单的,首先:将instant run.jar注入到apk中,instant run.jar内部有一个content provider,当你改好代码点击instant run的时候,这个时候android studio自带的ide就会判断,它属于cold swap还是warm swap还是hot swap,我们一般让一个app展示在手机上不是将自己的数据线连接在手机上通过adb将apk发送给手机嘛,此时刚才我们说的那些判断的结果就是通过adb然后将结果发送到content provider来进行接收, 然后如果是hot swap的话,那么在应用进行过程中将新的字节码push到apk对应的类中 如果是warm swap的话,它会将修改的部分整合到一个dex文件,然后push到对应的类,可能会导致进程暂停,但不会导致app重启
Cold swap和warm swap很像,但是它会引起app的重启
4.注意
在提到instant run的原理的时候,我说了句:android studio自带的ide就会判断,它属于cold swap还是warm swap还是hot swap
所以说明如果你用的不是android studio的话,那么这个instant run的功能,你是使用不了的。