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是不能回退的。代码更改可以通过热拔插快速部署,但是热拔插会影响应用的初始化,所以我们不得不通过重启应用来响应这些修改。



来自为知笔记(Wiz)


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/457397.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL InnoDB 是如何存储数据的

InnoDB 是怎么存储数据的 本文是《MySQL 是怎样运行的 —— 从根儿上理解 MySQL》读书总结,强烈推荐这本书; CSDN 不能显示 SVG,可能有图片加载不出来,可以到 我的博客 上看。 数据目录 众所周之,MySQL 的数据是存储在…

WebSocket实战之————GatewayWorker使用笔记例子

参考文档:http://www.workerman.net/gatewaydoc/ 目录结构 ├── Applications // 这里是所有开发者应用项目 │ └── YourApp // 其中一个项目目录,目录名可以自定义 │ ├── Events.php // 开发者只需要关注这个文件 │ ├── st…

[转]关于凸优化的一些简单概念

没有系统学过数学优化,但是机器学习中又常用到这些工具和技巧,机器学习中最常见的优化当属凸优化了,这些可以参考Ng的教学资料:http://cs229.stanford.edu/section/cs229-cvxopt.pdf,从中我们可以大致了解到一些凸优化…

centos7部署两个mysql_一文掌握mysql实用工具--pt-online-schema-change、innotop部署

概述因为OSC和innotop这两个需要的依赖包比较接近,所以这次就写一起了,下面介绍下完整的部署教程,以下基于centos7操作系统。官网文档:http://dev.mysql.com/doc/refman/5.7/en/innodb-create-index-overview.htmlOSC:…

python面试题目

问题一:以下的代码的输出将是什么? 说出你的答案并解释。 1234567891011121314class Parent(object):x 1class Child1(Parent):passclass Child2(Parent):passprint Parent.x, Child1.x, Child2.xChild1.x 2print Parent.x, Child1.x, Child2.xParent.x 3print …

修改页面后获得flag_互动征集丨是时候为2021立flag了

2020马上就要过去了今年的flag各位小伙伴实现了多少?翻出了生灰的flag擦擦说不定2021还能接着用哦2020年就要过去了还记得你在年初立下的那些Flag吗?减肥“明天我就开始减肥!”是大部分人在大部分时候都挂在嘴边的一句话疫情宅家不仅没减成还…

为ESXI 添加ISCSI存储设备 Linux服务器系统

为ESXI 添加ISCSI存储设备 Linux系统本文使用的LINUX 6系统上一块硬盘制作的ISCSI存储设备其IP地址为:192.168.26.218:在系统上直接输入:yum -y install scsi-target-utils 命令 安装 iscsi分区设置我们将SDD这块硬盘的SDD1作为iscsi存储设备编辑ISCSI配…

出栈顺序 与 卡特兰数(Catalan)的关系

一,问题描述 给定一个以字符串形式表示的入栈序列,请求出一共有多少种可能的出栈顺序?如何输出所有可能的出栈序列? 比如入栈序列为:1 2 3 ,则出栈序列一共有五种,分别如下:1 2 3、…

cad多段线画圆弧方向_CAD箭头怎么画

CAD箭头怎么画问:CAD箭头怎么画?答:想要回答CAD箭头怎么画这个问题,得先从CAD多段线命令说起,画箭只是多段线的一种应用。执行CAD多段线命令的三种方式1.单击菜单栏上的"绘图">>"多段线"。2…

php 获取delete蚕丝_php结合Redis实现100万用户投票项目,并实时查看到投票情况的案例...

场景:某网站需要对其项目做一个投票系统,投票项目上线后一小时之内预计有100万用户进行投票,希望用户投票完就能看到实时的投票情况这个场景可以使用redismysql冷热数据交换来解决。何为冷热数据交换?冷数据:之前使用的…

硬件内存模型 Hardware Memory Models

硬件内存模型 Hardware Memory Models (Memory Models, Part 1) Posted on Tuesday, June 29, 2021. 简介:童话的终结 很久以前,当人们还在写单线程程序的时候,让程序跑的更快的一个最有效的办法就是什么也不做,因为下一代硬件…

【Go】Map 的空间利用率统计

Go 中 map 利用率 今天刷 B 站看见有 Up 主在讲布隆过滤器,提到了利用率的问题,假设有一组数据,范围分布非常广,使用布隆过滤器时如何尽量少的减少内存使用,感觉除了针对特定数据的定向优化外没什么特别好的办法&…

ap模式和sta模式共存_AP+AC组网下的本地转发及集中转发

现在越来越多的企业都有自己的无线网络,而无线网络的组网方式一般都是使用ACAP模式进行组网,使用无线网络能够提供经济、高效的网络接入方式。相比有线网络,无线网络下只要能接入无线网的地方都可以使用网络,用户可以自由移动。而…

【干货分享】流程DEMO-事务呈批表

流程名: 事务呈批表 业务描述: 办公采购、会议费用等事务的申请。流程发起时,会检查预算,如果预算不够,将不允许发起费用申请,如果预算够用,将发起流程,同时占用相应金额的预算&…

【译】TcMalloc: Thread-Caching Malloc

TcMalloc 的核心是分层缓存,前端没有锁竞争,可以快速分配和释放较小的内存对象(一般是 256 KB)前端有两种实现,分别是 pre-CPU 和 pre-Thread 模式,前者申请一块大的连续内存,每一个逻辑 CPU 将…

kotlin编译失败_Kotlin使用GraalVM开发原生命令行应用

背景之前用kotlin开发过一款根据建表DDL语句生成plantuml ER图的应用。被问如何使用,答曰"给你一个jar包,然后执行java -jar ddl2plantuml.jar ./ddl.sql ./er.puml 就可以了。是不是so easy?"结果被吐槽了一番,为什么不能像命令行…

Swift - 添加纯净的Alamofire

Swift - 添加纯净的Alamofire 如果你有代码洁癖,不能容忍任何多余的东西,请继续往下看. 1. 下载Alamofire (https://github.com/Alamofire/Alamofire) 2. 解压缩并打开 Alamofire.xcworkspace 3. 删除不必要的内容 (根据你的需求自己定) 4. 顺便把文件夹里面的无关内容也删除掉…

jquery 获取系统默认年份_你没有看错,爬网页数据,C# 也可以像 Jquery 那样

一:背景1. 讲故事前段时间搞了一个地方性民生资讯号,资讯嘛,都是我抄你的,你抄官媒的,小市民都喜欢奇闻异事,所以就存在一个需求,如何去定向抓取奇闻异事的地方号上的新闻,其实做起来…

undertow 怎么创建线程_为什么很多SpringBoot开发者放弃了Tomcat,选择了Undertow

点击上方“后端技术精选”,选择“置顶公众号”技术文章第一时间送达!作者:阿迈达toutiao.com/a6775476659416990212/前言在SpringBoot框架中,我们使用最多的是Tomcat,这是SpringBoot默认的容器技术,而且是内…

一起玩转CoordinatorLayout

作为Material Design风格的重要组件,CoordinatorLayout协调多种组件的联动,实现各种复杂的效果,在实际项目中扮演着越来越重要的角色。本篇博客将由浅到深,带你一起玩转CoordinatorLayout。 官方文档对CoordinatorLayout是这样描述的&#xf…