macOS 13.5 編譯Android11.0源碼并導(dǎo)入android studio 并且刷機(jī)
1、準(zhǔn)備編譯環(huán)境
1. 電腦配置和版本
- macOS Ventura 版本 13.5
- xcode-select version 2397
- aosp分支:android-11.0.0_r1

2. 安裝jdk、xcode、依賴庫(kù)
具體參考官方文檔
- 安裝 jdk8u45 or newer
- 安裝xcode命令行
- 安裝編譯依賴庫(kù)
xcode-select --install brew install gmake libsdl git gnupg
3. 設(shè)置可以同時(shí)打開(kāi)的文件數(shù)限制,避免編譯時(shí)超出限制
在 ~/.bash_profile 添加如下語(yǔ)句
# set the number of open files to be 1024 ulimit -S -n 1024
4. 創(chuàng)建區(qū)分大小寫(xiě)的APFS宗卷
官方文檔創(chuàng)建的是區(qū)分大小寫(xiě)HFS+磁盤(pán)鏡像,我們這邊使用區(qū)分大小寫(xiě)的APFS卷宗

操作步驟:
step1.打開(kāi)磁盤(pán)工具按下圖步驟操作:

step2. 設(shè)置宗卷大小
具體大小根據(jù)自己情況設(shè)定,配額大小最好不要小于200G

2、下載aosp源碼
1. Googleapi 下載
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
repo init -u https://android.googlesource.com/platform/manifest -b android11-dev
2. Tsinghua 源下載
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo chmod a+x ~/bin/repo export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/' repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android11-dev
或者
curl https://gerrit-googlesource.lug.ustc.edu.cn/git-repo > ~/bin/repoh
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android11-dev --repo-url=https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
3、編譯
編譯命令
source build/envsetup.sh lunch 47 make -j128

問(wèn)題1:Could not find a supported mac sdk(mac sdk 版本不匹配)
錯(cuò)誤日志如下:

解決方案1:
可以去 github 下載支持的SDK版本,然后解壓縮到以下目錄:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
例如日志中支持的最新SDK版本是10.15,所以我下載了該版本并直接解壓縮到上面的目錄,然后繼續(xù)開(kāi)編:
處理方案:
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist

修改成 10.15 即可解決此問(wèn)題。


注意:如果本機(jī)的MacOSX SDK的版本是11.\*和受支持的sdk版本已經(jīng)相差一個(gè)大版本了,建議最好不要直接按網(wǎng)上的方案一樣去在受支持的SDK列表中添加該版本,會(huì)導(dǎo)致很多意外的問(wèn)題,本人嘗試了幾次均以失敗告終。過(guò)程記錄在文末 其他 部分。
問(wèn)題2:too many open files(同時(shí)開(kāi)啟的文件太多)
錯(cuò)誤日志如下:

解決方案:在~/.bash_profile最后面添加以下內(nèi)容:
ulimit -S -n 2048
添加完后需執(zhí)行source命令使其立即生效:
source ~/.bash_profile
經(jīng)過(guò)近3個(gè)小時(shí)的等待,終于編譯成功

4、運(yùn)行模擬器刷機(jī)
直接執(zhí)行emulator命令,剛編譯的系統(tǒng)就刷在模擬器中了:

5、使用android studio閱讀源碼
如無(wú)特殊說(shuō)明,以下命令執(zhí)行都在所下載源碼的根目錄下。
1、生成工程信息文件
依次執(zhí)行以下命令,生成IDE工程信息文件 android.ipr 和 android.iml
source build/envsetup.sh mmma development/tools/idegen development/tools/idegen/idegen.sh
2、修改android studio配置
加大idea VM內(nèi)存:
打開(kāi)IDEA 菜單欄 Help > Edit Custom VM Options,添加
// Help > Edit Custom VM Options
-Xms1g
-Xmx5g
修改文件大小限制,打開(kāi)區(qū)分大小寫(xiě)選項(xiàng)
打開(kāi)IDEA 菜單欄 Help -> Edit custom properties, 添加
idea.max.intellisense.filesize=100000 idea.case.sensitive.fs=true
NOTE: 重啟IDEA使配置生效。
3、重啟
重啟idea使配置生效,然后用idea打開(kāi)第一步中生成的 android.ipr 文件,由于工程很大,需要較長(zhǎng)的時(shí)間建立索引(我這臺(tái)機(jī)器花了將近2個(gè)小時(shí)),請(qǐng)耐心等待。
4、創(chuàng)建JDK 1.8 (No Libraries)
此時(shí)當(dāng)我們打開(kāi)文件的時(shí)候,IDE會(huì)有以下提示

所以我們需要?jiǎng)?chuàng)建JDK 1.8 (No Libraries),點(diǎn)擊 Configure...,然后選擇Add JDK

直接選擇jdk1.8.0_181.jdk/Contents/Home,open之后JDK 1.8 (No Libraries)就創(chuàng)建好了

然后我們需要在項(xiàng)目的SDK 配置中刪掉剛才創(chuàng)建的JDK 1.8 (No Libraries)中Classpath里面所有的jar,以保證跳轉(zhuǎn)到AOSP的源碼而不是系統(tǒng)安裝的JDK中:

5、刪除Modules中的dependencies

6、添加生成的資源文件ID目錄

完成以上步驟然后同步一下,就可以愉快的在idea中閱讀Android源碼了,相比于使用sublime等純文本工具閱讀代碼,這種方式的優(yōu)勢(shì)在于在跟進(jìn)方法調(diào)用時(shí)很方便,可以直接control+鼠標(biāo)左鍵 進(jìn)行代碼跳轉(zhuǎn),而這種便捷的代價(jià)就是可能需要花上數(shù)天完成 環(huán)境配置 + 代碼下載 + 源碼整編。
7、其他
本節(jié)主要記錄編譯過(guò)程中的走彎路歷程。
在遇到 Could not find a supported mac sdk問(wèn)題之后網(wǎng)上查閱資料,大部分建議為直接在受支持的mac sdk列表中添加當(dāng)前SDK版本過(guò)程如下:
首先查看本機(jī)SDK版本:
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ ls

然后在/build/soong/cc/config/x86_darwin_host.go文件中添加該版本:
darwinSupportedSdkVersions = []string{
"10.10",
"10.11",
"10.12",
"10.13",
"10.14",
"10.15",
"11.1",
"13.5",
}
添加完后,緊接著遇到了下面的問(wèn)題:
system/core/base/cmsg.cpp:36:21: error: use of undeclared identifier 'PAGE_SIZE'
碰到了代碼的問(wèn)題,PAGE_SIZE這個(gè)變量未定義,詳細(xì)日志如下:

解決方案
satckoverflow 上有人碰到類似的問(wèn)題,看到下面有回復(fù)說(shuō)是配置mac os sdk版本的問(wèn)題,有點(diǎn)慌了,不過(guò)還是按照第二個(gè)方案改了一下:
在/system/core/base/include/android-base/cmsg.h中添加如下內(nèi)容:
#ifndef PAGE_SIZE #define PAGE_SIZE (size_t)(sysconf(_SC_PAGESIZE)) #endif
在這個(gè)回答下面,答主還提到了后續(xù)會(huì)遇到的問(wèn)題,不過(guò)實(shí)踐是檢驗(yàn)真理的唯一標(biāo)準(zhǔn),不自己試試怎么知道呢,繼續(xù)編譯
building。。。
果然遇到了他說(shuō)的那個(gè)問(wèn)題,看樣子太新的Mac系統(tǒng)編Android系統(tǒng)代碼確實(shí)會(huì)有很多問(wèn)題
passing argument to parameter 'bufsize' here

解決方案
按照上一個(gè)回答的解決思路嘗試:
在external/python/cpython2/Modules/getpath.c找到以下內(nèi)容:
#ifdef __APPLE__ #if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_4 uint32_t nsexeclength = MAXPATHLEN; #else unsigned long nsexeclength = MAXPATHLEN; #endif #endif
然后將上面內(nèi)容修改為:
#ifdef __APPLE__ uint32_t nsexeclength = MAXPATHLEN; #endif
經(jīng)過(guò)漫長(zhǎng)的等待后,發(fā)現(xiàn)這么修改并不能解決問(wèn)題,至此放棄修改受支持的SDK版本列表。
6、刷機(jī)
1. 刷機(jī)的配置
export ANDROID_PRODUCT_OUT=~/android_13/out
2. 全刷命令
adb reboot bootloader fastboot flashing unlock fastboot reboot fastboot fastboot flashall -w
3. 單刷命令
fastboot flash system system.img fastboot devices //加載fastboot驅(qū)動(dòng) fastboot erase xxxx //假如我要擦除RECOVERY 就是:fastboot erase recovery 刷BOOT fastboot flash boot boot.img 臨時(shí)刷 recovery:fastboot boot recovery.img 請(qǐng)勿隨便刷這個(gè) fastboot flash hboot hboot.img fastboot flash system system.img fastboot flash userdata userdata.img fastboot flash recovery recovery.img fastboot flash radio radio.img fastboot reboot

浙公網(wǎng)安備 33010602011771號(hào)