Android Studio Instant Run的工作原理

原创 2016年06月02日 09:14:21

首先说明一下,本文算不上严格意义的翻译,因此没有归档到译文类别。本文的主要内容及插图均来自《Instant Run: How Does it Work?!》一文,文末会附上此文地址。

Instant Run是Android Studio2.0以上版本引入的一个新特性,它可以显著地减少应用编译及部署的时间。

Instant Run是一个神奇的功能,为什么这么说呢?当第一次你点击run或debug按钮的时候,跟正常的编译部署流程是一样的;当你对代码做了一些修改,然后再次点击run或debug按钮(这时旁边会出现一个⚡标志),接下来就是见证奇迹的时候了,你甚至还没来得及将注意力从Android Studio转移到手机上来,应用已经编译部署好了,这就是它的神奇之处。

接下来就是了解Instant Run的工作原理了,这里有一个官方视频连接:Instant Run:An Android Tool Time Deep Dive,有兴趣的朋友可以直接点开看。

Instant Run的特点

这里写图片描述

上图为应用程序一般的编译和部署过程:

  1. 编译
  2. 部署安装
  3. App启动
  4. Activity启动

经过以上几个步骤之后才能看到代码修改的效果。

对比通用的编译部署过程,Instant Run的目标就很清晰了:

  1. 尽可能去掉上述过程中不必要的步骤
  2. 让剩下的必要步骤越快越好

上述两点在实际中表现为:

  • 仅对增量和变化做编译和部署
  • 尽量不要重新安装App
  • 尽量不要重启App
  • 甚至不要重启Activity

Instant Run = Incremental build + Hot, Warm, or Cold swap

这里写图片描述

由上图可知,Instant Run可以理解为增量编译和部署(分为Hot Swap、Warm Swap和Cold Swap三种方式)。

Hot Swap:此种方式不需要重启App,甚至不需要重启Activity就能看到代码修改引起的变化,一般适用于某个方法实现中的微小改动,如Toast或某个String字串的内容修改。

Warm Swap:此种方式需要重启Activity才能看到修改导致的变化,经常用于资源相关的代码改变。

Cold Swap:此种方式需要App重启,但并不需要App重新安装,适用于结构性的代码修改如继承关系或方法签名改变。

正常的构建流程

这里写图片描述

Manifest文件会被合并,然后与资源文件一起被AAPT工具打包;同时java文件也被编译为字节码,然后转成dex文件,最终上述文件一起打包成APK。

使用Instant Run的构建流程

这里写图片描述

字节码被添加到.class文件中,同时一个appserver类被注入到APK中。

另外还会添加一个新的Application类定义,它用来注入自定义的类加载器用来调起App Server,因此Manifest也会被修改以便可以使用它。如果你已创建了自己的Application类,Instant Run将会使用新的来代理你的Application。

现在Instant Run就跑起来了,所以当你修改了部分代码,然后再次点击run或者debug时,Instant Run将会使用Hot Swap、Warm Swap或者Cold Swap尽可能地缩短原来的构建过程。

Hot Swapping

这里写图片描述

在开发过程中,Android Studio会监控哪些文件发生了变化,并使用Gradle工具为那些变化的class文件生成dex文件。

这些新的dex文件被Android Studio挑选出来然后部署到我们应用上的App Server上。

由于原始版本的class文件已经存在于运行的App中,Gradle可以高效地将更新的文件替换掉以前的旧文件,这些新文件可以被App Server使用自定义的类加载器加载。

这里写图片描述

随后,每次当应用中的一个方法被调用时,App Server会跟原始文件通信来检查他们是否被更新了。如果是的话,更新文件中的修改过的新方法会被委托来执行。

这里写图片描述

如上图,如果你设了断点你将会看到被覆盖的方法的调用栈情况。

对于方法实现的微小改变,使用重定向方法的方式可以很好地工作,但是某些需要Activity重启才能加载的情况又如何呢?

Warm Swapping

Warm Swap会重启Activity,资源会在Activity启动时加载,因此对资源的修改会要求重启Activity来实现资源的重新加载。

目前,对资源的任何修改将会导致资源重新打包与部署到App,Android Studio的技术人员也在研究资源的增量打包与部署技术。

需要注意的是当Manifest中引用的资源被修改时,或者Manifest文件本身被修改了,Warm Swap并不能工作,因为Manifest中的配置信息是在APK被安装时读取的。对Manifest的修改或其引用到的资源的修改将会触发完整的编译和部署流程。

不幸的是,重启Activity并不能应用于结构变化。添加、删除或者修改注记、静态或实例方法签名,或者修改父类、静态初始化逻辑都将需要Cold Swap方式。

Cold Swapping

应用被部署时会被分割为多个部分,每一部分都有自己的dex文件,class文件根据它们的包名被分配到不同的部分。当使用Cold Swap部署时,一个修改过的类必须与其在同一dex中的其他类一起重新生成dex,然后才能部署到目标设备。

这种方式依赖于multidex机制,仅在Android5.0(API level 21)或更高设备上才支持。

对于低于API level 20的设备而言,使用的是Dalvik模式,因此不支持Instant Run,则会执行完整的APK安装过程。

Instant Run很聪明,但它不能回退

由于Hot Swap和Warm Swap不会重启应用,因此修改某些在应用启动时才会初始化的代码时,必须重启App才能看到对应的效果。

这里写图片描述

其他

Instant Run是由Android Studio控制的,因此要从IDE中启动run或debug,而不是从手机设备中启动或重启应用。

Instant Run目前仅在主线程上支持的最好,因此如果应用使用了多线程,在其他线程上使用Hot Swap与Warm Swap将会降级为Cold Swap,如果API level小于21的话直接转为完整构建与部署。

Instant Run也在不断改进,Android Studio团队也在开发新技术让更多的情况可以支持Hot Swap,减少Cold Swap甚至完整构建,相信Android Studio后面的版本越来越好用。

来源英文文章《Instant Run: How Does it Work?!》

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

我们都知道,Android Studio功能非常强大,在各个功能性方面都要优于Eclipse,唯独在速度方面被吐糟得比较惨。Android Studio团队为此也是做了很多的优化,在Android S...
  • sinyu890807
  • sinyu890807
  • 2016年06月02日 09:04
  • 48315

分析Android studio3.0的instant run开启关闭对APK大小的影响

分析Android studio3.0的instant run开启关闭对APK大小的影响 首先看下默认开启instant run的截图: Android studio2.0后新增加的功...
  • xiayiye5
  • xiayiye5
  • 2017年12月15日 11:30
  • 191

记录Android-Studio遇到的各种坑

开此文章,主要是为了记录在使用虐我千百遍,我还待他如初恋的AS的过程中所遇到的各种坑,一来是希望做个记录,方便查找,防止再次踏入同样的坑;二来也希望能帮助到有遇到有跟我相同问题的人。 1,首先每次导入...
  • u012874222
  • u012874222
  • 2016年02月01日 02:03
  • 16789

Android Studio 2.2 问题汇总 - 解决障碍

1.Gradle 2.2 使用 出现下面的警告,编译的时候出现更多。。。 Warning:The `android.dexOptions.incremental` property is depre...
  • linzhenxiang123
  • linzhenxiang123
  • 2016年12月05日 15:14
  • 5597

Android配置方法数超过64K的限制

Android配置方法数超过64K的限制随着 Android 平台的持续成长,Android 应用的大小也在增加。当您的应用及其引用的内容库达到特定大小时,您会遇到构建错误,指明您的应用已达到 And...
  • qq_33689414
  • qq_33689414
  • 2017年01月16日 13:29
  • 413

Freeline比instant-run更好用的Android增量编译方案及常见问题

Freeline比instant-run更好用的Android增量编译方案及常见问题
  • CXNSHUAI
  • CXNSHUAI
  • 2017年03月11日 15:12
  • 422

Android Studio 升级到2.3版本后Run项目不能自动启动APP的问题

前两天把Android Studio升级到2.3版本后发现一个问题:Run App的时候 并没有启动,仅仅是安装。起初以为是代码问题,复查,并未发现。于是乎新建了一个Project,Run默认的App...
  • lucasey
  • lucasey
  • 2017年03月10日 01:59
  • 4574

【Android学习笔记1】Android Studio 开发环境安装笔记(windows版)

安装Java开发工具包(JDK)的必要组件http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151....
  • xiangcns
  • xiangcns
  • 2017年01月18日 09:39
  • 948

Tencent开源框架 Tinker学习(二)

Tinker的简单使用: 在activity_main.xml中放两个Button 一个 TextView
  • g182064900
  • g182064900
  • 2017年03月06日 17:13
  • 460

你真的了解Instant Run吗?

在Instant Run刚出来的时候,反编译源码写过一篇Instant Run原理解析,但过于基于源码,感觉没有写清楚,这周Android Developers推出了Instant Run: An...
  • hb8676086
  • hb8676086
  • 2016年05月27日 13:32
  • 4621
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android Studio Instant Run的工作原理
举报原因:
原因补充:

(最多只允许输入30个字)