as2.0新特性,解决编译速度慢Instant Run

本文介绍了Android Studio 2.0引入的Instant Run特性,旨在解决大型项目编译速度慢的问题。Instant Run通过hot swap、warm swap和cold swap等方式实现快速代码更新,无需完整安装或重启应用。文章详细讲解了如何在项目中启用Instant Run以及其适用条件和限制,帮助开发者提高开发效率。

参考地址:需翻墙

英文Instant Run
英文multidex


本分主要分以下几个部分:

  • 写这篇文章的起因
  • 了解Instant Run【as2.0新特新】
  • 如何使用instant run到项目中
  • 关于Instant Run说明

1.写这篇文章的起因:

昨天忙了一天,又重新拉取了下项目的代码,发现运行不了后,当查看了下Built Bariant,发现多了点东西。以前只有“debug”和“release”。现在如下图所示:

这里写图片描述

可是多出来的这个instantDebug和instantRelease又有什么用呢?

2.了解Instant Run【as2.0新特新】

于是我去找了负责提交这方面代码改动的负责人,了解到instanse是为了后期修改代码后编译运行等待时间减少【现阶段,项目很大,每次运行要等上1-2分钟】,可是又和这个又什么关联呢?

这就是现在要讲的instant run。谷歌在发布了android studio 2.0携带的一个新特性。Instant Run实际上就是一个热补丁,但修改方法竟然不用重启Activity,这是怎么做到的?阅读一翻关于几个热补丁思路的介绍 ,你会发现andfix和dexposed采用jni hook方法,不用重启就能修复,而Nuwa的ClassLoader思路因为类被虚拟机加载后,不会重新加载,所以需要重启。

Instant Run只能运行在API-21及其以上版本,至于低版本的话,会重新构建整个应用。

回到上面的疑问,就自然而然的解了,当我选择instantDebug或者instantRelease的时候minSdkVersion的最小版本为21,满足了instant Run的运行条件。

3.如何使用instant run到项目中呢?

  • as2.0或更高版本,进入设置找到instant run,如图:

这里写图片描述

这是因为你的gradle的版本过低导致。我的更新成了

classpath 'com.android.tools.build:gradle:2.1.2'


此时再次打开如下图所示:

这里写图片描述


我们先来看看运行的效果。

先来看一个git动态图,然后再来分解看:

这里写图片描述

(1)我们现在写一个按钮的点击事件,弹一个toast,如图所示:

这里写图片描述

这里写图片描述

只需要注意ToastUtils那一行,有点偷懒了,轻点吐槽,直接用上一篇博客的项目demo做演示了

(2)此时修改ToastUtils的提示的文字的代码,并重新运行:

这里写图片描述

此时点击重新运行,你会发现弹出来一个Toast“Applied code changes without activity restart”【而且你会发现刚点击完重新运行就马上出现该提示了】,但是页面还是保持在当面Fragment页面,没有重启acticity,就好像什么也没发生一样

这里写图片描述

点击按钮,会发现提示的内容变化了

这里写图片描述

4.关于Instant Run

InstantRun 把你更新的代码和资源push到你的设备上通过以下几种方式:

  • hot swap
  • warm swap
  • cold swap
  • Full APK
  • Rerun

它会自动决定用何种方式进行push,关于他们的介绍可以查看你真的了解Instant Run吗这篇文章。



  • hot swap
    hot swap是所有swap方式中效率最高的一种,应用程序不需要重新安装,也不需要重启就可以完成程序变更。但是hot swap不会对程序中的对象进行重新初始化,也就是说可能某些场景下需要重启Activity才能看出具体的变更内容。只改动了一个现有方法的内部代码,重新运行后编译和部署的速度都非常快,最关键的是,应用程序并没有重新安装或重启,甚至于Activity都没有重启。

  • Warm Swap
    warm swap也非常快,这种swap类型同样不需要重新安装或重启程序就可以完成程序变更,但是warm swap要求必须重启Activity。你会在界面上看到屏幕很快地闪一下,同时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的改动

  • Full APK

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

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

注意:

以前我们使用低于2.0版本的Android Studio开发时,每次都是执行的这种情况。所以,在我们以前的开发过程中,当项目越来越大的时候会发现编译速度越来越来,有时候甚至要等上3-5分钟。这对于一个开发人员来说是无法忍受的。

  • Rerun

尽管Instant Run尽可能地想要变得更智能,但是它也没有时光倒流的能力。比如hot swap或者warm swap是根本不会重启程序的,而如果你修改了一些只有在程序启动的时候才会初始化的代码,那么Instant Run对此也是无能为力的,因为修改的代码根本就没有执行到。

针对这种情况,Android Studio专门提供了一个Rerun按钮:(快捷键:Ctrl+F5)

中间那个按钮就是Rerun按钮,使用这个按钮来重新运行程序,应用程序会被强制重启,从而初始化的一些代码就能够执行到了。Android Studio无法得知改动的代码是不是在程序初始化的时候才执行的,而我们却可以知道,所以确保你理解了Rerun这个按钮的作用,并在恰当的时机使用它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值