Instant Run

如何编译运行app

我们要编译运行一个AS工程,只需在AndroidStudio上点击几下按钮就行了。InstantRun模式下,当你修改一些方法和存在的资源时,允许你不用编译一个新的apk就可以立即看到修改后的效果。
编译运行你的app,点击Run 'app'

.Andorid Studio使用Gradle进行编译,询问你运行的目标设备,之后会发布到改设备上。你可以自定义一些默认的行为,如可以选择一个自动发布的目标设备,可以通过修改运行配置

修改运行配置

运行配置包括,运行那个modle,打包发布,Activity启动,目标设备,模拟器设置,日志配置。编辑运行配置:

  1. 选择Run > Edit Configurations.

更改Build Variant

默认情况下,当你点击Run 'App'的时候,Android Studio编译debug版本的app。想要改变build variant,可以通过Build>Select Build Variant,从下拉菜单中选择你想执行的类型

监控执行过程

可以点击Gradle Console

.在输出面板中会显示执行task的名字,如下图所示
The Gradle Console in Android Studio
The Gradle Console in Android Studio

如果在编译过程中出现异常,消息窗口会提示出错信息。Gradle会给你推荐一些命令行帮助你解决问题,例如--stacktrace--debug。如何在编译过程中使用命令行

  1. 打开设置
  2. 导航到Build,Execution,Deployment>Compiler
  3. Command-line Options输入命令行选项
  4. 点击确认保存退出

关于Instant Run

Instant Run是Android Studio2.0引入的,用于减少开发过程中等待app更新的时间。Instant Run通过patch修改的部分而不是重新打一个apk的方式来减少等待时间。

使用Instant Run,需要Android Plugin for Gradle的版本在2.0.0后,minSdkVersion>=15,要想有更好的性能,minSdkVersion>=21。

在你运行过一次后,一个闪电图标会显示在运行按钮

上,表明InstantRun已经准备好了,会在下次运行时生效。

InstantRun 把你更新的代码和资源push到你的设备上通过hot swapwarm swapcold swap。它会自动决定用何种方式进行push,他们的介绍直接粘贴你真的了解Instant Run吗这篇文章。

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类型:

  1. 添加、删除或修改一个注解
  2. 添加、删除或修改一个字段
  3. 添加、删除或修改一个方法
  4. 添加一个类
  5. 修改一个类的继承结构
  6. 修改一个类的接口实现
  7. 修改一个类的static修饰符
  8. 涉及资源文件id的改动

那么我们还是来看一下演示效果吧,如下图所示:


0 (2).gif

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

Full APK

除了满足以上条件的其他程序变更,Instant Run目前都还不支持,主要包括以下一些情况:

  1. 改变AndroidManifest.xml文件的内容
  2. 改变被AndroidManifest.xml文件所引用的资源,比如string.xml中的app_name
  3. 改变桌面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模式下是不可能出现的,所以不用担心这个提示会让用户感到困惑。

配置优化InstantRun

通过配置DEX 资源加快编译速度

android {
  ...
  dexOptions {
    maxProcessCount 4 // this is the default value
    javaMaxHeapSize "2g"
  }
}

Enable dexing-in-process和增量编译

该功能需要使用Android Plugin for Gradle 2.1.0及以后的版本,为了是该功能生效,你需要设置Gradle daemon's的最大heap size至少为2048M,在可以在gradle.propertes文件加入:

org.gradle.jvmargs = -Xmx2048m

如果你已经定义了javaMaxHeapSize在你的modle的build.gradle文件中,你需要设置daemon's的最大headp size的值为javaMaxHeapSize+1024MB。例如如果你的javaMaxHeapSize为“2g”,你需要在gradle.properties文件中设置为:

org.gradle.jvmargs = -Xmx3072m

window病毒扫描不要包含工程文件

Disable Crashlytics for your debug build variant

使用Crashlytics会引起编译速度慢,为了提高开发阶段的效率,可以把起disable掉,disable Crashlytics:

Instant Run的局限性

部署到多个设备

由于Instant Run使用不同的技术在不同的API版本上,因而当你把app部署到多个设备上时,Android Studio会临时关闭Instant Run功能。

多dex的APP

当你在你的build.gradle文件里设置了multiDexEnabled trueminSdkVersion 20 or lower,这时如果你部署你的app到Android4.4(API 20)或更低版本,Android Studio会关闭Instant Run功能。

如果minSdkVersion设置为21或更高版本,Instant Run会自动为你的app配置multidex。由于InstantRun仅在debug版本工作,如果你要发布release版,你需要手动配置multidex。

第三方插件

Android Studio会临时关闭java Code Coverage Library(JaCoCo) 和 ProGuard当你使用InstantRun时。因为InstantRun仅在Debug上工作,因而不会影响Release编译。

使用Instant Run构建你的app时,如果使用第三方插件进行字节码优化可能会有问题,如果你想使用Instant Run,你需要关闭字节码优化插件。

推送更改到多进程的APP

InstantRun进支持在应用的主进程进行hot swaps和warm swaps。如果想要对其他进程进行更新,InstantRun会执行cold swap。

关闭InstantRun功能

  1. Open the Settings or Preferences dialog.
  2. Navigate to Build, Execution, Deployment > Instant Run.
  3. Uncheck the box next to Enable Instant Run.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • 什么是Instant Run? 我们都知道,Android Studio功能非常强大,在各个功能性方面都要优于Ec...
    GB_speak阅读 794评论 0 3
  • 在Instant Run刚出来的时候,反编译源码写过一篇Instant Run原理解析,但过于基于源码,感觉没有写...
    皓云观阅读 596评论 0 1
  • Instant Run 翻译成中文叫即时运行或直接运行模板。不过我一般习惯了叫做闪电运行,为什么这么叫?请看图: ...
    Reathin阅读 15,278评论 3 11
  • 一.做了那些有价值的事 1.跟学员得水进行了沟通,明天付费加入我们的社群 2.写了1500多字的文章 3.晚上跟默...
    王小柯阅读 369评论 0 0
  • 0303不能再想你(一) 0304不能再想你(二) 0306不能再想你(完结) 起因 春节过完,继续上班。 我离开...
    一夏飘雪阅读 332评论 0 2