关闭

Android Studio新功能解析,你真的了解Instant Run吗?

标签: androidandroid studio技术instantrun
49563人阅读 评论(82) 收藏 举报
分类:

转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/51271369
本篇文章首发于我的微信公众号,由于网上讲解Android Studio中Instant Run功能的文章实在是太少了,为了让更多人可以了解这个技术,我将这篇文章同步到我的博客上面。想看更多技术文章的朋友可以扫一扫本篇文章底部的二维码来关注我的微信公众号,每周都会有技术文章推送。


先扯点题外话,我是2010年8月份开始自学Android的,到现在已经快有6年的时间了。当时为了自学我专门买了一本书,叫《Android高级编程》,作者是Reto Meier,这本书现在仍然还在我的书架上,这是我刚拍的一张略显陈旧的照片:


然后最近在学习Instant Run,看了下Android的官方视频,我意外地发现,这位帮助我入门的帅哥竟然已经加入Google了。

现在我就想知道《第一行代码》的作者何时可以加入Google?这里写图片描述

扯蛋就先扯到这里,我们来进入今天的正题。

什么是Instant Run?

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


可以看到,Android Studio 2.0中编译和部署的速度都有了很大程度的提升,但唯独安装速度没有得到提升,这很正常嘛,毕竟应用程序的安装快慢是由我们手机的硬件配置来决定的,和开发工具有什么关系呢。

但是Android Studio团队并不满足于此,他们想将速度提升到极致,于是在Android Studio 2.0中加入了Instant Run功能。当然,只要你的Android Studio版本在2.0以上,你不需要进行任何学习就可以使用Instant Run,但是如果懂得了它背后的原理,你将可以使用得更好。

传统情况下,我们修改程序后重新运行一次程序需要经历 代码重新编译 -> 停止程序 -> 重新安装 -> 重新启动 这样一个过程,而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类型,就是修改一个现有方法中的代码,效果如下图所示:


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

Warm Swap

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模式下是不可能出现的,所以不用担心这个提示会让用户感到困惑。


关注我的技术公众号,每天都有优质技术文章推送。关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

微信扫一扫下方二维码即可关注:

        

114
11
查看评论

如何关闭 Android Studio 新特性Instant Run

Android Studio 2.0提供了热修复调试模式,但是笔者在使用过过程中有很多Bug,比如阿里推送不支持这个新特性,导致每次Debug都会崩溃 解决方法: 1.打开项目,左上角的Android Studio(注意:一定要在这里打开,欢迎页面里面的Setting是不可勾选的!!!!...
  • yu544324974
  • yu544324974
  • 2016-09-08 16:19
  • 15561

android studio 2.3与instant run

前言 目前最新的as 2.3上,instant run的cold swap部署方案与之前的版本相比已经发生巨大变化。之前是通过分dex来实现动态部署,而最新的2.3上则是通过split apks技术。看as 2.2的源码,只有部署到6.0以上的机子才会使用split apks方案。as 2.3则是...
  • sgwhp
  • sgwhp
  • 2017-03-11 21:07
  • 2518

Android Studio 2.1中的instant run功能 介绍

Studio 2.0 之后就有了instant run 功能 说说 instant run  功能:字面意思就能明白 即时运行 这个功能在2.1是默认开启的 而它的相关设置界面呢如下: 就是右边的是个设置了  如何判断是否可以呢 通过 看到了 运行案例左边的⚡️ 了...
  • zy987654zy
  • zy987654zy
  • 2016-05-25 10:29
  • 12099

Android Studio 的 Instant Run 惹的祸

Android Studio 的 Instant Run 惹的祸在使用Android通过PathClassLoader和Dexfile扫描获取应用的所有类的时候傻眼了…参考代码 public static void scan(Context ctx) { try { ...
  • lsziri
  • lsziri
  • 2016-11-02 10:01
  • 845

Android Studio 2.2.1关于InstantRun的致命Bug

升级到2.2.1版本后,莫名其妙的发现一个关于InstantRun的bug,而且是必现的bug,本来想直接通过Android Studio的自带反馈入口提交给Google的,但是即使开了蓝灯,依然无法提交成功,只能放弃了,但是还是要记录一下,给遇到的小伙伴提个醒。需要注意的是,每个人的开发环境都不尽...
  • Violet_yang
  • Violet_yang
  • 2016-10-19 11:01
  • 1529

Android Studio Instant Run 官方介绍翻译

Android Studio Instant Run
  • u011140466
  • u011140466
  • 2016-05-24 16:46
  • 571

解决Android Studio的Instant Run导致的错误

解决Android Studio的Instant Run导致的错误 字数235 阅读3140 评论2 喜欢7 我更新了前两天刚发布的Android Studio 2.0,然后运行项目时报了以下错误提示: Error running app: Insta...
  • RuingMan
  • RuingMan
  • 2016-11-11 14:01
  • 1299

【AndroidStudio】设置instantRun

Flie -> settings ->Instant Run 去掉第一个钩 这个是安卓叫做启用即时运行 热交换代码/资源变化 部署(默认启用)的新技术,开启后回产生应用开启时间长和有时后对少量代码修改后无法部署的问题,所以可以考虑直接关闭,这样运行标志旁边就没有了...
  • QPC908694753
  • QPC908694753
  • 2017-12-22 20:20
  • 107

as 开发的项目运行传输到手机上时,弹出instant run

android studio 弹出 instant run  ,在无法安装到手机上  解决方法: 手机设置中的 开发者选项  开启允许通过USB连接安装应用  关闭Instant Run功能的方法 Settings Or Preferences B...
  • qq_32425867
  • qq_32425867
  • 2018-01-03 09:38
  • 184

Android新特性Instant Run详解

关于 Instant Run Android Studio 2.0 中引入的 Instant Run 是 Run 和 Debug 命令的行为,可以大幅缩短应用更新的时间。尽管首次构建可能需要花费较长的时间,Instant Run 在向应用推送后续更新时则无需构建新的 APK,因此,这...
  • wangwangli6
  • wangwangli6
  • 2017-04-17 14:27
  • 318
    个人资料
    • 访问:8056663次
    • 积分:42176
    • 等级:
    • 排名:第96名
    • 原创:103篇
    • 转载:0篇
    • 译文:6篇
    • 评论:14370条
    我的新书
    微信公众号推荐

    关注我的技术公众号,每天都有优质技术文章推送。

    关注我的娱乐公众号,工作、学习累了的时候放松一下自己。

    微信扫一扫上方二维码即可关注

    共同进步
    感兴趣的朋友可以加入我的QQ群,一起讨论学习,共同进步。
    群号:153325493
    人数有限,请不要重复加群 (即满)
    博客专栏
    最新评论
    统计