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,一经查实,立即删除!

相关文章

爬虫cookie过期_python instagram 爬虫

叶湘伦:【文字篇】如何系统地自学 Python?​zhuanlan.zhihu.com直接介绍一下具体的步骤以及注意点:instagram 爬虫注意点instagram 的首页数据是 服务端渲染的,所以首页出现的 11 或 12 条数据是以 html 中的一个 json 结构存在的…

php 无限循环

<?php header("Content-type:text/html;charsetutf-8"); $arr array( array(1, 0, 语文), array(2, 1, 数学), array(3, 0, 英文), array(4, 3, 美术), ); function xunhuan($pid 0) { global $arr; foreach ($arr as $value) { if ($value[1] $pid) { ech…

MySQL InnoDB 是如何存储数据的

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

蔬菜大棚成本_蔬菜大棚种植成本和利润究竟如何?种植户有话说

大棚蔬菜种植&#xff0c;到底利润高不高&#xff0c;就让亲身体验过的人来说下自己的情况吧。农大老家山东也是大棚蔬菜种植比较早的地方&#xff0c;直到现在大棚种植蔬菜在各地都还是不少。大棚蔬菜种植&#xff0c;是有相应的补贴政策&#xff0c;在农业种植当中&#xff0…

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

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

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

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

Go 1.18.1 Beta 尝鲜 泛型 FuzzTest workspace mode

Go 1.18.1 Beta 尝鲜 昨天&#xff0c;go 终于发布了 1.18 的 beta 版本, 带来了大家期待已久的泛型&#xff0c;抓紧时间康康能不能赶上热乎的。 下载地址 根据社区昨天发的 Go 1.18 Beta 1 is available, with generics 这次版本更新主要带来的新功能有&#xff1a; 泛型模…

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

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

python面试题目

问题一&#xff1a;以下的代码的输出将是什么? 说出你的答案并解释。 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各位小伙伴实现了多少&#xff1f;翻出了生灰的flag擦擦说不定2021还能接着用哦2020年就要过去了还记得你在年初立下的那些Flag吗&#xff1f;减肥“明天我就开始减肥&#xff01;”是大部分人在大部分时候都挂在嘴边的一句话疫情宅家不仅没减成还…

Python3.10 结构化模式匹配 PEP 634

Python3.10 结构化模式匹配 PEP 634 眼看 2021 马上结束&#xff0c;python 发布了它的 3.10 版本&#xff0c;优化了错误消息&#xff0c;上下文管理器等内容&#xff0c;但更吸引我的还是结构化模式匹配。 众所周之 switch 一直是 python 社区呼声比较高的一个功能&#xff…

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

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

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

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

[译] Bounds Check Elimination 边界检查消除

[译] Bounds Check Elimination 边界检查消除 Go 是一种内存安全的语言&#xff0c;在针对数组 (array) 或 Slice 做索引和切片操作时&#xff0c;Go 的运行时&#xff08;runtime&#xff09;会检查所涉及的索引是否超出范围。如果索引超出范围&#xff0c;将产生一个 Panic&…

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

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

HDU 5410 CRB and His Birthday ——(完全背包变形)

对于每个物品&#xff0c;如果购买&#xff0c;价值为A[i]*xB[i]的背包问题。 先写了一发是WA的 。代码如下&#xff1a; 1 #include <stdio.h>2 #include <algorithm>3 #include <string.h>4 #include <set>5 using namespace std;6 typedef pair<…

一篇讲Java指令重排和内存可见性的好文

在这里&#xff1a; http://tech.meituan.com/java-memory-reordering.html 指令重排和内存可见性&#xff08;缓存不一致&#xff09;是两个不同的问题。 volatile关键字太强&#xff0c;即阻挡指令重排&#xff0c;又保证内存一致性。 unsafe.putOrderedXXX()只阻挡指令重排&…

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

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

硬件内存模型 Hardware Memory Models

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

碰到日期题就怕的我来写一道水题吧

HDOJ-2005&#xff0c; http://acm.hdu.edu.cn/showproblem.php?pid2005 20XX系列的水题哈哈&#xff0c;写了二十分钟&#xff0c;就为找到一种比较正常不傻逼的写法。。。 嗯&#xff0c;学习了一下&#xff0c;闰年的判断可以写成一个接受参数的宏。 #define lev(n) (n%40&…