蘋果電腦能編譯 Android 原始碼嗎?
其實早在 2016 年的時候,我就使用 ubuntu 編譯過 Android 的原始碼,可是那個時候並沒有深耕,所以一直也沒有再進行過相關文章的釋出。
時隔至今,當我想再深入 framework 的時候,我已經沒有裝置來安裝 Linux 系統了,因為現在一直都是用 Mac os 電腦來開發。
不過翻閱了 Android Developer 官網,發現現在 Mac os 也能夠編譯 Android 原始碼了,這是驚喜萬分啊!
那麼如果你也有學習 framework 的想法,或者想單純的編譯一下原始碼,那麼就繼續讀下去吧~~~
其實按照官網給的流程走一遍就能夠成功了,不過由於我在走流程的過程中不是那麼順利,所以寫下這篇文章,算為各位讀者老爺趟一下。
從準備工作到編譯一共分為 9 步:
第一步、建立區分大小寫的磁碟映像
上圖是官網的提示操作,當然不建議自己去磁碟工具那去搞,只需要直接在 terminal 中用下方的命令建立即可
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS ' -size 200g ~/android.dmg
這樣,我們就建立了大小為 200 G 的磁碟映像檔案。該檔案在裝載後可用作具有 Android 開發所需格式的儲存卷。為什麼這麼大呢?因為後期的原始碼和編譯需要用到這麼大的空間,所以最好是準備這麼大了。
如果你的電腦儲存不夠大,那麼也可以使用下方的命令對大小進行調整。
hdiutil resize -sizeg ~/android.dmg.sparseimage
比如
hdiutil resize -size 60g ~/android.dmg.sparseimage
這樣就把剛才的映像檔案調整為 60G 大小。
建立好之後,我們先不要急著掛載操作,我們先看後面的步驟。
第二步、安裝 JDK
我們都安裝過 JDK ,所以本步驟略。
第三步、安裝 xcode
去官網安裝對應的 xcode 版本即可,我電腦系統是 10.14
安裝的 xcode 11.3.1
同時也安裝了 11.3 版本的 xcode 命令列工具。
第四步、安裝MacPorts
通過 macports.org 安裝 MacPorts。
需要注意的是,我的電腦在進入安裝過程的時候很慢,不知道是不是都這樣,如果你的安裝也很慢,那麼就多等會兒吧,我大概等了5分鐘
安裝完後,修改 ~/.bash_profile 配置檔案
將
export PATH=/opt/local/bin:$PATH
新增到配置檔案 ~/.bash_profile中。
第五步、通過 MacPorts 獲取 Make、Git 和 GPG 程式包
使用下面命令即可
POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg
同樣,安裝過程依舊很慢,主要和獲取程式包的速度有關係,這一步我等了幾十分鐘...
不過耐心點,最後都是能裝好的。
第六步、設定檔案描述符數量上限
在 Mac os 中,可同時開啟的檔案描述符的預設數量上限太低,在高度並行的編譯流程中,可能會超出此上限。
要提高此上限,請將下列行新增到 ~/.bash_profile 中:
ulimit -S -n 1024
這樣我們就把「可同時開啟的檔案描述符的預設數量上限」調整為了 1024 個。
第七步、準備原始碼
① 安裝 Repo
首先確保主目錄下有一個 bin/ 目錄,並且該目錄包含在路徑中
mkdir ~/binPATH=~/bin:$PATH
然後下載 Repo 工具,並確保它可執行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repochmod a x ~/bin/repo
② 初始化 Repo 客戶端
建立一個空目錄來存放工作檔案。WORKING_DIRECTORY 名字自己定義
mkdir WORKING_DIRECTORY cd WORKING_DIRECTORY
然後,配置 git 資訊
git config --global user.name "Your Name"git config --global user.email "[email protected]"
最後,初始化 Repo
repo init -u https://android.googlesource.com/platform/manifest
如果報 repo: command not found 的問題,那麼只需執行下方命令即可
echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc export PATH=$PATH:$HOME/bin
很可惜,這一步不能順利進行下去了...
這個時候我們只能通過「映象」來解決了,這裡我們用「清華映象」,整個映象大小為 80 G 左右,所以一定要將電腦的剩餘空間多騰一些... 或者是外接行動硬碟。
繼續下載,於是開始了漫長的等待...
功夫不負有心人,終於下載完了。
不過下一步,該看下你的電腦硬碟的剩餘空間了,因為這個壓縮版就有80 G,那麼解壓之後就會超過100G,所以如果你的電腦剩餘空間沒有100 G 以上,那麼建議把這個原始碼包放到行動硬碟裡面,然後再從行動硬碟解壓吧。
解壓
解壓完成後,我們會得到一個.repo 的資料夾
然後,我們將原始碼進行同步
repo sync
同步時間很長,我這個電腦同步了差不多25分鐘,這樣我們的Android 原始碼就準備好了,同步完成後的 aosp 結構如下
第八步、準備編譯
① 下載預覽二進位制檔案
下載下來後,解壓得到
② 然後執行這個 sh 檔案
sh 檔名.sh
需要看下協議
安裝完成
③ 安裝完成後,會在執行 su 命令的目錄下建立一個 vendor 的資料夾
將此資料夾複製到原始碼的根目錄下,即 aosp 目錄下。
④ 然後執行
make -f Makefile clobber
以避免之前進行的 build 干擾到接下來的 build。
第九步、開始編譯
① 先初始化環境
source build/envsetup.sh
② 然後使用 lunch 展示要編譯的目標
這裡我選擇了 24,所以後期可以直接執行 lunch 24 即可,注意這裡的選擇跟你手上有什麼型號的裝置有關係,由於我手頭上沒有 Google 親兒子的機器,所以這裡就隨便編譯一個了。
現在我們直接進入下一步:編譯階段
使用 make 編譯程式碼,如果想增加編譯速度,可以藉助 -jN 引數處理並行任務,比如我的電腦是雙核4執行緒的,最快編譯速度可以達到 8個執行緒同時編譯,所以可以使用
make -j8
進行編譯。第一次編譯的時間很長很長,建議早上把電腦開啟,然後讓他開始編譯去吧,我是快要吃晚飯的時候發現編譯好了...
看到綠色的字出現,我就鬆了一口氣,這幾天的折騰沒有白費啊!
#### build completed successfully (01:04:37 (hh:mm:ss)) ####
這樣我們的原始碼就算編譯好了,在
aosp->out->target->product 下就有我們要用的原始碼了。
執行模擬器
如果在 Linux 系統下,直接執行 emulator 命令就能將我們編譯好的 aosp 跑到虛擬機器裡面去。
而 Mac os 則比較費勁了,反正我嘗試了各種辦法,最終還是沒有將編譯好的程式碼跑到虛擬機器上。
這兩天考慮搞個 nexus 手機或者 pixel 手機,來刷下 aosp 原始碼。
現在先將輸入的流程標記一下,等手機送到時再開搞,到時候說不定我會再發一個後續的文章。
將 “編譯後的程式碼” 刷入到真機流程
① 插上真機
② 執行
sudo adb reboot bootloader
讓手機重啟成為 fastboot 模式
如果此時手機介面展示
DEVICE_STATE - locked
那麼需要再執行
fastboot oem unlock
讓手機解鎖
③輸入
fastboot flashall -w
刷入我們編譯好的 “原始碼”,然後等待即可。
由於目前沒有真實的測試刷入的流程是否會有異常,這裡我就不多說了。
如果看了這篇文章的朋友,恰好手頭上有 nexus 手機 或者 pixel 手機,一定要先搜尋瞭解自己的手機可以恢復原系統的方法之後,再進行本文章的刷機操作;
並且在編譯原始碼的時候,一定要先選擇自己手機支援的原始碼,再進行後續操作。
否則手機刷成磚後就刷不回來,那就浪費了~~~
本篇文章就到這裡,雖然歷時將近一週,其實本身並不難,只要按照流程一步一步來就行,只不過由於下載原始碼、解壓、同步、編譯會耗費點時間,所以拖到了今天。
後續有關 framework 的文章也會持續輸出,敬請期待!