一、ART與Dalvik的區別
在談到Android Runtime(ART)之前,先來了解一下它與Dalvik的區別。Dalvik是Android早期使用的虛擬機,它的執行方式是解釋執行,即每次執行都需要重新翻譯位元組碼。而ART則採用了預編譯的方式,將位元組碼轉換為本地機器指令後再執行,因此相比Dalvik,ART具有更快的啟動速度和更好的性能表現。
ART的運行方式為Ahead-of-Time(AOT)編譯,即在應用安裝時,ART會將應用的DEX位元組碼轉換為本地機器代碼,並將其保存在存儲空間中,這樣在應用運行時就不需要再重新編譯,直接載入本地代碼即可。而Dalvik採用的是Just-in-Time(JIT)編譯,即每次應用運行時都要解釋執行位元組碼,當應用經常重複運行某些代碼時,Dalvik才會將其編譯為本地代碼,從而提高性能。
ART與Dalvik最大的區別就在於ART採用了AOT編譯方式,相比Dalvik的JIT編譯方式,ART在啟動速度和內存佔用上均有優化,因此可以幫助應用提升性能。
二、ART的優勢與劣勢
2.1 優勢
ART相比Dalvik具有以下優勢:
1.更快的應用啟動速度:由於ART採用了AOT編譯方式,所以在應用啟動時就已經將DEX位元組碼轉換為本地代碼,從而避免了解釋執行的過程,提升了應用啟動速度。
2.更少的內存佔用:ART在執行應用時,不僅能夠減少運行時的內存使用,還可以優化內存使用方式。相比Dalvik機制的一次性分配,ART可以更靈活地管理內存,並且只會在真正需要增加堆內存的時候才會進行增量分配,因此能夠更加高效地利用內存資源。
3.更好的應用性能:由於ART採用了預編譯的方式,所以相比Dalvik,應用的性能表現更加出色。當應用存在大量重複執行的代碼時,ART會將其轉換為本地機器代碼,從而提高了應用的執行效率。
2.2 劣勢
ART的缺點在於:
1.安裝應用時間較長:由於ART在安裝應用時需要將DEX位元組碼編譯為本地代碼,因此會比Dalvik機制花費更長的時間。
2.升級應用時間較長:ART在Android系統升級時,需要重新處理應用的本地代碼,因此會比Dalvik機制花費更長的時間。
三、優化應用性能關鍵:如何深入理解ART
3.1 通過日誌了解應用的啟動情況
在優化應用性能的過程中,首先需要了解應用的啟動環節,看看有沒有過度消耗時間的地方。通過日誌可以查看應用啟動的過程,從而找出啟動耗時最多的環節。
我們可以通過開啟應用的StrictMode模式,來捕捉在主線程中執行的耗時操作:
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .build());
這段代碼可以在應用啟動時,開啟StrictMode模式,捕捉主線程中的耗時操作,並將日誌輸出到控制台,從而幫助我們找出耗時操作,優化應用性能。
3.2 通過Android Profiler監控應用性能
Android Studio提供了一個工具叫做Android Profiler,可以用來監測應用的CPU、內存、網路、磁碟等性能數據,幫助我們找出應用的性能瓶頸。
在Android Studio中,點擊菜單欄的”Run”->”Profile”,就可以打開Android Profiler工具。在工具中,我們可以查看應用的CPU使用率、內存使用率、網路傳輸速度等數據,這些數據可以幫助我們找出應用的性能瓶頸,進行針對性的優化。
3.3 使用ART的Profile Guided Optimization(PGO)功能
ART的Profile Guided Optimization(PGO)功能可以根據實際應用的運行情況,生成相應的性能數據,以便優化應用性能。
在使用PGO功能時,需要在編譯應用時,在gradle文件中添加以下代碼:
buildTypes { debug { debuggable true jniDebuggable true //啟用PGO功能 if (Boolean.valueOf(System.getProperty('enablePGO'))) { ndk { debugSymbolLevel 'NONE' arguments '-fprofile-generate=${project.buildDir}' } } } //Release版本 release { //啟用PGO功能 if (Boolean.valueOf(System.getProperty('enablePGO'))) { debuggable false jniDebuggable false minifyEnabled true ndk { debugSymbolLevel 'NONE' arguments '-fprofile-use=${project.buildDir}' } } } }
這段代碼可以啟用PGO功能,並將相關的命令行參數傳遞給NDK編譯器,在應用編譯期間生成性能數據。應用在運行時,ART會分析性能數據,並利用其做出更優的編譯決策,從而提升應用性能。
3.4 使用AOT編譯方式
當應用使用ART時,可以採用AOT編譯方式,將DEX位元組碼編譯為本地代碼,從而提升應用性能。
在應用構建時,可以使用以下代碼將應用的DEX位元組碼編譯為本地代碼:
android { compileOptions { targetCompatibility JavaVersion.VERSION_1_8 sourceCompatibility JavaVersion.VERSION_1_8 } buildTypes { release {//在release版本下開啟 minifyEnabled false useProguard false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' //使用AOT編譯方式 dexOptions { javaMaxHeapSize "4g" preDexLibraries true //指定編譯輸出目錄 dexOutputDir rootProject.file('output/dex') //指定編譯模式為native dexInProcess true } } } }
這段代碼可以將編譯模式設置為native,將DEX位元組碼編譯為本地代碼。這樣,在應用啟動時,ART就不需要再進行編譯,在性能方面就會更具優勢。
四、總結
優化應用性能是Android開發過程中十分重要的一個環節,ART作為Android中的運行時,與Dalvik相比,在啟動速度和應用性能方面均有優化。通過深入理解ART的機制,我們可以針對性地進行優化,在日誌查看、Android Profiler、PGO功能、AOT編譯等多個方面進行優化,從而提高應用的性能表現。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/190420.html