前言
為了學(xué)習(xí)安卓源碼的編譯過(guò)程,以及給Pixel4手機(jī)燒錄鏡像彬向,筆者利用手頭的兩臺(tái)電腦進(jìn)行了編譯AOSP的嘗試,
兩臺(tái)設(shè)備分別為:
1、黑蘋(píng)果(Based on 19款聯(lián)想小新pro13)谷饿,i7 10710U 6核12線程+16GB,OS版本Big Sur 11.5.1妈倔,以下稱(chēng)為Intel平臺(tái)
2博投、21款Macbook Pro 16,M1MAX 10核+32GB启涯,OS版本Monterey 12.5.1贬堵,以下稱(chēng)為Apple Silicon平臺(tái)
AOSP版本為Android11 r46
先說(shuō)結(jié)論:兩臺(tái)設(shè)備均可以完成編譯,但編譯過(guò)程中會(huì)報(bào)出大量錯(cuò)誤结洼,排除這些錯(cuò)誤需要花費(fèi)很多的時(shí)間黎做,而且其中錯(cuò)誤需要修改源碼來(lái)解決,這可能帶來(lái)潛在的問(wèn)題松忍。
另外蒸殿,谷歌官方文檔已提示:
但是如果你堅(jiān)持要嘗試鸣峭,請(qǐng)繼續(xù)往下看:
一宏所、準(zhǔn)備磁盤(pán)
因?yàn)镸acOS的磁盤(pán)默認(rèn)為APFS不區(qū)分大小寫(xiě)格式,而AOSP的編譯需要在區(qū)分大小寫(xiě)的文件系統(tǒng)中運(yùn)行摊溶,所以需要開(kāi)辟一塊磁盤(pán)
操作步驟:
-
打開(kāi)磁盤(pán)工具爬骤,選中Macintosh HD宗卷,點(diǎn)擊“+”莫换,名稱(chēng)自己定義竟秫,格式選擇APFS(區(qū)分大小寫(xiě))理朋,大小選項(xiàng)中設(shè)置至少200GB的空間
添加磁盤(pán) -
點(diǎn)擊確定后蹲坷,在/Volumes/下會(huì)自動(dòng)掛載所開(kāi)辟的磁盤(pán)
掛載磁盤(pán)
二浦夷、安裝配置
1、安裝python喊暖、git和Xcode
- python和git的安裝沒(méi)什么好說(shuō)的惫企,安裝方法很多,請(qǐng)自行百度
但需要注意陵叽,MacOS從12.3版本開(kāi)始系統(tǒng)不再預(yù)置python2狞尔,需要手動(dòng)下載安裝
安裝Xcode直接在AppStore下載即可,安裝過(guò)程很慢巩掺,需要耐心等待 - 配置git config
git config --global user.name "Your Name"
git config --global user.email "you@example.com"
4沪么、創(chuàng)建bin目錄
- mkdir ~/bin
- PATH=~/bin:$PATH
5、下載repo
curl?https://storage.googleapis.com/git-repo-downloads/repo?>?~/bin/repo?//google地址锌半,需要翻墻
curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT'|base64 -d > ~/bin/repo//若上?地址不能訪問(wèn)禽车,可使?中科?地址
chmod a+x ~/bin/repo
由于repo運(yùn)行過(guò)程中會(huì)嘗試訪問(wèn)官方的git源更新自己寇漫,因此建議使用utsc鏡像源進(jìn)行更新
在 ~/.bash_profile新增
export REPO_URL='https://gerrit-googlesource.proxy.ustclug.org/git-repo'
6、執(zhí)行source ~/.bash_profile
三殉摔、 源碼下載
1州胳、進(jìn)入準(zhǔn)備好的磁盤(pán)
2、創(chuàng)建源碼存放的文件夾逸月,進(jìn)入文件夾
mkdir AOSP_11
cd AOSP_11
3栓撞、查看源代碼標(biāo)記
打開(kāi)谷歌的源代碼標(biāo)記文檔,從中選擇想要同步的分支碗硬,筆者這里選擇的是android-11.0.0_r46瓤湘,因?yàn)樗亲詈笠粋€(gè)適配Pixel4的Andoird11小版本
https://source.android.com/setup/start/build-numbers#source-code-tags-and-builds
由于上面的鏈接需要翻墻,所以也提供如下的utsc鏈接供查找
http://mirrors.ustc.edu.cn/aosp/platform/manifest.git/refs/tags/
4恩尾、初始化
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-11.0.0_r46
若想下載其他版本弛说,可用對(duì)應(yīng)的標(biāo)記來(lái)替換android-11.0.0_r46
5、同步源代碼樹(shù)
建議使用以下的命令
repo?sync?-c?--no-tags?--prune?-f?-j4?
其中-j4表示使用4個(gè)線程翰意,但注意不要開(kāi)過(guò)多的線程木人,否則服務(wù)器會(huì)拒絕你的訪問(wèn)
四、編譯
1冀偶、初始化環(huán)境:
- 在AOSP_11目錄下醒第,執(zhí)行envsetup.sh腳本初始化環(huán)境
source build/envsetup.sh
- 清理之前編譯的輸出文件:
make clobber
- 選擇編譯目標(biāo)
lunch
- 執(zhí)行上面的命令后,終端會(huì)輸出如下提示信息:
You're building on Darwin
Lunch menu... pick a combo:
1. aosp_arm-eng
2. aosp_arm64-eng
3. aosp_blueline-userdebug
4. aosp_blueline_car-userdebug
5. aosp_bonito-userdebug
6. aosp_bonito_car-userdebug
7. aosp_bramble-userdebug
8. aosp_car_arm-userdebug
9. aosp_car_arm64-userdebug
10. aosp_car_x86-userdebug
11. aosp_car_x86_64-userdebug
12. aosp_cf_arm64_auto-userdebug
13. aosp_cf_arm64_phone-userdebug
14. aosp_cf_x86_64_phone-userdebug
15. aosp_cf_x86_auto-userdebug
16. aosp_cf_x86_phone-userdebug
17. aosp_cf_x86_tv-userdebug
18. aosp_coral-userdebug
19. aosp_coral_car-userdebug
20. aosp_crosshatch-userdebug
21. aosp_crosshatch_car-userdebug
22. aosp_flame-userdebug
23. aosp_flame_car-userdebug
24. aosp_redfin-userdebug
25. aosp_sargo-userdebug
26. aosp_sunfish-userdebug
27. aosp_trout_arm64-userdebug
28. aosp_trout_x86-userdebug
29. aosp_x86-eng
30. aosp_x86_64-eng
31. arm_krait-eng
32. arm_v7_v8-eng
33. armv8-eng
34. armv8_kryo385-eng
35. beagle_x15-userdebug
36. beagle_x15_auto-userdebug
37. car_x86_64-userdebug
38. db845c-userdebug
39. fuchsia_arm64-eng
40. fuchsia_x86_64-eng
41. hikey-userdebug
42. hikey64_only-userdebug
43. hikey960-userdebug
44. hikey960_tv-userdebug
45. hikey_tv-userdebug
46. pixel3_mainline-userdebug
47. poplar-eng
48. poplar-user
49. poplar-userdebug
50. qemu_trusty_arm64-userdebug
51. silvermont-eng
52. uml-userdebug
53. yukawa-userdebug
54. yukawa_sei510-userdebug
Which would you like? [aosp_arm-eng]
關(guān)于lunch選擇进鸠,官方文檔有如下說(shuō)明
Pixel4代號(hào)flame稠曼,因此筆者選擇22并回車(chē),輸出如下:
//Intel平臺(tái)
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=11
TARGET_PRODUCT=aosp_flame
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-20.6.0-x86_64-10.16
HOST_BUILD_TYPE=release
BUILD_ID=RQ3A.211001.001
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=hardware/google/av hardware/google/camera hardware/google/interfaces hardware/google/pixel device/google/coral hardware/qcom/sm8150/display hardware/qcom/sm8150/data/ipacfg-mgr hardware/qcom/sm8150/gps vendor/google/airbrush/floral vendor/google/biometrics/face vendor/google/camera vendor/google/darwinn vendor/qcom/sm8150 vendor/qcom/sm8150/proprietary/commonsys/telephony-apps/DataStatusNotification vendor/qcom/sm8150/proprietary/gps vendor/qcom/sm8150/codeaurora/location vendor/google/interfaces vendor/qcom/sensors vendor/google/tools/sensors vendor/qcom/sm7250/codeaurora/commonsys/telephony/ims/ims-ext-common vendor/qcom/sm7250/codeaurora/dataservices/rmnetctl vendor/qcom/sm7250/proprietary/commonsys/qcrilOemHook vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/ims vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/QtiTelephonyService vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/xdivert vendor/qcom/sm7250/proprietary/qcril-data-hal vendor/qcom/sm7250/proprietary/qcril-hal vendor/qcom/sm7250/proprietary/data
//Apple Silicon平臺(tái)
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=11
TARGET_PRODUCT=aosp_flame
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-21.6.0-x86_64-12.5.1
HOST_BUILD_TYPE=release
BUILD_ID=RQ3A.211001.001
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=hardware/google/av hardware/google/camera hardware/google/interfaces hardware/google/pixel device/google/coral hardware/qcom/sm8150/display hardware/qcom/sm8150/data/ipacfg-mgr hardware/qcom/sm8150/gps vendor/google/airbrush/floral vendor/google/biometrics/face vendor/google/camera vendor/google/darwinn vendor/qcom/sm8150 vendor/qcom/sm8150/proprietary/commonsys/telephony-apps/DataStatusNotification vendor/qcom/sm8150/proprietary/gps vendor/qcom/sm8150/codeaurora/location vendor/google/interfaces vendor/qcom/sensors vendor/google/tools/sensors vendor/qcom/sm7250/codeaurora/commonsys/telephony/ims/ims-ext-common vendor/qcom/sm7250/codeaurora/dataservices/rmnetctl vendor/qcom/sm7250/proprietary/commonsys/qcrilOemHook vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/ims vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/QtiTelephonyService vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/xdivert vendor/qcom/sm7250/proprietary/qcril-data-hal vendor/qcom/sm7250/proprietary/qcril-hal vendor/qcom/sm7250/proprietary/data
你會(huì)發(fā)現(xiàn)客年,Apple Silicon平臺(tái)也被識(shí)別成了HOST_ARCH=x86_64霞幅,但是不用管,繼續(xù)下一步
- 開(kāi)始編譯代碼:
使用 make 編譯代碼搀罢,GNU Make 同樣可以借助 -jN 參數(shù)處理并行任務(wù),通常使用的任務(wù)數(shù) N 介于編譯時(shí)所用計(jì)算機(jī)上硬件線程數(shù)的 1-2 倍之間侥猩,筆者這里參照i7 10710的規(guī)格榔至,線程數(shù)統(tǒng)一選擇12
make -j12
- 執(zhí)行完之后,開(kāi)始編譯并輸出:
//Intel平臺(tái)
13:51:59 ************************************************************
13:51:59 You are building on a machine with 16GB of RAM
13:51:59
13:51:59 The minimum required amount of free memory is around 16GB,
13:51:59 and even with that, some configurations may not work.
13:51:59
13:51:59 If you run into segfaults or other errors, try reducing your
13:51:59 -j value.
13:51:59 ************************************************************
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=11
TARGET_PRODUCT=aosp_flame
//Apple Silicon平臺(tái)
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=11
TARGET_PRODUCT=aosp_flame
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_OS=darwin
HOST_OS_EXTRA=Darwin-21.6.0-x86_64-12.5.1
HOST_BUILD_TYPE=release
BUILD_ID=RQ3A.211001.001
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=hardware/google/av hardware/google/camera hardware/google/interfaces hardware/google/pixel device/google/coral hardware/qcom/sm8150/display hardware/qcom/sm8150/data/ipacfg-mgr hardware/qcom/sm8150/gps vendor/google/airbrush/floral vendor/google/biometrics/face vendor/google/camera vendor/google/darwinn vendor/qcom/sm8150 vendor/qcom/sm8150/proprietary/commonsys/telephony-apps/DataStatusNotification vendor/qcom/sm8150/proprietary/gps vendor/qcom/sm8150/codeaurora/location vendor/google/interfaces vendor/qcom/sensors vendor/google/tools/sensors vendor/qcom/sm7250/codeaurora/commonsys/telephony/ims/ims-ext-common vendor/qcom/sm7250/codeaurora/dataservices/rmnetctl vendor/qcom/sm7250/proprietary/commonsys/qcrilOemHook vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/ims vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/QtiTelephonyService vendor/qcom/sm7250/proprietary/commonsys/telephony-apps/xdivert vendor/qcom/sm7250/proprietary/qcril-data-hal vendor/qcom/sm7250/proprietary/qcril-hal vendor/qcom/sm7250/proprietary/data
============================================
接下來(lái)欺劳,耐心等待即可唧取。。划提。(當(dāng)然枫弟,事情不會(huì)如此簡(jiǎn)單,有大量的坑等著你)
五鹏往、編譯遇到的坑
問(wèn)題1淡诗、Could not find a supported mac sdk
錯(cuò)誤信息:
--- FAIL: TestVndkUsingCoreVariant (0.04s)
cc_test.go:524: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:524: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:524: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
--- FAIL: TestVndkWhenVndkVersionIsNotSet (0.03s)
cc_test.go:530: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:530: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:530: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:530: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:530: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:530: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
--- FAIL: TestVndkWithHostSupported (0.04s)
cc_test.go:434: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:434: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:434: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:434: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:434: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
cc_test.go:434: "Could not find a supported mac sdk: [\"10.10\" \"10.11\" \"10.12\" \"10.13\" \"10.14\" \"10.15\"]"
FAIL
21:30:32 soong bootstrap failed with: exit status 1
ninja: build stopped: subcommand failed.
#### failed to build some targets (29 seconds) ####
1、問(wèn)題原因:
找不到支持列表中指定的mac sdk
2、解決辦法:
方法1: 直接修改/x86_darwin_host.go
- 首先按照下面的方法查看自己電腦上的 mac sdk:
cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
ls
- 如果提示找不到此目錄韩容,請(qǐng)?jiān)贏ppStore下載并安裝Xcode
- 如果已經(jīng)安裝過(guò)Xcode款违,會(huì)打印出當(dāng)前 XCode 提供的 SDK 版本號(hào),其中MacOSX.sdk為指向MacOSX12.X.sdk的軟鏈接群凶,如下
//Intel平臺(tái)
MacOSX.sdk MacOSX12.1.sdk
//Apple Silicon平臺(tái)
MacOSX.sdk MacOSX12.3.sdk
- 在/build/soong/cc/config/x86_darwin_host.go 文件中找到 “darwinSupportedSdkVersions“ 添加 MacOSX.sdk 對(duì)應(yīng)的版本號(hào)——以Intel平臺(tái)為例
darwinSupportedSdkVersions = []string{
"10.10",
"10.11",
"10.12",
"10.13",
"10.14",
"10.15",
"12.1",
}
辦法2插爹、下載支持的sdk
-
從https://github.com/phracker/MacOSX-SDKs/releases下載當(dāng)支持的sdk版本
下載sdk 解壓并將sdk放入/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs目錄下
(比較坑的是,網(wǎng)上有很多解決此問(wèn)題的指導(dǎo)到這里就結(jié)束了请梢,所以再次開(kāi)始編譯仍然會(huì)報(bào)相同的錯(cuò)赠尾!)-
修改系統(tǒng)支持的最小SDK版本
進(jìn)入/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/目錄
使用Xcode打開(kāi)Info.plist文件,將MinimumSDKVersion改成你想支持的最低版本毅弧,筆者這里修改成了10.15
修改sdk版本 由于該文件和所在目錄都有權(quán)限限制气嫁,因此無(wú)法直接修改
如果你比較懶,那就直接
sudo chmod 777 MacOSX.platform
sudo chmod 777 Info.plist
但是更建議先復(fù)制到當(dāng)前用戶有權(quán)限修改的目錄下形真,然后修改杉编,待完成修改后,復(fù)制回去:
cp /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist ~/Downloads
方法選擇:
筆者更推薦第二種方法咆霜,因?yàn)槿绻?dāng)前sdk版本和支持的sdk版本相差過(guò)大(例如筆者這種情況)時(shí)邓馒,強(qiáng)行使用新sdk會(huì)帶來(lái)更多的潛在麻煩,穩(wěn)妥起見(jiàn)還是老老實(shí)實(shí)用官方推薦的sdk吧
問(wèn)題2蛾坯、too many open files
錯(cuò)誤日志如下:
FAILED: out/soong/build.ninja
out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
error: prebuilts/sdk/Android.bp:25:1: module "metalava-sdk-android-jars": glob: fcntl: too many open files
error: system/timezone/distro/tools/Android.bp:16:1: module "create_time_zone_distro" variant "darwin_common": glob: open /Volumes/AOSP/WORKING_DIRECTORY/system/timezone/distro/tools/src/main/com/android/timezone: too many open files
error: cts/tools/vm-tests-tf/Android.bp:58:1: module "vmtests-dfh-dex-generated" variant "darwin_common": glob: fcntl: too many open files
1光酣、問(wèn)題原因:
打開(kāi)的文件數(shù)量超過(guò)了系統(tǒng)限制
2、 解決辦法:
當(dāng)然是把這個(gè)值改大一點(diǎn)
ulimit -S -n 2048
問(wèn)題3脉课、host_ldlibs: Host library '-lrt' not available
1救军、錯(cuò)誤日志:
FAILED: out/soong/build.ninja
out/soong/.bootstrap/bin/soong_build -t -l out/.module_paths/Android.bp.list -b out/soong -n out -d out/soong/build.ninja.d -globFile out/soong/.bootstrap/build-globs.ninja -o out/soong/build.ninja Android.bp
error: external/v8/Android.bp:181:16: module "v8_bytecode_builtins_list_generator" variant "darwin_x86_64": host_ldlibs: Host library `-lrt` not available
error: external/v8/Android.bp:209:16: module "v8_torque" variant "darwin_x86_64": host_ldlibs: Host library `-lrt` not available
21:48:40 soong bootstrap failed with: exit status 1
#### failed to build some targets (01:16 (mm:ss)) ####
2、問(wèn)題原因:https://stackoverflow.com/questions/47703239/ld-library-not-found-for-lrt
在舊的 Linux 系統(tǒng)中有 -lrt 供 GNU libc 使用倘零,但是在新的 glibc(after 2.17 from 2013) 之后就沒(méi)有這個(gè)了唱遭。
3、解決辦法:
在external/v8/Android.bp找到 -lrt 呈驶,把它們?nèi)孔⑨尩艏纯伞?/p>
問(wèn)題4拷泽、找不到頭文件sys/prctl.h
1、錯(cuò)誤日志:
FAILED: out/soong/.intermediates/external/v8/v8_libbase/darwin_x86_64_static/obj/external/v8/src/base/platform/platform-linux.o
prebuilts/clang/host/darwin-x86/clang-r383902b1/bin/clang++ -c -Wno-enum-compare -Wno-enum-compare-switch -Wno-null-pointer-arithmetic -Wno-null-dereference -Wno-pointer-compare -Wno-xor-used-as-pow -Wno-final-dtor-non-final-class -fPIC -funwind-tables -D__STDC_FORMAT_MACROS -D__STDC_CONSTANT_MACROS -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -mmacosx-version-min=10.10 -DMACOSX_DEPLOYMENT_TARGET=10.10 -m64 -integrated-as -fstack-protector-strong -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -no-canonical-prefixes -DNDEBUG -UDEBUG -fno-exceptions -Wno-multichar -O2 -g -fno-strict-aliasing -Werror=date-time -Werror=pragma-pack -Werror=pragma-pack-suspicious-include -D__compiler_offsetof=__builtin_offsetof -faddrsig -Werror=int-conversion -fexperimental-new-pass-manager -Wno-reserved-id-macro -Wno-unused-command-line-argument -fcolor-diagnostics -Wno-sign-compare -Wno-defaulted-function-deleted -Wno-inconsistent-missing-override -Wno-c99-designator -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -target x86_64-apple-darwin -B/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -fPIC -Wsign-promo -Wimplicit-fallthrough -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Wno-gnu-include-next -Iexternal/v8/src -Iexternal/v8 -Iexternal/libcxx/include -Iexternal/libcxxabi/include -Wall -Werror -Wno-endif-labels -Wno-implicit-fallthrough -Wno-import -Wno-format -Wno-unused-variable -Wno-unused-parameter -Wno-unused-private-field -Wno-sign-compare -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wno-undefined-var-template -Wno-non-virtual-dtor -Wno-user-defined-warnings -Wno-unused-lambda-capture -Wno-missing-braces -fno-exceptions -fvisibility=hidden -fno-rtti -g0 -Os -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ATOMIC_OBJECT_FIELD_WRITES -DV8_ATOMIC_MARKING_STATE -DV8_ENABLE_LAZY_SOURCE_POSITIONS -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_SNAPSHOT_COMPRESSION -DV8_NO_ARGUMENTS_ADAPTOR -DDISABLE_UNTRUSTED_CODE_MITIGATIONS -UANDROID -DV8_TARGET_ARCH_X64 -std=gnu++14 -D_LIBCPP_DISABLE_AVAILABILITY -nostdinc++ -Isystem/core/include -Isystem/media/audio/include -Ihardware/libhardware/include -Ihardware/libhardware_legacy/include -Ihardware/ril/include -Iframeworks/native/include -Iframeworks/native/opengl/include -Iframeworks/av/include -Ilibnativehelper/include_jni -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=fortify-source -Werror=address-of-temporary -Werror=return-type -Wno-tautological-constant-compare -Wno-tautological-type-limit-compare -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-int-in-bool-context -Wno-sizeof-array-div -Wno-tautological-overlap-compare -Wno-deprecated-copy -Wno-range-loop-construct -Wno-misleading-indentation -Wno-zero-as-null-pointer-constant -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-string-compare -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-pessimizing-move -MD -MF out/soong/.intermediates/external/v8/v8_libbase/darwin_x86_64_static/obj/external/v8/src/base/platform/platform-linux.o.d -o out/soong/.intermediates/external/v8/v8_libbase/darwin_x86_64_static/obj/external/v8/src/base/platform/platform-linux.o external/v8/src/base/platform/platform-linux.cc
external/v8/src/base/platform/platform-linux.cc:13:10: fatal error: 'sys/prctl.h' file not found
#include <sys/prctl.h>
^~~~~~~~~~~~~
1 error generated.
16:47:22 ninja failed with: exit status 1
#### failed to build some targets (02:03:51 (hh:mm:ss)) ####
2袖瞻、問(wèn)題原因:
編譯腳本錯(cuò)誤的引用了platform-linux.cc(官方放棄治療后這類(lèi)問(wèn)題會(huì)越來(lái)越多)
3司致、解決辦法:
工程目錄下全局搜索 “platform-linux”,并把 “platform-linux.cc” 改為 “platform-macos.cc”聋迎。涉及到的文件有:
external/v8/Android.libbase.bp
external/v8/BUILG.gn
external/v8/genmakefiles.py
問(wèn)題5脂矫、'mach/mach_init.h' file not found
1、錯(cuò)誤日志:
FAILED: out/soong/.intermediates/external/v8/v8_libbase/android_arm64_armv8-a_static_cfi_com.android.art.debug/obj/external/v8/src/base/platform/platform-macos.o
prebuilts/clang/host/darwin-x86/clang-r383902b1/bin/clang++ -c -Wno-enum-compare -Wno-enum-compare-switch -Wno-null-pointer-arithmetic -Wno-null-dereference -Wno-pointer-compare -Wno-xor-used-as-pow -Wno-final-dtor-non-final-class -D__ANDROID_APEX__ -D__ANDROID_SDK_VERSION__=10000 -Werror=implicit-function-declaration -DANDROID -fmessage-length=0 -W -Wall -Wno-unused -Winit-self -Wpointer-arith -no-canonical-prefixes -DNDEBUG -UDEBUG -fno-exceptions -Wno-multichar -O2 -g -fno-strict-aliasing -Werror=date-time -Werror=pragma-pack -Werror=pragma-pack-suspicious-include -D__compiler_offsetof=__builtin_offsetof -faddrsig -Werror=int-conversion -fexperimental-new-pass-manager -Wno-reserved-id-macro -Wno-unused-command-line-argument -fcolor-diagnostics -Wno-sign-compare -Wno-defaulted-function-deleted -Wno-inconsistent-missing-override -Wno-c99-designator -ftrivial-auto-var-init=zero -enable-trivial-auto-var-init-zero-knowing-it-will-be-removed-from-clang -ffunction-sections -fdata-sections -fno-short-enums -funwind-tables -fstack-protector-strong -Wa,--noexecstack -D_FORTIFY_SOURCE=2 -Wstrict-aliasing=2 -Werror=return-type -Werror=non-virtual-dtor -Werror=address -Werror=sequence-point -Werror=format-security -nostdlibinc -march=armv8-a -target aarch64-linux-android10000 -Bprebuilts/gcc/darwin-x86/aarch64/aarch64-linux-android-4.9/aarch64-linux-android/bin -fPIC -Wsign-promo -Wimplicit-fallthrough -D_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS -Wno-gnu-include-next -fvisibility-inlines-hidden -Iexternal/v8/src -Iexternal/v8 -D__LIBC_API__=10000 -D__LIBM_API__=10000 -D__LIBDL_API__=10000 -Iexternal/libcxx/include -Iexternal/libcxxabi/include -Ibionic/libc/include -Wall -Werror -Wno-endif-labels -Wno-implicit-fallthrough -Wno-import -Wno-format -Wno-unused-variable -Wno-unused-parameter -Wno-unused-private-field -Wno-sign-compare -Wno-missing-field-initializers -Wno-ignored-qualifiers -Wno-undefined-var-template -Wno-non-virtual-dtor -Wno-user-defined-warnings -Wno-unused-lambda-capture -Wno-missing-braces -fno-exceptions -fvisibility=hidden -fno-rtti -g0 -Os -DV8_TYPED_ARRAY_MAX_SIZE_IN_HEAP=64 -DV8_ATOMIC_OBJECT_FIELD_WRITES -DV8_ATOMIC_MARKING_STATE -DV8_ENABLE_LAZY_SOURCE_POSITIONS -DV8_ENABLE_REGEXP_INTERPRETER_THREADED_DISPATCH -DV8_SNAPSHOT_COMPRESSION -DV8_NO_ARGUMENTS_ADAPTOR -DDISABLE_UNTRUSTED_CODE_MITIGATIONS -DV8_TARGET_ARCH_ARM64 -flto -fsanitize-cfi-cross-dso -fsanitize-blacklist=external/compiler-rt/lib/cfi/cfi_blacklist.txt -fsanitize=cfi -fsanitize-trap=all -ftrap-function=abort -std=gnu++14 -fno-rtti -Isystem/core/include -Isystem/media/audio/include -Ihardware/libhardware/include -Ihardware/libhardware_legacy/include -Ihardware/ril/include -Iframeworks/native/include -Iframeworks/native/opengl/include -Iframeworks/av/include -isystem bionic/libc/include -isystem bionic/libc/kernel/uapi -isystem bionic/libc/kernel/uapi/asm-arm64 -isystem bionic/libc/kernel/android/scsi -isystem bionic/libc/kernel/android/uapi -Ilibnativehelper/include_jni -Werror=int-to-pointer-cast -Werror=pointer-to-int-cast -Werror=fortify-source -Werror=address-of-temporary -Werror=return-type -Wno-tautological-constant-compare -Wno-tautological-type-limit-compare -Wno-reorder-init-list -Wno-implicit-int-float-conversion -Wno-int-in-bool-context -Wno-sizeof-array-div -Wno-tautological-overlap-compare -Wno-deprecated-copy -Wno-range-loop-construct -Wno-misleading-indentation -Wno-zero-as-null-pointer-constant -Wno-deprecated-anon-enum-enum-conversion -Wno-deprecated-enum-enum-conversion -Wno-string-compare -Wno-enum-enum-conversion -Wno-enum-float-conversion -Wno-pessimizing-move -MD -MF out/soong/.intermediates/external/v8/v8_libbase/android_arm64_armv8-a_static_cfi_com.android.art.debug/obj/external/v8/src/base/platform/platform-macos.o.d -o out/soong/.intermediates/external/v8/v8_libbase/android_arm64_armv8-a_static_cfi_com.android.art.debug/obj/external/v8/src/base/platform/platform-macos.o external/v8/src/base/platform/platform-macos.cc
external/v8/src/base/platform/platform-macos.cc:9:10: fatal error: 'mach/mach_init.h' file not found
#include <mach/mach_init.h>
^~~~~~~~~~~~~~~~~~
1 error generated.
[ 50% 24333/48037] //bionic/libc:common_libc versioner preprocess include
warning: attempted to generate guard with empty availability: obsoleted = 21
warning: attempted to generate guard with empty availability: obsoleted = 23
[ 50% 24334/48037] //bionic/libc:libc.llndk versioner preprocess include
warning: attempted to generate guard with empty availability: obsoleted = 21
warning: attempted to generate guard with empty availability: obsoleted = 23
[ 50% 24335/48037] //bionic/libc:libc.llndk versioner preprocess include
warning: attempted to generate guard with empty availability: obsoleted = 21
warning: attempted to generate guard with empty availability: obsoleted = 23
10:33:54 ninja failed with: exit status 1
#### failed to build some targets (04:24 (mm:ss)) ####
2霉晕、問(wèn)題原因:
在incldue目錄下找不到指定的頭文件
3庭再、解決辦法:
這是最難頂?shù)囊粋€(gè)問(wèn)題捞奕,
Mac 系統(tǒng)的頭文件是有由Xcode 提供的,筆者已經(jīng)安裝了Xcode佩微,并配置了支持版本的SDK缝彬,在
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include/mach目錄下也能找到此頭文件
網(wǎng)上有教程提供了此問(wèn)題的解決辦法:
把MacOSX10.15.sdk/usr/include/目錄下的文件復(fù)制到 /Library/Developer/CommandLineTools/usr/include 目錄下,然后
export C_INCLUDE_PATH=/Users/xxx/Develop/mac_include/include
或者直接
export C_INCLUDE_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/usr/include
筆者嘗試了這兩種方法之后哺眯,均會(huì)報(bào)錯(cuò)谷浅,此問(wèn)題逐漸陷入無(wú)解的境地。
但是奶卓,網(wǎng)上一篇教程評(píng)論區(qū)的一條回復(fù)提醒了筆者:?jiǎn)栴}3一疯、4、5均為/externel/v8這個(gè)倉(cāng)內(nèi)的文件所引起夺姑,這個(gè)倉(cāng)最后的提交是:
commit dc02784c8323eab361da0fa9aaf796bfee98aee5 (HEAD, tag: android-11.0.0_r46, tag: android-11.0.0_r43, tag: android-11.0.0_r40, tag: android-11.0.0_r39, tag: android-11.0.0_r38, tag: m/android-11.0.0_r46, aosp/android11-qpr3-s1-release, aosp/android11-qpr3-release)
Merge: c35ae874 e11facc1
Author: android-build-team Robot <android-build-team-robot@google.com>
Date: Tue Apr 6 22:04:22 2021 +0000
Snap for 7262953 from e11facc1049b2a0c85e4f3e5ff214127851ddf2f to rvc-qpr3-release
Change-Id: Iae0a5ef411ead7201768d5c574a4676142bf7968
commit e11facc1049b2a0c85e4f3e5ff214127851ddf2f
Merge: 2eab410d 2dc37779
Author: Cindy Zhou <zhouci@google.com>
Date: Tue Apr 6 17:56:24 2021 +0000
Update v8 cfi blocklist am: 2dc3777900
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/v8/+/13949411
Change-Id: I4b8313c4d29464d13c66add8c2932aeb3655b868
其中有幾條提交值得注意:
commit 2eab410d1a22744d330b3a4565f26a52c1d1d8eb
Merge: de8ec0ef c509674b
Author: Rubin Xu <rubinxu@google.com>
Date: Wed Mar 17 14:53:58 2021 +0000
[automerger skipped] [DO NOT MERGE] Fix OSX builds for V8 am: 5658a66011 -s ours am: 05251a6458 -s ours am: 70ec779ad7 am: 655032cb7c -s ours am: c509674b68
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/v8/+/13799500
Change-Id: I8b94be689a70a2e0590244117e4f9c4a84ff26cf
commit c509674b68584088c88dd2aa04cc0d3616ef116c
Merge: bb466bed 655032cb
Author: Rubin Xu <rubinxu@google.com>
Date: Wed Mar 17 14:14:27 2021 +0000
[automerger skipped] [DO NOT MERGE] Fix OSX builds for V8 am: 5658a66011 -s ours am: 05251a6458 -s ours am: 70ec779ad7 am: 655032cb7c -s ours
am skip reason: subject contains skip directive
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/v8/+/13799500
Change-Id: Id90137931ba6224330aa4f9fb7c40ccde7d75fa2
commit 655032cb7ca217b7395649185d202c37f7681f39
Merge: 2df4129b 70ec779a
Author: Rubin Xu <rubinxu@google.com>
Date: Wed Mar 17 13:32:27 2021 +0000
[automerger skipped] [DO NOT MERGE] Fix OSX builds for V8 am: 5658a66011 -s ours am: 05251a6458 -s ours am: 70ec779ad7
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/v8/+/13799500
Change-Id: Iab9638c60ae6ba5364f304728c4e1602a1064744
可以看到墩邀,官方在2021年5月份時(shí)還在試圖修復(fù)此倉(cāng)在MacOS平臺(tái)編譯的問(wèn)題,但是前文也提到盏浙,從6月份開(kāi)始眉睹,官方就放棄維護(hù)了。因此筆者猜測(cè)废膘,此倉(cāng)在5月份之前的某些提交可能導(dǎo)致了MacOS平臺(tái)的編譯問(wèn)題竹海。
繼續(xù)尋找,發(fā)現(xiàn)有很多的提交是為了執(zhí)行操作Upgrade V8 to 8.8.278.14丐黄,例如
commit 9580a23bc5b8874a0979001d3595d027cbb68128
Author: Rubin Xu <rubinxu@google.com>
Date: Tue Feb 16 09:38:50 2021 +0000
Upgrade V8 to 8.8.278.14
Bug: 162604069
Bug: 167389063
Test: gts-tradefed run gts-dev --module GtsGmscoreHostTestCases
--test com.google.android.gts.devicepolicy.DeviceOwnerTest#testProxyPacProxyTest
Test: m -j proxy_resolver_v8_unittest && adb sync && adb shell \
/data/nativetest/proxy_resolver_v8_unittest/proxy_resolver_v8_unittest
Merged-In: Ifb09923b9d7f6d8990fb062d7dc0294edf2c098e
Change-Id: Ifb09923b9d7f6d8990fb062d7dc0294edf2c098e
于是筆者將此倉(cāng)直接回退到了2021年1月8日的版本:
cd external/v8
git reset --hard 55fc782bb8accc49ae3ed52e6856d55392e2a579
然后重新開(kāi)始編譯
至此斋配,編譯過(guò)程不再有源自v8倉(cāng)的報(bào)錯(cuò)產(chǎn)生,兩個(gè)平臺(tái)均完成了編譯:
其中Apple Silicon平臺(tái)耗時(shí)2小時(shí)23分鐘
Intel平臺(tái)耗時(shí)3小時(shí)22分
可以看到Apple Silicon平臺(tái)借助龐大的晶體管規(guī)模灌闺,編譯速度相比Intel平臺(tái)確實(shí)有一定提升艰争,但是這個(gè)提升并沒(méi)有想象中那么大。
參考鏈接
https://blog.csdn.net/dirksmaller/article/details/124977651
http://www.reibang.com/p/37f5f826b642
https://blog.csdn.net/w__y__q/article/details/121570143
https://51wlb.top/aosp/#%E9%97%AE%E9%A2%98%E4%B8%80%EF%BC%9ACould_not_find_a_supported_mac_sdk
https://blog.csdn.net/qq_34231329/article/details/125522049
http://events.jianshu.io/p/7971444b5359
http://www.reibang.com/p/5df66b910ce0
最后
筆者只是在macOS平臺(tái)嘗試了最簡(jiǎn)單的AOSP源碼編譯桂对,如果要將鏡像燒錄進(jìn)Pixel手機(jī)甩卓,還需要下載對(duì)應(yīng)機(jī)型的驅(qū)動(dòng)文件,整合進(jìn)源碼并編譯后才能燒錄
例如Pixel4對(duì)應(yīng)的驅(qū)動(dòng)
至于修改了externel/v8倉(cāng)編譯出的鏡像蕉斜,在燒錄進(jìn)手機(jī)后是否會(huì)存在問(wèn)題逾柿,筆者已沒(méi)有更多的精力去嘗試。
回到開(kāi)頭的話蛛勉,為什么筆者不建議現(xiàn)階段在MacOS平臺(tái)編譯AOSP鹿寻。因?yàn)镸acOS平臺(tái)編譯AOSP存在的變量實(shí)在太多睦柴,芯片架構(gòu)诽凌、OS大小版本、SDK版本坦敌、系統(tǒng)庫(kù)路徑侣诵、Xcode痢法、AOSP版本等等,任何一項(xiàng)不匹配都會(huì)帶來(lái)大量的問(wèn)題杜顺。人的精力是有限的财搁,為什么要編譯AOSP,是否值得花這么多時(shí)間來(lái)解決編譯環(huán)境的問(wèn)題躬络,這是我們要思考的尖奔。筆者還是建議把有限的時(shí)間投入到最核心的工作中。所以后續(xù)編譯源碼和燒錄鏡像至手機(jī)的工作穷当,筆者會(huì)切換到Linux平臺(tái)進(jìn)行提茁。
以上