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.pswp.cn/news/457397.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457397.shtml
英文地址,請注明出處:http://en.pswp.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&…