蘋果電腦能編譯 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 的文章也會持續輸出,敬請期待!