• AS 2.0新功能 Instant Run


    Instant Run上手

    作为一个Android开发者,很多的时候我们需要花大量的时间在bulid,运行到真机(虚拟机)上,对于ios上的Playground羡慕不已,这种情况将在Android Studio 2.0有了很大改善,使用instant run,在第一次运行之后,就可以快速的在真机中看见修改后的结果,不仅仅是UI可以直接显示,还包括代码逻辑。不用再苦苦等build了,节约生命呀!

    1、首先要升级到Android Studio 2.0+

    2、然后需要升级android tools build
    instant run功能之后再android tools build 的2.*的版本才可以使用。
    需要在project层级的build.gradle中指定
        dependencies {
            classpath 'com.android.tools.build:gradle:2.*'
        }

    3、设置instant Run
    Preferences -> Build,Execution,Deployment -> Instant Run


    4、运行Instant Run
    再没有运行项目的时候,我们的Run图标和以前是一样的
    运行了项目之后的图标是这样的
    再改完代码之后直接点击Run按钮就可以立刻就能在你的设备上面看到效

    Instant Run相关背景知识

    Instant Run,是android studio2.0新增的一个运行机制,在你编码开发、测试或debug的时候,它都能显著减少你对当前应用的构建和部署的时间。
    当我们第一次点击run、debug按钮的时候,它运行时间和我们往常一样。但是接下去的时间里,你每次修改代码后点击run、debug按钮,对应的改变将迅速的部署到你正在运行的程序上,传说速度快到你都来不及把注意力集中到手机屏幕上,它就已经做好相应的更改。

    一个典型的构建周期流程图

    构建->部署->安装->app登录->activity创建
    instant run的目标:尽可能多的剔除不必要的步骤,然后提升必要步骤的速度。
    这意味着,在实践中
    • 只对代码改变部分做构建和部署
    • 不重新安装应用
    • 不重启应用
    • 不重启activity
    • 热拔插,温拔插,冷拔插
     
    instant run = 增量构建 + 热/温/冷拔插
    • 热拔插:代码改变被应用、投射到APP上,不需要重启应用,不需要重建当前activity。场景:适用于多数的简单改变(包括一些方法实现的修改,或者变量值修改)
    • 温拔插:activity需要被重启才能看到所需更改。场景:典型的情况是代码修改涉及到了资源文件,即resources。
    • 冷拔插:app需要被重启(但是仍然不需要重新安装)。场景:任何涉及结构性变化的,比如:修改了继承规则、修改了方法签名等。

    Instant Run运行原理


    manifest文件合并、打包,和res一起被AAPT合并到APK中,同样项目代码被编译成字节码,然后转换成.dex 文件,也被合并到APK中。

    首次运行Instant Run,Gradle执行的操作

    APK生成流程
    1313748-b77963070354a0b7.png

            在有Instant Run的环境下:一个新的App Server类会被注入到App中,与Bytecode instrumentation协同监控代码的变化。
            同时会有一个新的Application类,它注入了一个自定义类加载器(Class Loader),同时该Application类会启动我们所需的新注入的App Server。于是,Manifest会被修改来确保我们的应用能使用这个新的Application类。(这里不必担心自己继承定义了Application类,Instant Run添加的这个新Application类会代理我们自定义的Application类)
            至此,Instant Run已经可以跑起来了,在我们使用的时候,它会通过决策,合理运用冷温热拔插来协助我们大量地缩短构建程序的时间。
     
            在Instant Run运行之前,Android Studio会检查是否能连接到App Server中。并且确保这个App Server是Android Studio所需要的。这同样能确保该应用正处在前台,因为目前是不支持多台设备多程序同时执行。
     

    热拔插


            Android Studio monitors: 运行着Gradle任务来生成增量.dex文件(这个dex文件是对应着开发中的修改类) Android Studio会提取这些.dex文件发送到App Server,然后部署到App。
            因为原来版本的类都装载在运行中的程序了,Gradle会翻译,更新好这些.dex文件,发送到App Server的时候,交给自定义的类加载器来加载.dex文件。看看下面原理图:

            App Server会不断监听是否需要重写类文件,如果需要,任务会被立马执行。新的更改便能立即被响应。我们可以通过打断点调试来发现它确实是这么做。

    温拔插

            温拔插需要重启Activity,因为资源文件是在Activity创建时加载,所以必须重启Activity来重载资源文件
            目前来说,任何资源文件的修改都会导致重新打包再发送到APP。但是,google的开发团队正在致力于开发一个增量包,这个增量包只会包装修改过的资源文件并能部署到当前APP上。

            注意:温拔插涉及到的资源文件修改,在manifest上是无效的(这里的无效是指不会启动Instant Run),因为,manifest的值是在APK安装的时候被读取,所以想要manifest下资源的修改生效,还需要触发一个完整的应用构建和部署。总结起来:如果你修改了manifest相关的资源文件,还是需要面临和以前一样的龟速构建。
     
            所以温拔插实际上只能应对少数的情况,它并不能应付应用在架构、结构上的变化。例如:annotations,fields的增删改、父类文件的修改、static修饰的类、方法、常量等的修改都只能依靠冷拔插。

    冷拔插

            应用部署的时候,会把工程拆分成十个部分,每部分都拥有自己的.dex文件,然后所有的类会根据包名被分配给相应的.dex文件。当冷拔插开启时,修改过的类所对应的.dex文件,会重组生成新的.dex文件,然后再部署到设备上。
            之所以能这么做,是依赖于Android的ART模式,它能允许加载多个.dex文件。ART模式在android4.4中加入,但是Dalvik依然是首选,到了android5.0,ART模式才成为系统默认首选,所以Instant Run只能运行在API-21及其以上版本,至于低版本的话,会重新构建整个应用。

    Instant Run 技巧

    Instant Run是被Android Studio控制的。所以我们只能通过IDE来启动它,如果通过设备来启动应用,Instant Run会出现异常情况。
    • 如果应用的minSdkVersion小于21,可能多数的Instant Run功能会挂掉。可通过建立一个minSdkVersion大于21的新分支,用来debug。
    • Instant Run目前只能在主进程里运行,如果应用是多进程的,类似微信,把webView抽出来单独一个进程,那热、温拔插会被降级为冷拔插。
    • 在Windows下,Windows Defender Real-Time Protection可能会导致Instant Run挂掉,可用通过添加白名单列表解决。
    • 暂时不支持Jack compiler,Instrumentation Tests,或者同时部署到多台设备。
    • Instant Run是不能回退的。代码更改可以通过热拔插快速部署,但是热拔插会影响应用的初始化,所以我们不得不通过重启应用来响应这些修改。





  • 相关阅读:
    EL表达式
    ASP.NET excel导出功能通用类
    ASP.NET MVC4应用程序无法建立控制器的解决方案
    SQLServer 2008以上误操作数据库恢复方法——日志尾部备份
    Jquery中选择器整理
    JQuery mouse事件运用方法
    js中substring和substr的用法
    JS replace用法
    Jquery ajax执行顺序 返回自定义错误信息
    Jquery checkbox, select 取值
  • 原文地址:https://www.cnblogs.com/baiqiantao/p/10d93db79437b440df8c60ff3ce1d659.html
Copyright © 2020-2023  润新知