1. 程式人生 > >Mac El Capitan(10.11.6) 編譯以及燒製Nexus6P(6.0.1-MTC20F)的曲折經歷

Mac El Capitan(10.11.6) 編譯以及燒製Nexus6P(6.0.1-MTC20F)的曲折經歷

下載Android原始碼

由於以前有過Android原始碼相關的開發經驗,所以這一關倒是難不倒,重新參考官方的文件即可(http://source.android.com/source/downloading.html

搭建Mac下的編譯環境

Android官方有Mac的原始碼編譯環境搭建介紹(https://source.android.com/source/initializing.html#setting-up-a-mac-os-x-build-environment),但是裡面的坑挺多的。主要是在用MacPorts安裝GNU工具的時候,爆出來

Port gmake not found

這個問題。Google一把,原來是先要sync一遍才行。

$ sudo port -d sync
$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

編譯程式碼

以前在Ubuntu下編譯Android程式碼幾乎沒有遇到過啥問題,但願在Mac下面也能夠菩薩保佑一下吧~然而我卻在一開始就遇坑了>_<

$ . build/envsetup.sh 
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash
$ lunch 17
build/core/combo/mac_version.mk:38: *****
************************************************ build/core/combo/mac_version.mk:39: * Can not find SDK 10.6 at /Developer/SDKs/MacOSX10.6.sdk build/core/combo/mac_version.mk:40: ***************************************************** build/core/combo/mac_version.mk:41: *** Stop.. Stop. ** Don't have a product spec for: 'aosp_angler' ** Do you have the right repo manifest?

去看了下mac_version.mk,發現

mac_sdk_versions_supported :=  10.6 10.7 10.8 10.9

正好沒有10.11,於是加上10.11在後面後,lunch成功了。

正式進入編譯

由於我的Mac Pro是13寸的,只有兩個CPU~並且白天還要用它生產生活,於是我就執行的m,預設只開了一個核去編譯,這個蝸牛般的編譯從下午到晚上下班還沒停,我就把電腦掛了一晚上。希望第二天來看到奇蹟發生。然而老天總是不會讓我們太一帆風順,第二天來,編譯失敗了,錯誤如下:

stat: cannot read file system information for '%z': No such file or directory

這個時候我真蒙逼了,這是什麼鬼?放到Google上也搜不到啥結果。看來只能夠靠自己了!引用下Linus的名言:Read the fucking source code……好在這個error很是明顯,就是stat命令執行失敗了。然後我跑到build/core/裡面大致探索了一番,發現combo/HOST_darwin-x86.mk裡面有如下程式碼

define get-file-size
stat -f "%z" $(1)
endef 

嗯,看起來是獲取檔案大小的,為啥會執行失敗呢?原來是因為我安裝了coreutils這個工具集,stat被重定向到了/usr/local/opt/coreutils/libexec/gnubin/stat目錄下,和Mac原生的stat並不相容。找到問題後,

export PATH=/usr/bin/:$PATH

一下再次編譯,總算編譯再次進入正軌,一直到編譯成功!難以掩飾心中的喜悅,趕緊刷到我那飢渴的機器上面。

$ cd out/target/product/angler
$ fastboot flash system system.img
$ fastboot flash boot boot.img
$ fastboot flash recovery recovery.img
$ fastboot flash cache cache.img
$ fastboot flash userdata userdata.img
$ fastboot flash vendor vendor<tab><tab> 咋個補全不了

發現居然沒有vendor.img!這如何是好?我心裡默默想:沒事,我刷入原廠的vendor.img不就行了麼?於是在Google上下載了angler-mtc20f-factory-4355fe06.zip,解壓後刷入了裡面的vendor.img,然後fastboot reboot重啟手機,現在是不是就是見證奇蹟的時刻了?成功進入系統了,但是首先系統報了個錯

“There’s an internal problem with your device. Contact your manufacturer for details”

感覺問題應該不大,用起來都還行~~貌似沒問題,然後我插入SIM卡,想試試能不能用。然而發現這系統竟然識別不了Sim卡。網上搜了下,發現在(http://www.2cto.com/kf/201609/551334.html)解決過這個問題,原因是vendor.img裡面有一些需要依賴system.img的東西,所以需要在Android的原始碼目錄裡面編譯出來才行。但是那個文章裡面是在Ubuntu的環境下解決的。沒事,Mac下應該也是可以解決的吧。於是我執行了下面的命令

git clone [email protected].com:anestisb/android-prepare-vendor.git
./execute-all.sh -d angler -b MTC20F -o $(pwd) -i ~/nexus6p/angler-mtc20f-factory-4355fe06.zip -k

發現解壓成功後mount ext2檔案系統失敗了,因為我係統裡面沒有安裝fuseext2。去網上找到了fuseext2.dmg,解壓後安裝,發現好像太老了,已經不支援現在的Mac系統版本了。。我的天!沒事,要的就是折騰。我嘗試著去clone了 fuse-ext2來手動編譯之,但是發現按照官方說的命令,在./configure的時候又發現一直找不到libfuse庫。但是我明明已經安裝了osxfuse,而且/usr/local/include/osxfuse/目錄下也有fuse。Google無果後,我徹底放棄了在Mac下面生成Vendor的想法,果斷跑到我的搬瓦工的VPS上的Linux系統去做了。然而發現android-prepare-vendor工具只支援64位系統。我勒個擦擦擦!最後只好祭出我的大招了,安裝64Bit的Linux虛擬機器來做。下載了ubuntu-16.04.1-desktop-amd64.iso之後,迅速在VirtualBox上面裝上,然後裝上Java,以及一大堆依賴之後,終於成功生成了vendor。欣喜若狂的我立即把vendor拷貝到了Android原始碼下,然後m一下,編譯成功後,總算在out/target/product/angler/下找到了vendor.img。重新刷入所有的img後,重啟後發現那個系統的報錯也沒有了,sim卡也能夠識別了。我把生成的 vendor放到了(https://github.com/tbruceyu/angler-MTC20F_vendor)裡,如果有需要的同學就不需要經歷我這樣痛苦的生成經歷了。最後還在github上面建立了我自己的Android Repo。享受自己定製系統的快感咯~哈哈哈。

總結

遇坑不拋棄不放棄,不在一棵樹上吊死。總是能峰迴路轉的~~~另外默默的譴責Google居然不提供Vendor.img的行為。。。