掘金專欄地址:https://juejin.im/post/5b0e591451882515662234cd
android源碼編譯的四個(gè)流程:1.源碼下載;2.構(gòu)建編譯環(huán)境;3.編譯源碼;4模擬器運(yùn)行
-
1.源碼下載
-
首先確保自己已經(jīng)安裝了Git.
sudo apt-get install git git config –global user.email “test@test.com” git config –global user.name “test”
-
使用清華大學(xué)鏡像
- 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鏡像,將地址換成清華大學(xué)的鏡像地址 詳情查看網(wǎng)址https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/
使用每月更新的初始化包(也可以傳統(tǒng)的初始化方法澎嚣,因?yàn)榫W(wǎng)絡(luò)慢會(huì)下載失敗放刨,還是直接把初始化包下載下來再進(jìn)行同步)
下載地址 每月更新的初始化包
由于所有代碼都是從隱藏的 .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 工程目錄 # 這時(shí) ls 的話什么也看不到,因?yàn)橹挥幸粋€(gè)隱藏的 .repo 目錄 repo sync # 正常同步一遍即可得到完整目錄 # 或 repo sync -l 僅checkout代碼
-
同步完代碼之后需要直接進(jìn)行編譯的話就是編譯主分支的源碼,如果需要特定版本,則需要自己切換分支,再次同步就切換到指定分支的源碼了端三,執(zhí)行以下命令(這里切換到8.0版本 支持設(shè)備 Pixel XL、Pixel)
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-8.0.0_r2 repo sync
-
-
2.構(gòu)建編譯環(huán)境
硬件要求:
64位的操作系統(tǒng)只能編譯2.3.x以上的版本,如果你想要編譯2.3.x以下的,那么需要32位的操作系統(tǒng).
磁盤空間越多越好,至少在100GB以上.意思就是,你可以去買個(gè)大點(diǎn)的硬盤了
如果你想要在是在虛擬機(jī)運(yùn)行l(wèi)inux,那么至少需要16GB的RAM/swap.軟件要求
-
安裝 openJDK 8
sudo apt-get update sudo apt-get install openjdk-8-jdk
-
依賴設(shè)置:
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
- 依賴設(shè)置中有可能會(huì)出現(xiàn)“無法定位軟件包 libesd0-dev” 這個(gè)問題
解決方案: 在etc/apt 的sources.list 添加鏡像源 deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse 然后 sudo apt-get update 接著繼續(xù)使用該命令安裝就可以了
-
操作系統(tǒng)要求
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 -
官方編譯環(huán)境搭建文檔地址
-
初始化編譯環(huán)境
source build/envsetup.sh 或者 . build/envsetup.sh
- 選擇目標(biāo)
. lunch aosp_arm64-eng
該命令表示針對模擬器進(jìn)行完整編譯郊闯,并且所有調(diào)試功能均處于啟用狀態(tài)。
如果您沒有提供任何參數(shù)就運(yùn)行命令,lunch 將提示您從菜單中選擇一個(gè)目標(biāo)团赁。
所有編譯目標(biāo)都采用 BUILD-BUILDTYPE 形式育拨,其中 BUILD 是表示特定功能組合的代號。-
BUILDTYPE 是以下類型之一:
編譯類型 使用情況 user 權(quán)限受限欢摄;適用于生產(chǎn)環(huán)境(沒有root權(quán)和dedug等) userdebug 在user版本的基礎(chǔ)上開放了root權(quán)限和debug權(quán)限. eng 開發(fā)工程師的版本,擁有最大的權(quán)限,此外還附帶了許多debug工具
-
3.編譯源碼
- 您可以使用make編譯任何代碼熬丧。GNUMake可以借助 -jN參數(shù)處理并行任務(wù),通常使用的任務(wù)數(shù)N介于編譯時(shí)所用計(jì)算機(jī)上硬件線程數(shù)的1-2倍之間怀挠。例如析蝴,在一臺雙核 E5520 計(jì)算機(jī)(2 個(gè) CPU,每個(gè) CPU 4 個(gè)內(nèi)核绿淋,每個(gè)內(nèi)核2個(gè)線程)上闷畸,要實(shí)現(xiàn)最快的編譯速度,可以使用介于make -j16 到 make -j32 之間的命令躬它。
make -j8
-
編譯中
-
4.編譯完成運(yùn)行
-
運(yùn)行模擬器
//依次輸入以下命令(如果是在編譯成功源碼之后直接想運(yùn)行模擬器腾啥,則直接輸入emulator命令就行东涡,因?yàn)榍懊婢幾g源碼已經(jīng)輸入過以上兩條命令) . build/envsetup.sh lunch(選擇剛才你編譯源碼設(shè)置的目標(biāo)版本) emulator
-
-
將源碼導(dǎo)入Android Studio 查看
-
編譯idegen
source build/envsetup.sh // 將執(zhí)行文件設(shè)置為臨時(shí)變量 mmm development/tools/idegen/ //生成idegen.jar文件(#### build completed successfully (49 seconds) #### 標(biāo)識生成idegen.jar文件)
-
執(zhí)行腳本 idegen.sh
. development/tools/idegen/idegen.sh
看到下圖冯吓,表示編譯idegen完成,執(zhí)行成功后在asop的根目錄下生成android.ipr和android.iml兩個(gè)個(gè)文件:
- android.ipr 一般保存了工程相關(guān)的設(shè)置疮跑,比如modules和modules libraries的路徑组贺,編譯器配置,入口點(diǎn)等。
-
android.iml 用來描述modules。它包括modules路徑才写、 依賴關(guān)系傲茄,順序設(shè)置等。一個(gè)項(xiàng)目可以包含多個(gè) *.iml 文件移盆。
- 打開Android Studio,選擇File->Open彈出路徑選擇框,輸入相應(yīng)的源碼根路徑仪吧,然后選擇android.ipr文件,就開始導(dǎo)入源碼,導(dǎo)入快慢和電腦性能有關(guān)鞠眉,一般10至20分鐘薯鼠。
- 至此整個(gè)源碼編譯完成,并可進(jìn)行源碼查看械蹋。
-
-
編譯中遇到的坑
-
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.確認(rèn)是否配置好了JDK的環(huán)境變量
- 解決 :
-
-
openJDK 配置環(huán)境變量方法
1.用gedit文本編輯器在/etc/profile中添加環(huán)境變量: 命令 : 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出現(xiàn)問題
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
-
編譯出現(xiàn) Try increasing heap size with java option '-Xmx<size>'出皇,編譯失敗
解決方案,依次執(zhí)行以下命令 export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" jack-admin kill-server && jack-admin start-server
最后
到此哗戈,Android源碼編譯完成郊艘,源碼編譯是一個(gè)需要耐心的過程,希望看到文章的你也可以編譯成功。文章中如果有錯(cuò)誤纱注,請大家給我提出來步做,大家一起學(xué)習(xí)進(jìn)步,如果覺得我的文章給予你幫助奈附,也請給我一個(gè)喜歡或者關(guān)注全度。
-
參考資料
動(dòng)手實(shí)現(xiàn)Android源碼(AOSP)的下載、編譯斥滤、運(yùn)行将鸵、導(dǎo)入、調(diào)試