Instant Run是AS2.0才引入的新特性,它极大地减少了我们在调试过程中部署APP到设备(模拟器或者真机)的时间.在第一次部署APP的时候可能会耗时较长,但是之后,当我们修改了代码,再次运行之时,AS不会因为你修改了代码而重新生成APK,它会直接将你修改了的部分代码推送到设备,省去了打包APK,和重启APP的时间,因此Instant Run模式下进行调试会比以前快很多.
1.调试模式(build variant -> debug)
2.Gradle插件版本2.0.0或者更高
3.APP的minSdkVersion 15或更高,为了达到最佳效果,建议将minSdkVersion设定为21或者更高
当第一次将APP部署到设备之后,在Run按钮(或者Debug按钮)的左边就会出现一个闪电标志,这表示下次你点击Run(或者Debug)按钮的时候,AS会直接将你更新过的代码和资源文件推送到设备,而不会生成新的APK,即Instant Run
hot swap , warm swap, cold swap 这是Instant Run模式下进行内容更新的3种模式,APP开发者不需要去指定使用哪种swap方式,Instant Run会自动选择最佳的方式.下面的表格默描述了不同情况下所选择的交换方式,和相应的效果
代码变化 | Instant Run 行为 |
---|---|
改变已存在方法里面的内容(改变方法名,参数列表,返回值不包含在这之内) | hot swap 模式,这种模式是最快的交换模式,更新之后你的APP会保持运行状态(不会杀掉整个APP再重新运行),但是再次执行刚才被修改过的方法的时候会执行新的方法体 hot swap模式更新不会重新初始化正在运行的APP中的各种对象,因此你必须手动重启当前Activity或者重启APP来查看更新的效果.默认情况下,当执行hot swap后AS会自动重启当前的Activity,如果你不想自动重启Activity,可以在设置里面修改 |
改变或者删除已存在的资源文件 | warm swap 模式,这种模式依旧非常快,但是更新的时候Instant Run会杀掉当前正在运行的Activity,然后重新创建这个Activity(同样不会杀掉整个APP) |
结构方面的代码发生变化: 增加,移除或者改变 1.注解(annotation) 2.实例变量(instance field) 3.静态变量(static field) 4.静态方法的签名(static method signature) 5.成员方法的签名(instance method signature) 改变当前类的父类 改变类实现的接口 改变类的静态构造方法 改变动态引用的layout中的UI结构 |
cold swap模式(仅支持API level >= 21的设备),这种交换模式比之前的两种模式会慢一点,更新的时候虽然不会生成新的APK,但是会重启整个APP 如果用于调试的设备,API level 小于21(即Android lollipop之前的系统),那么AS会重新部署整个APP(除了这种情况,其他情况下Instant Run进行更新都是重启Activity,或者重启APP,只将修改过的部分注入到正在用于调试的设备,并没有重新部署过整个APP) |
改变APP的manifest 改变被manifest所引用的资源文件 改变小组件(widget)的UI(这种情况必须用Rerun) |
当app的manifest文件或者manifest所引用的资源文件发生了变化,为了使这些变化生效,AS会执行一次build过程,把这些改动打包进APK,并重新部署到设备 |
在Android Studio2.0里面新增了一个Rerun按钮,一般情况下我们点击Run按钮就可以快速运行我们修改过的代码,但是有些情况下必须重启APP,比如我们修改了构造器(不一定是构造函数)中的代码比如Activity的onCreate,为了使修改的内容生效你必须重启APP,这时候就是用Rerun.如果你要执行增量编译然后重启APP,你也可以使用Rerun
如果你要执行clean build,可以通过主菜单:Run > Clean and Rerun ‘app’,这样做AS会停止正在运行的APP,新的APK生成后将新的APK部署到设备
在前面说到热交换(hot swap)的时候,提到AS默认会自动当前Activity,如果你不想要它自动重启,可以关闭它,关闭的方式:
Mac OSX : Preferences > Build, Execution, Deployment > Instant Run
Linux/Windows : Settings > Build, Execution, Deployment > Instant Run
取消 Restart activity on code changes 的勾选即可