Android Studio新功能解析,Instant Run

来源:互联网 发布:古墓丽影崛起配置优化 编辑:程序博客网 时间:2024/06/09 15:35

目录

[TOC]来生成目录:

      • 目录
    • What is Instant Run
    • Hot Swap
    • Warm Swap
    • Cold Swap
    • Full APK
    • 补充

今天在华为Mate 10(Android 8.0系统)上跑代码,突然抛出java.lang.VerifyError: Verifier rejected class okhttp3.OkHttpClient$Builder异常,直接导致程序直接启动crash,后经定位,发现原因为开启了Android Studio 3.0版本里面的Instant Run导致,在设置里面把Instant Run关掉,问题得到解决,现对Instant Run背后的原理做一次梳理,以便于后续可以把这个新功能使用得更好。


What is Instant Run?

Android Studio 2.0中编译和部署的速度都有了很大程度的提升,但唯独安装速度没有得到提升,Android Studio开发团队当然不会满足于此,他们想要的是把速度提升到极致,于是从Android Studio 2.0开始加入了Instant Run功能。

只要是在Android Studio 2.0版本以上,都可以通过GUI简单上手使用Instant Run,但是如果懂得了其背后的原理,我们将可以把这个功能使用得更好。

传统情况下,我们修改程序后重新运行一次程序需要经历 代码重新编译 -> 停止程序 -> 重新安装 -> 重新启动 这样一个过程,而Instant Run则尝试只将程序变更的部分部署到手机上,尽量避免重新安装或重新启动程序,以此大大提升调试程序的效率。

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

这里写图片描述

三角形旁边多了一个闪电符号,这就说明现在可以使用Instant Run了。

Instant Run主要分为三种类型,hot swap、warm swap和cold swap,Android Studio会根据代码的修改情况自动选择使用哪种swap类型。

Hot Swap

hot swap是所有swap方式中效率最高的一种,应用程序不需要重新安装,也不需要重启就可以完成程序变更。但由于hot swap同样不会重新对Object对象做重新初始化操作,可能某些场景下需要重启Activity才能看出具体的变更内容。

对于hot swap这种情况默认是不重启Activity的,当然你也可以到设置中去改变这一默认行为,具体路径是 Settings -> Build, Execution, Deployment -> Instant Run -> Restart activity on code changes。

hot swap的适用条件比较少,只有一种情况会被Android Studio视为hot swap类型,就是修改一个现有方法中的代码,举个例子,修改程序Toast的字符串内容

Warm Swap

warm swap也非常快,这种swap类型同样不需要重新安装或重启程序就可以完成程序变更,但是warm swap要求必须重启Activity,即Activity的生命周期会重新执行。

warm swap的适用条件也比较局限,只有一种情况会被Android Studio视为warm swap类型,就是修改或删除一个现有的资源文件。

Cold Swap

cold swap相对而言就要更慢一些了,Android Studio会自动记录我们项目的每次修改,然后将修改的这部分内容打成一个dex文件发送到手机上。cold swap的工作原理是基于multidex机制来实现的,在不引入外部library的情况下,只有5.0及以上的设备才支持multidex,因此,如果你使用了5.0以下的设备,那么cold swap就无法工作了,这种情况会执行最原始的完整APK安装过程。

cold swap的适用条件是这几种类型里最多的。

Full APK

除了上面集中模式,有些场景Instant Run目前都还不支持,比如以下一些情况:

(1)改变AndroidManifest.xml文件的内容
(2)改变被AndroidManifest.xml文件所引用的资源,比如string.xml中的app_name
(3)改变桌面widget的UI相关元素

当程序变更不被Instant Run所支持时,就会执行完整的APK安装过程,并会弹出Toast提示

当然,这只是目前的Instant Run规则,IDE肯定团队还会一直进行优化,增加hot swap和warm swap的条件,减少cold swap和full apk的条件。

补充

我也是在其他博客上面了解到的,hot swap还有一些特殊问题。hot swap会在应用程序的内部开启一个服务器,然后由Android Studio自动计算出方法内实现的变更,将变更代码发送到服务器,服务器再利用类加载器和委托机制将新的代码实现注入到现有应用程序中,从而完成替换工作。

但是整个过程中,新的代码实现并没有被保存到本地,也就是说一旦设备和Android Studio的连接断掉了(比如拔掉数据线),我们使用hot swap替换的代码也就随之不见了。

解决方法也很简单,利用Android Studio重新Full APK一下重启程序就可以解决了。

参考了如下博客文章:
http://blog.csdn.net/guolin_blog/article/details/51271369


原创粉丝点击