文档章节

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

abcijkxyz
 abcijkxyz
发布于 2016/07/30 17:29
字数 2511
阅读 11
收藏 0
点赞 0
评论 0

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


关注我的微信公众号,每天都有优质技术文章推送,你还可以向公众号投稿,将自己总结的技术心得分享给大家。
扫一扫下方二维码或在微信搜索 郭霖 即可关注:

本文转载自:http://blog.csdn.net/guolin_blog/article/details/51271369

共有 人打赏支持
abcijkxyz
粉丝 60
博文 6196
码字总数 1876
作品 0
深圳
项目经理
android studio problems

1 在android studio 下新建android project ,编译没有问题。 而导入已经存在的项目时,一直报错:Connection refused。 这个时候就要考虑是配置哪里跟自己android studio 本地的不一样,果然...

CamilleIT
06/29
0
0
Session 'app': Error Launching activity

Android Studio升级到2.0,运行程序出现Session ‘app’: Error Launching activity,不能编译运行程序,发现是因为2.0的新特性“instant run”,我的解决办法是关闭这个功能,在File->Setti...

KelvinQ
2016/05/05
267
1
应用迁移至 Android P 操作指南

Android P 已经按照既定的计划进入到了 Beta 2 版本,且终版 API 也已经发布。相信大家已经对 Android P 所带来的行为变化以及新功能有了足够的了解。本文将详细说明如何将您的应用迁移至 An...

谷歌开发者
06/22
0
0
Android Studio工具修理集

本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 1、Common依赖项目找不到。因为主项目没有引进setting.gradle 2、从Eclipse移植到AS,最重要的两个文件是setting.gradle和...

liuzxgeek
2016/07/22
0
0
virjar/xposedhooktool

hook base工具 Android 破解的hook工具,集成一些帮助破解的常用功能,如自动网络抓包、网络堆栈爆破、文件日志、webview调试环境 入口在 com.virjar.xposedhooktool.hotload.XposedInit,但是...

virjar
04/22
0
0
Android动态化框架App Bundles

Android App Bundles 在今年的Google I/O大会上,Google向 Android 引入了新 App 动态化框架(即Android App Bundle,缩写为AAB),与Instant App不同,AAB是借助Split Apk完成动态加载,使用...

code_xzh
05/16
0
0
Android Studio 2.2 的新鲜事

Android Studio 2.2 现在可以下载。Android Studio 2.2 已在 Google I/O 2016 上预展,是全球各地数百万 Android 开发者使用的 IDE 最新版本。 此版本包含增强功能,主要面向三大主题:速度、...

局长
2016/09/24
5.2K
12
Android Studio 2.2 正式起航

转载请注明出处:http://blog.csdn.net/xiaole0313/article/details/52621766 必看文章回顾: 1、Android面试经验大解密 2、Android的viewHolder模式解剖 3、Android中必须学习的七大开源项目...

xiaole0313
2016/09/22
0
0
Android Studio使用教程

今年的Google全球开发者大会虽然没有新的Android系统和设备,但是还是推出了一些不错的产品,Android Studio就是其中之一。这个基于Intellij IDEA开发的Android IDE让很多人眼前一亮,其实时...

枫影Xda
2013/05/21
0
2
Android 高效开发调试神器 JRebel

相信大家应该都在使用 Android Studio 来开发 Android 了,如果你还没有的话,那么建议尽快迁移到 Android Studio 上来,而且 Google 前段时间刚刚宣布,已经彻底放弃对 Eclipse ADT 的支持。...

postdep
2016/11/23
71
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

如何把你的Linux系统变的更加安全

做为一个小白,以为自己懂了点Linux知识,会搭建Linux各种服务就觉得自己牛的不要要的。在我们团队里面,我将使用了一台破电脑搭建Linux服务器,上面跑着Ftp服务存放着资源,ssh服务可以远程...

问题终结者
1分钟前
0
0
lombok的使用和原理

一、项目背景 在写Java程序的时候经常会遇到如下情形: 新建了一个Class类,然后在其中设置了几个字段,最后还需要花费很多时间来建立getter和setter方法 lombok项目的产生就是为了省去我们手...

颖辉小居
2分钟前
0
0
rsync至服务同步-系统日志-screen

rsync: 服务同步;配置文件:/etc/rsyncd.conf 默认端口:873 服务启动:rsync --daemon rsync -av /root/1.txt 192.168.1.2::test/2.txt (test为模块名称) /etc/rsync.conf配置样例: #指定...

ZHENG-JY
4分钟前
0
0
读取文件中内容转换成字符串

package com.lieni.ruyu.api.xmlTool; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Unsuppo......

newdeng
4分钟前
0
0
《PHP和MySQL Web 开发》 第8章 设计Web数据库

LCL WARNING 这是我学习《PHP和MySQL Web 开发》的读书笔记,一些重要的知识点我会记录下来,当然只会写我觉得重要的。 如果有幸有人看到这个学习笔记了,你要结合着书看,不要光看这个笔记。...

十万猛虎下画山
11分钟前
0
0
Spring+jpaNo transactional EntityManager available

TransactionRequiredException: No transactional EntityManager availableEntityManager执行以下方法(refresh, persist, flush, joinTransaction, remove, merge) 都需要需要事务i......

wpfc
12分钟前
0
0
八幅漫画理解使用JSON Web Token设计单点登录系统

八幅漫画理解使用JSON Web Token设计单点登录系统 Sep 07, 2015 in Engineering 上次在《JSON Web Token - 在Web应用间安全地传递信息》中我提到了JSON Web Token可以用来设计单点登录系统。...

祖冲之
14分钟前
0
0
Spring框架中的设计模式(三)

Spring框架中的设计模式(三) 原创: 瑞查德-Jack 在之前的两篇文章中,我们看到了一些在Spring框架中实现的设计模式。这一次我们会发现这个流行框架使用的3种新模式。 本文将从描述两个创意...

瑞查德-Jack
17分钟前
1
0
[MicroPython]TPYBoard智能小车“飞奔的TPYBoard装甲一号”

智能小车作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。智能小车能够实时显示时间、速度、里程,具...

bodasisiter
19分钟前
0
0
桌面虚拟化VDI(Virtual Desktop Infrastructure)

为了保证员工(客户)不把公司的资料复制、传输给别人。可以把员工平时办公放在服务器上做。所以使用桌面虚拟化。就是把一个服务器虚拟出很多桌面系统(如:windows)。 桌面虚拟化最大的优势...

王坤charlie
26分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部