一、AOT編譯
AOT編譯,全稱是Ahead-Of-Time Compile,字面意思是提前編譯,是與JIT(Just-In-Time Compile)相對應的一種編譯方式。它是指在代碼運行之前就將代碼轉換成機器碼,並且保存到二進位文件中。當代碼需要執行的時候,直接載入已經編譯好的二進位文件就可以了。
相對於JIT的解析運行方式,AOT編譯提高了代碼的執行效率,因為減少了解析和編譯的時間,提高了代碼的執行速度,降低了啟動時間。
在Android系統中,AOT編譯是從Android 2.2版本開始引入的。在Android 5.0之前,採用的是Dalvik虛擬機作為應用程序運行環境,這個虛擬機就採用了AOT方式進行編譯。而在Android 5.0之後,採用的是ART虛擬機,也是採用了AOT編譯方式。
二、AOSP編譯Fastboot
Android系統是以源碼形式發布的,通常開發者要自己編譯成可用的鏡像(system.img,userdata.img,boot.img等)才能在設備上運行。Fastboot就是Android編譯的一個非常重要的工具,它可以用來燒寫鏡像,進行Bootloader的解鎖操作等。在AOSP編譯過程中,快速構建一個可用的系統鏡像的步驟如下:
source build/envsetup.sh // 提供 "lunch"命令
lunch aosp_arm-eng // 選擇編譯目標類型
make -j32 // 進行編譯
在進行完編譯之後,可以得到一個system.img文件,這個文件就是編譯出來的Android系統的核心組件。如果需要將這個文件燒寫到設備上面,可以使用以下命令:
sudo fastboot flash system system.img
sudo fastboot reboot
三、AOT編譯器
在Android系統中,AOT編譯器是將Java編譯成機器碼的重要工具。在Dalvik虛擬機時代,它的實現就是dexopt程序,可以把Dalvik位元組碼編譯成本地可執行的機器碼,存儲到odex文件中。在ART虛擬機時代,AOT編譯的實現就是dex2oat,它可以將dex文件編譯成 ELF 對象文件,保存在 oat 文件中。
在使用dex2oat編譯的時候,可以指定多個參數來控制編譯的結果,例如:
dex2oat --dex-file=/system/app/SystemUI/SystemUI.apk --oat-file=/system/app/SystemUI/oat/arm64/SystemUI.odex --instruction-set=arm64 --compiler-filter=quicken
–dex-file參數指定了需要編譯的dex文件,–oat-file參數指定了需要輸出的oat文件路徑,–instruction-set參數指定了目標處理器架構,–compiler-filter參數可以指定要使用的編譯器。
四、編譯AOSP
編譯AOSP,需要使用Repo和Git來同步源代碼。Repo是Google開發的一個命令行工具,它可以用來管理多個Git倉庫,使得多個庫在構建時能夠保持同步。其中,Android源代碼本身就是由多個Git倉庫組成的。以下是編譯AOSP的步驟:
$ mkdir ~/my-android
$ cd ~/my-android
$ sudo apt-get install git // 安裝git
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo // 下載repo工具
$ chmod +x ~/bin/repo // 將repo工具設置為可執行
$ git config --global user.name "Your Name" // 設置用戶名
$ git config --global user.email "you@example.com" // 設置郵件地址
$ repo init -u https://android.googlesource.com/platform/manifest // 下載Android源代碼
$ repo sync -j8 // 同步源代碼
$ source ./build/envsetup.sh; lunch aosp_arm-eng // 設置環境變數,選擇編譯目標類型
$ make -j8 // 開始編譯
五、AOT編譯代碼
在進行AOT編譯時,主要是對Java代碼進行編譯,並且將其轉換成機器碼保存到二進位文件中。Java代碼本身是由Class文件組成的,其中包含了Java語言的位元組碼和一些元數據。因此,在進行AOT編譯時,需要首先進行Class文件的預處理工作,將Class文件解析成指令集,然後再將指令集編譯成機器碼。
通常情況下,Java代碼的編譯分為兩個階段:前端和後端。前端負責將Java代碼轉換成指令集,這個過程通常在運行時完成;後端負責將指令集轉換成機器碼,這個過程通常在編譯時進行。
六、AOT編譯模式
在Android系統中,AOT編譯可以分為兩種模式:啟動時編譯和預編譯。啟動時編譯即在運行應用程序時,對需要執行的代碼進行實時編譯;而預編譯即將整個應用程序在安裝時就全部編譯好,然後保存到OAT文件中。Android系統的ART虛擬機採用的就是預編譯模式,這樣可以降低應用程序的啟動時間,提高系統的性能。
七、AOT編譯後進一步加密
由於AOT編譯產生的可執行文件通常是裸露的機器碼,因此在一些需要程序加密的場合,可能需要進一步對AOT編譯結果進行處理,添加補丁,以達到加密的目的。這個過程通常是通過掃描AOT編譯結果並且解析出其中的代碼段和數據段進行處理。
八、AOT編譯安卓
在Android系統中,AOT編譯是非常重要的一個環節,可以提高程序的執行效率和系統性能。對於開發者來說,了解AOT編譯的原理和機制,能夠更好地進行程序開發和優化工作,提高應用程序的質量和性能表現。
九、AOT編譯知乎
知乎上有關AOT編譯的話題評論如下:
評論1:AOT技術在APP開發中,對提高APP啟動速度具有極其重要的作用,因為我們在開發APP時,從UI與設計方面下手經常帶來強的效果與Experience,但效果與Experience並不能直接提升一個APP的啟動速度;關於AOT技術的文章不多,但是還是希望程序猿們多學習這方面的知識,提高APP的性能。
評論2:AOT編譯技術在移動應用領域的應用非常廣泛,這個過程就是將高級語言代碼(如Java)編譯為機器語言代碼,這樣可以提高應用程序的運行速度,降低耗電量,提高效率。
評論3:眾所周知,AOT編譯在安卓系統中扮演著非常重要的角色,在應用程序的啟動速度和性能優化上起到了至關重要的作用。AOT編譯的方式就是在應用程序啟動之前,將應用程序的代碼編譯成機器碼,以便更快地執行。同時,AOT編譯的方式也可以帶來較大的安全性、穩定性和性能穩定性、有效緩解動態編譯所帶來的效率問題和過程中的需要的消耗問題。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/284824.html