1. 程式人生 > >淺談安卓系統記憶體執行機制

淺談安卓系統記憶體執行機制

Dalvik虛擬機器作為Android平臺的核心組成部分之一,允許在有限的記憶體資源中同時執行多個虛擬機器例項。Dalvik虛擬機器通過以下方式提升效能:

1、DEX程式碼安裝時或第一次動態載入時odex化處理。

2、Android2.2版本提供了JIT機制提升效能,號稱效能提升3~5倍。

3、提升硬體配置,如更多核CPU、更高頻率CPU、更大的RAM等。

但是Android的系統流暢度與IOS系統還是有一定得差距。Android程式碼必須執行在Dalvik虛擬機器上,而IOS直接是原生代碼,效能差距也在情理之中。如果Android系統想擁有與IOS系統相同的系統性能。Dalvik虛擬機器執行機制就成為Android系統性能提升唯一的障礙。

Android Kitkat 提供了一種與Dalvik截然不同的執行環境-ART(Android Runtime)的支援。目前使用者可以選擇裝置的執行環境,在不久的將來ART肯定會替代Dalvik Runtime。

二、Dalvik vs ART


Dalvik執行環境使用JIT(Just-In-Time)來進行轉譯,應用每次執行的時候,位元組碼都需要通過JIT轉換為機器碼,這會拖慢應用的執行效率。而ART則是使用AOT進行處理(Ahead-Of-Time),並會在應用程式安裝完畢時,進行預先的基礎性編譯作業,這就減去了JIT執行時的機器碼轉化時間,應用的啟動和執行都會變得更加快速。

ART優點:
1、系統性能的顯著提升。
2、應用啟動更快、執行更快、體驗更流暢、觸感反饋更及時。
3、更長的電池續航能力。

4、支援更低的硬體。

ART缺點:
1、更大的儲存空間佔用,可能會增加10%-20%。
2、更長的應用安裝時間。

總的來說ART的功效就是“空間換時間”。

三、初步感知ART

1、裝置如何選擇ART執行環境

通過以下步驟開啟:設定→關於手機→點選最下面的版本號7次→開發者模式出現→返回→進入開發者模式,然後選擇runtime-使用ART

目前官方Android模擬器並不能開啟ART模式,可以通過該網址下載支援ART模式的Android模擬器映象 ( https://blog.csdn.net/coolypf/article/details/17069015)

2、Dalvik切換ART後系統變化

2.1、應用安裝時採用的程式碼優化方式不同:

Dalvik Runtime : dex2opt(https://124.16.139.131:24080/lxr/source/dalvik/dexopt/OptMain.cpp?v=android-4.0.4#f_OptMain.cpp)

ART Runtime : dex2oat (https://android.googlesource.com/platform/art/+/kitkat-release/dex2oat/dex2oat.cc)

/

2.2、優化後的檔案大小及格式不同:

兩個執行環境產生的優化程式碼路徑及檔名都為:/data/dalvik-cache/app/[email protected]@{package name}[email protected]

ART環境產生的優化程式碼檔案大小明顯比Dalvik環境產生大:

/

雖然都為.dex檔案結尾,但是檔案格式卻是天壤之別:

ART環境檔案格式:ELF Shared Object

/

Dalvik環境檔案格式:

/

三、ART相關原始碼

ART相關原始碼下載地址:(https://android.googlesource.com/platform/art/+archive/kitkat-release.tar.gz)

從原始碼檔案目錄名稱可以很清楚的瞭解各資料夾中相關檔案的功能,我們最關心的主要有compiler、dex2oat、runtime三個資料夾:

compiler:主要負責Dalvik位元組碼到原生代碼的轉換,編譯為libart-compiler.so

dex2oat :完成DEX檔案到ELF檔案轉換。編譯為dex2oat

runtime :Android ART執行時原始碼,編譯為libart.so

/

四、dex2oat優化流程

在應用安裝時,installd通過dex2oat優化APK安裝包classes.dex的Dalvik位元組碼為本地機器程式碼。整個優化為:

/

更多LLVM編譯器的資訊可檢視:

https://llvm.org/

https://www.ibm.com/developerworks/cn/opensource/os-createcompilerllvm1/

https://www.chinaicexpo.com/market/1104-llvm.html

五、OAT檔案格式

OAT檔案其實就是基於ELF格式的一種私有檔案格式。

OAT的ELF 段資訊:

/

OAT的ELF export資訊:

/

OAT檔案載入流程,通過分析ART相關原始碼,當通過DexClassLoader載入一個OAT檔案基本流程如下:

1、讀取oatdata符號地址獲取Oat資料 startAddress。

2、讀取oatlastword符號地址獲取OAT資料 endAddress。

3、通過startAddress和endAddress定位Oat資料。

4、解析Oat資料。構建方法定位所需資料結構。

然後就可以呼叫載入OAT檔案的程式碼了。

整個的方法定位過程和Dalvik執行環境沒有太大區別,讀者可以通過(https://blog.csdn.net/androidsecurity/article/details/8664778)來了解如何定位到一個類的某個方法。

您可以簡單的認為ART和Dalvik區別就是:Dalvik定位到的方法是Davlik位元組碼,但是ART定位到的方法是原生代碼。僅是方法程式碼內容發生了變化,但是方法的定位過程基本相同。

我們以關鍵的地址點為分割擷取OAT檔案資料段:

ELF頭:

/

OAT資料內容開始:(注意0x10BB位置,DexHeader開始)

/

可執行原生代碼部分:

/

OAT資料結束位置:

/

具體的OAT檔案格式可以檢視原始碼。

相關推薦

系統記憶體執行機制

Dalvik虛擬機器作為Android平臺的核心組成部分之一,允許在有限的記憶體資源中同時執行多個虛擬機器例項。Dalvik虛擬機器通過以下方式提升效能: 1、DEX程式碼安裝時或第一次動態載入時odex化處理。 2、Android2.2版本提供了JIT機制提升效

按鍵下的變量命名

技術 登錄 麻煩 設置 ID tps str 定義 img 一般我們在安卓按鍵下定義變量 比如dim a,b,c,d 測試代碼的時候學習知識的時候的確足夠用了 但是一旦腳本規模比較大 整個腳本的流程比較長 如果用這種 變量名a,b c,d 不單單是容易重復沖突 還可能會

apk加固原理和實現

轉載本文需註明出處:EAWorld,違者必究。 引言: 在安卓開發中,打包釋出是開發的最後一個環節,apk是整個專案的原始碼和資源的結合體;對於懂點反編譯原理的人可以輕鬆編譯出apk的原始碼資源,並且可以修改資原始碼、重新打包編譯,輕輕鬆鬆變成自己的apk或者修改其中一部分竊取使用者資訊。

視訊會議系統執行與維護

        摘 要:視訊會議是一種新興的虛擬會議形式,主要是通過現代計算機通訊技術來實現的,視訊會議中,參會人員要通過視訊資訊和音訊資訊的網路傳遞來進行交流溝通。會議期間,參會人員還可以相互分享資訊資源,視訊會議極大的促進了會議的效率。同時也為參會人員帶來了很多方便。要

自動化的思路

一 前言  什麼是自動化測試? 把以人為驅動的測試行為轉化為機器執行的一種過程,即模擬手工測試步驟, 通過執行測試指令碼自動地測試軟體,自動地完成軟體的單元測試、功能測試、負載測試或效能測試等全部工作。 自動化測試應該從提高工作效率和產品質量的根本目標出發,而不是

MVP模式

一、MVP模式介紹 隨著UI建立技術的功能日益增強,UI層也履行著越來越多的職責。為了更好地細分檢視(View)與模型(Model)的功能,讓View專注於處理資料的視覺化以及與使用者的互動,同時讓Model只關係資料的處理,基於MVC概念的MVP(Mod

BaseAdapter

一:繼承結構 經常用Adapter,今天抽出點時間看看BaseAdapter的原始碼,抽象類BaseAdapter實現了ListAdapter,SpinnerAdpter介面,ListAdapter和SpinnerAdpter均繼承自Adapter介面,組織結構如下圖所

自定義view(一):製作一個最最最簡單的自定義view

對於安卓程式設計師來說,自定義view簡直不要太重要,畢竟有很多功能,譬如圓形頭像這些,用單純的原生非常難以實現,而用自定義view,簡直分分鐘。 在這裡,我嘗試用最簡單方式跟初學者說一下如何自定義一個自己的view~ 首先,最簡單最簡單的自定義view,有

Xutils框架(一)

xUtils更新到3.0後的基本使用規則說實話,對於xUtils,是我最近才用到的開發框架(也是剛接觸),對於其功能不得不說,簡化了很多的開發步驟,可以說是非常好的開發工具,但是其最近更新到3.0也沒有解決載入自定義ImageView報錯的問題。我總是喜歡用一些最新的東西,x

Canvas,模擬心電圖的繪製

哇,這哥們好屌,這文章寫的真好,可能很多同學心中曾經有過類似的感覺,其實心動不如行動,擼起袖子,就是幹! 說到安卓中繪圖,大家可能最先想到的就是canvas和surfaceview,今天咱們先一起看下

下linux的記憶體機制

Linux的記憶體管理採取的是分頁存取機制,為了保證實體記憶體能得到充分的利用,核心會在適當的時候將實體記憶體中不經常使用的資料塊自動交換到虛擬記憶體中,而將經常使用的資訊保留到實體記憶體。 各項指標: --Mem total1 實體記憶體總數: 3832M use

系統下的多線程斷點下載實現

exc 源代碼 app 內存卡 linear 移植 getc exists see 近期研究多線程下載,寫了個demo。整理下來,或許會對別人有幫助。 多線程下載的話一般開啟兩到三個線程吧。假設線程太多的話時間會浪費在線程的切換上,倒是浪費了大把的時間

Android 系統架構介紹

圖片 img 多核心 nco 安全性 .com not 狀態 linux android系統架構 從上圖中可以看出,Android系統架構為四層結構,從上層到下層分別是應用程序層、應用程序框架層、系統運行庫層以及Linux內核層,分別介紹如下:

大型web系統架構

memcache hbm 設備 應用服務器 syn sql 執行 效率 color CSDN文章:淺談大型web系統架構(丁碼農) 動態應用,是相對於網站靜態內容而言,是指以c/c++、php、Java、perl、.net等服務器端語言開發的網絡應用軟件,比如論壇、網絡相冊

秒殺系統架構設計

秒殺http://mp.weixin.qq.com/s?__biz=MjM5NDM4MDIwNw%3D%3D&mid=2448834705&idx=1&sn=25cf3d4f6d6826e564a634901189eb8f&chksm=b28a405185fdc9478b6bd

Linux的內存管理機制

第二次打開 再次 占用 利用 完全 交換 linux系統 其它 swap 一 物理內存和虛擬內存 我們知道,直接從物理內存讀寫數據要比從硬盤讀寫數據要快的多,因此,我們希望所有數據的讀取和寫入都在內存完成,而內存是有限的,這樣就引出了物理內存與虛擬內存的概

Java基礎8-java程序的運行機制與JVM運行

style 窗口 exe 了解 體感 語法 我們 nbsp .exe 一、java程序的運行機制 Java開發的整個生命周期,可以概括為兩個階段:編譯階段和運行階段。 1.編譯階段 ①程序員編寫一個符合java語法的xx.java的源文件。 ②使用javac.exe命令對以

三級分銷系統開發對企業的作用

出現 企業 開發 健康 php mage 茶葉 TP jpg 三級分銷系統,三級分銷模式,三級分銷軟件,三級分銷商城,三級分銷小程序,三級分銷APP,三級分銷系統開發,三級分銷模式開發,三級分銷軟件開發,三級分銷商城開發,三級分銷小程序開發,三級分銷APP開發,微信三級分銷

谷歌CEO發文:系統或許要收費了!

還在 you 應用 視覺 目標 art 去年 tex 相機 因谷歌Android壟斷一案,歐盟委員會今日正式宣布,對谷歌處以43.4億歐元(約合50.4億美元)的罰款。對此,谷歌CEO桑達爾·皮查伊(Sundar Pichai)發表文章,警告稱由於歐盟的決定,Android

三級分銷系統開發對企業發展的影響,三級分銷系統開發

必須 平臺 哪些 一個 代理 最好 促銷 消費 系統 三級分銷系統開發,三級分銷模式,三級分銷商城,三級分銷平臺,三級分銷小程序,三級分銷軟件,三級分銷微商城,三級分銷APP,三級分銷商城開發,三級分銷模式開發,三級分銷平臺開發。 互聯網的迅猛發展,帶動了各種電子商務的盛行