你真的了解Instant Run吗?

什么是Instant Run?服务器

咱们都知道,Android Studio功能很是强大,在各个功能性方面都要优于Eclipse,惟独在速度方面被吐糟得比较惨。Android Studio团队为此也是作了不少的优化,在Android Studio 2.0中,对速度方面进行了大幅度的改进:app

能够看到,Android Studio 2.0中编译和部署的速度都有了很大程度的提高,但惟独安装速度没有获得提高,这很正常嘛,毕竟应用程序的安装快慢是由咱们手机的硬件配置来决定的,和开发工具备什么关系呢。
可是Android Studio团队并不知足于此,他们想将速度提高到极致,因而在Android Studio 2.0中加入了Instant Run功能。固然,只要你的Android Studio版本在2.0以上,你不须要进行任何学习就可使用Instant Run,可是若是懂得了它背后的原理,你将可使用得更好。ide

传统状况下,咱们修改程序后从新运行一次程序须要经历 代码从新编译 -> 中止程序 -> 从新安装 -> 从新启动 这样一个过程,而Instant Run则尝试只将程序变动的部分部署到手机上,尽可能避免从新安装或从新启动程序,以此大大提高调试程序的效率。工具

当咱们第一次运行程序以后,Android Studio中的运行按钮会变成这个样子:布局

能够看到,运行的三角形旁边多了一个闪电符号,这就说明如今可使用Instant Run了。
Instant Run主要分为三种类型,hot swap、warm swap和cold swap,Android Studio会根据代码的修改状况自动选择使用哪一种swap类型,下面咱们就来针对这三种swap类型详细地学习一下。学习

Hot Swap开发工具

hot swap是全部swap方式中效率最高的一种,应用程序不须要从新安装,也不须要重启就能够完成程序变动。可是hot swap不会对程序中的对象进行从新初始化,也就是说可能某些场景下须要重启Activity才能看出具体的变动内容。Android Studio对于hot swap这种状况默认是重启Activity的,固然你也能够到设置中去改变这一默认行为,具体路径是 Settings -> Build, Execution, Deployment -> Instant Run -> Restart activity on code changes。优化

hot swap的适用条件比较少,只有一种状况会被Android Studio视为hot swap类型,就是修改一个现有方法中的代码,效果以下图所示:ui


能够看到,我只改动了一个现有方法的内部代码,从新运行后编译和部署的速度都很是快,最关键的是,应用程序并无从新安装或重启,甚至于Activity都没有重启(因为我进行了上述的设置),而后修改的代码就成功替换了。
Warm Swapdebug

warm swap也很是快,这种swap类型一样不须要从新安装或重启程序就能够完成程序变动,可是warm swap要求必须重启Activity。你会在界面上看到屏幕很快地闪一下,同时Activity的生命周期会从新执行。

warm swap的适用条件也比较局限,只有一种状况会被Android Studio视为warm swap类型,就是修改或删除一个现有的资源文件,效果以下图所示:


能够看到,我改动了布局文件中的内容,从新运行后速度仍然很快,应用程序并无从新安装或重启,只是Activity重启了一下,由于要将修改后的布局内容展现到界面上。
Cold Swap

cold swap相对而言就要更慢一些了,Android Studio会自动记录咱们项目的每次修改,而后将修改的这部份内容打成一个dex文件发送到手机上,尽管这种swap类型仍然不须要去安装一个全新的APK,可是为了加载这个新的dex文件,整个应用程序必须进行重启才行。另外,cold swap的工做原理是基于multidex机制来实现的,在不引入外部library的状况下,只有5.0及以上的设备才支持multidex,所以,若是你使用了5.0如下的设备,那么cold swap就没法工做了,这种状况会执行最原始的完整APK安装过程。

cold swap的适用条件很是多,下面我列出一个详细的清单,有哪些状况会被Android Studio视为cold swap类型:

添加、删除或修改一个注解
添加、删除或修改一个字段
添加、删除或修改一个方法
添加一个类
修改一个类的继承结构
修改一个类的接口实现
修改一个类的static修饰符
涉及资源文件id的改动
那么咱们仍是来看一下演示效果吧,以下图所示:


能够看到,这里我给第二个Button添加了一个新的点击事件方法,添加一个方法是知足cold swap条件的,那么咱们明显能够看出,应用程序从新启动了,可是总体的速度依然很快,整个从新运行的过程在5秒种以内完成的,个人截图都是实时速度,没有进行加速播放。
Full APK

除了知足以上条件的其余程序变动,Instant Run目前都还不支持,主要包括如下一些状况:

改变AndroidManifest.xml文件的内容
改变被AndroidManifest.xml文件所引用的资源,好比string.xml中的app_name
改变桌面widget的UI相关元素
当程序变动不被Instant Run所支持时,就会执行完整的APK安装过程,同时Android Studio会给出这样的提示:

因为这种状况从新运行时间比较长,就不给你们截图演示了,之前咱们使用低于2.0版本的Android Studio开发时,每次都是执行的这种状况。
固然,这只是目前的Instant Run规则,Android Studio团队还会一直进行优化,增长hot swap和warm swap的条件,减小cold swap和full apk的条件,相信将来的Android Studio会更加好用。

Rerun

尽管Instant Run尽量地想要变得更智能,可是它也没有时光倒流的能力。好比hot swap或者warm swap是根本不会重启程序的,而若是你修改了一些只有在程序启动的时候才会初始化的代码,那么Instant Run对此也是无能为力的,由于修改的代码根本就没有执行到。

针对这种状况,Android Studio专门提供了一个Rerun按钮:

中间那个按钮就是Rerun按钮,使用这个按钮来从新运行程序,应用程序会被强制重启,从而初始化的一些代码就可以执行到了。Android Studio没法得知改动的代码是否是在程序初始化的时候才执行的,而咱们却能够知道,因此确保你理解了Rerun这个按钮的做用,并在恰当的时机使用它。

补充

hot swap因为其工做原理的限制还有一些特殊问题。hot swap会在应用程序的内部开启一个服务器,而后由Android Studio自动计算出方法内实现的变动,将变动代码发送到服务器,服务器再利用类加载器和委托机制将新的代码实现注入到现有应用程序中,从而完成替换工做。

可是整个过程当中,新的代码实现并无被保存到本地,也就是说一旦设备和Android Studio的链接断掉了(好比拔掉数据线),咱们使用hot swap替换的代码也就随之不见了。当你再次打开程序的时候,你会看到这样的提示:


看到这个提示并不用感到惊奇,这就说明你的hot swap代码失效了,如今的程序仍然使用的老的代码。遇到这种状况只须要将手机连上电脑,而后在Android Studio中从新运行一下程序就能够解决了。另外只有在debug模式下才可能会出现这个提示,release模式下是不可能出现的,因此不用担忧这个提示会让用户感到困惑。

做者: 郭霖 连接:http://www.imooc.com/article/8679 来源:慕课网 本文原创发布于慕课网 ,转载请注明出处,谢谢合做!

相关文章
相关标签/搜索