android原始碼編譯的四個流程:1.原始碼下載;2.構建編譯環境;3.編譯原始碼;4模擬器執行
-
1.原始碼下載
-
首先確保自己已經安裝了Git.
sudo apt-get install git git config –global user.email “test@test.com” git config –global user.name “test” 複製程式碼
-
使用清華大學映象
- Android 映象使用幫助
- 首先要下載repo 工具
mkdir ~/bin PATH=~/bin:$PATH curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo //拒絕連線可以使用tuna的git-repo映象,將地址換成清華大學的映象地址 詳情檢視網址https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/ 複製程式碼
-
使用每月更新的初始化包(也可以傳統的初始化方法,因為網路慢會下載失敗,還是直接把初始化包下載下來再進行同步)
-
下載地址 每月更新的初始化包
-
由於所有程式碼都是從隱藏的 .repo 目錄中 checkout 出來的,所以只保留了 .repo 目錄,下載後解壓 再 repo sync 一遍即可得到完整的目錄
使用方法如下: wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-mo nthly/aosp-latest.tar # 下載初始化包 tar xf aosp-latest.tar cd AOSP # 解壓得到的 AOSP 工程目錄 # 這時 ls 的話什麼也看不到,因為只有一個隱藏的 .repo 目錄 repo sync # 正常同步一遍即可得到完整目錄 # 或 repo sync -l 僅checkout程式碼 複製程式碼
-
同步完程式碼之後需要直接進行編譯的話就是編譯主分支的原始碼,如果需要特定版本,則需要自己切換分支,再次同步就切換到指定分支的原始碼了,執行以下命令(這裡切換到8.0版本 支援裝置 Pixel XL、Pixel)
分支列表 代號、標記和細分版本號
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2 repo sync 複製程式碼
-
-
2.構建編譯環境
-
硬體要求:
- 64位的作業系統只能編譯2.3.x以上的版本,如果你想要編譯2.3.x以下的,那麼需要32位的作業系統. 磁碟空間越多越好,至少在100GB以上.意思就是,你可以去買個大點的硬碟了啊 如果你想要在是在虛擬機器執行linux,那麼至少需要16GB的RAM/swap.
-
軟體要求
-
安裝 openJDK 8
sudo apt-get update sudo apt-get install openjdk-8-jdk 複製程式碼
-
依賴設定:
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386 sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386 sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev sudo apt-get install git-core gnupg flex bison gperf build-essential sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib sudo apt-get install libc6-dev-i386 sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4 sudo apt-get install lib32z-dev ccache 複製程式碼
- 依賴設定中有可能會出現“無法定位軟體包 libesd0-dev” 這個問題
解決方案: 在etc/apt 的sources.list 新增映象源 deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse 然後 sudo apt-get update 接著繼續使用該命令安裝就可以了 複製程式碼
-
作業系統要求
Android版本 編譯要求的Ubuntu最低版本 Android 6.0至AOSP master Ubuntu 14.04 Android 2.3.x至Android 5.x Ubuntu 12.04 Android 1.5至Android 2.2.x Ubuntu 10.04
-
-
JDK版本要求
Android版本 編譯要求的JDK版本 AOSP的Android主線 OpenJDK 8 Android 5.x至android 6.0 Oracle JDK 7 Android 2.3.x至Android 4.4.x Oracle JDK 6 Android 1.5至Android 2.2.x Oracle JDK 5 -
官方編譯環境搭建文件地址
-
初始化編譯環境
source build/envsetup.sh 或者 . build/envsetup.sh 複製程式碼
- 選擇目標
. lunch aosp_arm64-eng 複製程式碼
-
該命令表示針對模擬器進行完整編譯,並且所有除錯功能均處於啟用狀態。 如果您沒有提供任何引數就執行命令,lunch 將提示您從選單中選擇一個目標。 所有編譯目標都採用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號。
-
BUILDTYPE 是以下型別之一:
編譯型別 使用情況 user 許可權受限;適用於生產環境(沒有root權和dedug等) userdebug 在user版本的基礎上開放了root許可權和debug許可權. eng 開發工程師的版本,擁有最大的許可權,此外還附帶了許多debug工具
-
3.編譯原始碼
- 您可以使用make編譯任何程式碼。GNUMake可以藉助 -jN引數處理並行任務,通常使用的任務數N介於編譯時所用計算機上硬體執行緒數的1-2倍之間。例如,在一臺雙核 E5520 計算機(2 個 CPU,每個 CPU 4 個核心,每個核心2個執行緒)上,要實現最快的編譯速度,可以使用介於make -j16 到 make -j32 之間的命令。
make -j8 複製程式碼
-
編譯中
-
4.編譯完成執行
-
執行模擬器
//依次輸入以下命令(如果是在編譯成功原始碼之後直接想執行模擬器,則直接輸入emulator命令就行,因為前面編譯原始碼已經輸入過以上兩條命令) . build/envsetup.sh lunch(選擇剛才你編譯原始碼設定的目標版本) emulator 複製程式碼
-
-
將原始碼匯入Android Studio 檢視
-
編譯idegen
source build/envsetup.sh // 將執行檔案設定為臨時變數 mmm development/tools/idegen/ //生成idegen.jar檔案(#### build completed successfully (49 seconds) #### 標識生成idegen.jar檔案) 複製程式碼
-
執行指令碼 idegen.sh
. development/tools/idegen/idegen.sh 複製程式碼
看到下圖,表示編譯idegen完成,執行成功後在asop的根目錄下生成android.ipr和android.iml兩個個檔案:
- android.ipr 一般儲存了工程相關的設定,比如modules和modules libraries的路徑,編譯器配置,入口點等。
- android.iml 用來描述modules。它包括modules路徑、 依賴關係,順序設定等。一個專案可以包含多個 *.iml 檔案。
- 開啟Android Studio,選擇File->Open彈出路徑選擇框,輸入相應的原始碼根路徑,然後選擇android.ipr檔案,就開始匯入原始碼,匯入快慢和電腦效能有關,一般10至20分鐘。
- 至此整個原始碼編譯完成,並可進行原始碼檢視。
-
-
編譯中遇到的坑
-
Error: library-pathout/host/linux-x86/lib64/libsepolwrap.so does not exist
- 解決 :
1.重新同步程式碼 並加入sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
2.確認是否配置好了JDK的環境變數
- 解決 :
1.重新同步程式碼 並加入sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
-
openJDK 配置環境變數方法
1.用gedit文字編輯器在/etc/profile中新增環境變數: 命令 : sudo gedit /etc/profile 2.在開啟的/etc/profile檔案末尾新增下面幾行: export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 export JRE_HOME=${JAVA_HOME}/jre export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH=${JAVA_HOME}/bin:$PATH 複製程式碼
-
編譯Android 8.0出現問題
loadlocale.c:130:_nl_intern_locale_data: ?? 'cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))' ??? Aborted (core dumped) 複製程式碼
可以在 build/envsetup.sh 最後加入
export LC_ALL=C 複製程式碼
-
編譯出現 Try increasing heap size with java option '-Xmx',編譯失敗
解決方案,依次執行以下命令 export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" jack-admin kill-server && jack-admin start-server 複製程式碼
-
最後
-
到此,Android原始碼編譯完成,原始碼編譯是一個需要耐心的過程,希望看到文章的你也可以編譯成功。文章中如果有錯誤,請大家給我提出來,大家一起學習進步,如果覺得我的文章給予你幫助,也請給我一個喜歡或者關注。
-
參考資料