簡書地址:www.jianshu.com/p/2beae17c9…java
android源碼編譯的四個流程:1.源碼下載;2.構建編譯環境;3.編譯源碼;4模擬器運行python
首先確保本身已經安裝了Git.linux
sudo apt-get install git
git config –global user.email 「test@test.com」
git config –global user.name 「test」
複製代碼
使用清華大學鏡像android
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/
複製代碼
使用每個月更新的初始化包(也能夠傳統的初始化方法,由於網絡慢會下載失敗,仍是直接把初始化包下載下來再進行同步)git
下載地址 每個月更新的初始化包ubuntu
因爲全部代碼都是從隱藏的 .repo 目錄中 checkout 出來的,因此只保留了 .repo 目錄,下載後解壓 再 repo sync 一遍便可獲得完整的目錄api
使用方法以下:
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)bash
分支列表 代號、標記和細分版本號markdown
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2
repo sync
複製代碼
硬件要求:網絡
軟件要求
安裝 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
複製代碼
解決方案:
在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工具 |
make -j8
複製代碼
編譯中
運行模擬器
//依次輸入如下命令(若是是在編譯成功源碼以後直接想運行模擬器,則直接輸入emulator命令就行,由於前面編譯源碼已經輸入過以上兩條命令)
. build/envsetup.sh
lunch(選擇剛纔你編譯源碼設置的目標版本)
emulator
複製代碼
編譯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兩個個文件:
編譯中遇到的坑
Error: library-pathout/host/linux-x86/lib64/libsepolwrap.so does not exist
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源碼編譯完成,源碼編譯是一個須要耐心的過程,但願看到文章的你也能夠編譯成功。文章中若是有錯誤,請你們給我提出來,你們一塊兒學習進步,若是以爲個人文章給予你幫助,也請給我一個喜歡或者關注。
參考資料