1. 程式人生 > >教你如何在Mac系統下編譯Android系統的原始碼

教你如何在Mac系統下編譯Android系統的原始碼

640?wx_fmt=png&wxfrom=5&wx_lazy=1

今日科技快訊

“全國公廁雲平臺”11月19日上線試執行,彙總全國近33萬條公廁資訊,初步實現快速尋廁功能。11月19日是“世界廁所日”。據瞭解,該平臺由住房和城鄉建設部組織研發,群眾可隨時隨地尋找就近環衛部門管理的公廁和社會開發公廁。隨著系統不斷完善,還將實現評價、投訴和反饋功能,群眾如廁後可評價共享公廁資訊、提出建議或投訴,政府主管部門根據群眾意見完善基礎資料、實時監管投訴處理情況,巡查人員及時上傳投訴處理結果及日常巡查結果,不斷提升公廁管理水平。

作者簡介

本篇來自 qqdds 的投稿,主要講解了如何在Mac系統下編譯Android原始碼,希望大家喜歡。

qqdds的部落格地址:

http://www.jianshu.com/u/cfdb92fdf95c

概述

由於在工作中遇到了很多關於android內部實現的問題,雖然後面都解決了,有些是看了原始碼實現,有些原始碼看不了只能去google,百度。這就導致了對於很多的問題其實是知其然不知其所以然,所以從現在開始我下定決心開始學習Android的原始碼。那說到原始碼就必須提到編譯原始碼這件事情。

最開始是在我的MBP上面安裝了linux的雙系統準備在ubuntu上面來安裝編譯原始碼,不過這個方法有個弊端就是檢視原始碼的過程真是爽翻天啊,所以開始搗鼓再mac上面編譯原始碼

在google了一些方法之後發現比較混亂以至於難以完成,所以這次使用官方的方法來完成原始碼的編譯。

正文

系統要求:Mac OS(Intel/x86)

  • Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令列工具

  • Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令列工具

  • Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的開發者工具)

  • Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK

JDK

這裡會需要註冊一個 甲骨文的賬號

  • AOSP 中 Android 的 master 分支:(Mac OS - jdk 8u45 或更高版本)

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jdk-8u45-oth-JPR

  • Android 5.x (Lollipop) - Android 6.0 (Marshmallow):Mac OS - jdk-7u71-macosx-x64.dmg

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR

  • Android 2.3.x (Gingerbread) - Android 4.4.x (KitKat):Mac OS - Java JDK 6

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR

主要程式包

  • python

  • gmake

  • git

gmake 後面會下載的,你只需要安裝好python2.7 然而一般python是安裝好的

搭建編譯環境

  • 建立區分大小寫的磁碟映像

您可以使用磁碟映像在現有的 Mac OS 環境中建立區分大小寫的檔案系統。要建立磁碟映像,請啟動磁碟工具,然後選擇“新建映像”。完成編譯至少需要 25GB 空間;更大的空間能夠更好地滿足未來的需求。使用稀疏映像有助於節省空間,而且以後可以隨著需求的增加進行擴充套件。請務必選擇“Case sensitive, Journaled”儲存卷格式。

我推薦使用這種方式來建立磁碟映像

您也可以通過 shell 使用以下命令建立磁碟映像:

# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/android.dmg

這將建立一個 .dmg(也可能是 .dmg.sparseimage)檔案,該檔案在裝載後可用作具有 Android 開發所需格式的儲存卷。

如果您以後需要更大的儲存卷,還可以使用以下命令來調整稀疏映像的大小:

# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage

對於儲存在主目錄下的名為 android.dmg 的磁碟映像,您可以向 ~/.bash_profile 中新增輔助函式:

要在執行 mountAndroid 時裝載磁碟映像,請執行以下命令:

# mount the android file image 
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }

注意:如果系統建立的是 .dmg.sparseimage 檔案,請將 ~/android.dmg 替換成 ~/android.dmg.sparseimage。

要在執行 umountAndroid 時解除安裝磁碟映像,請執行以下命令:

# unmount the android file image 
function umountAndroid() { hdiutil detach /Volumes/android; }

裝載 android 儲存卷後,您將在其中開展所有工作。您可以像對待外接式儲存盤一樣將其彈出(解除安裝)。

  • 安裝Xcode

你只需要在AppStore 裡面安裝Xcode就可以了。

之後需要執行一下命令

$ xcode-select --install

或者你也可以選擇位元組執行命令,不過我不推薦,下個xcode有好處的哦

  • 安裝MacPorts

根據自己的系統來選擇,下載地址如下:

https://www.macports.org/install.php

編輯.bash_profile,如果沒有就新建(不用特意操作,vi可以自動生成的)

vi ~/.bash_profile

vi 的小提示,按i切換到 insert 模式就是編輯模式,按 esc 退出編輯模式,按:wq 儲存退出,複製  export PATH=/opt/local/bin:$PATH 到檔案中。

輸入 source ~/.bash_profile 使命令生效

  • 通過 MacPorts 獲取 Make、Git 和 GPG 程式包

POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

如果您使用 Mac OS X v10.4,還需要安裝 bison:

POSIXLY_CORRECT=1 sudo port install bison

在 Mac OS 中,可同時開啟的檔案描述符的預設數量上限太低,在高度並行的編譯流程中,可能會超出此上限。要提高此上限,請將下列行新增到 ~/.bash_profile 中:

ulimit -S -n 1024
  • 設定ccache

在原始碼的根目錄下執行以下命令

export USE_CCACHE=1 
export CCACHE_DIR=/<path_of_your_choice>/.ccache

下載原始碼

  • 安裝repo

確保主目錄下有一個 bin/ 目錄,並且該目錄包含在路徑中

mkdir ~/bin 
PATH=~/bin:$PATH

(要在~/.bash_profile中新增;輸入source ~/.bash_profile 使命令生效)

下載 Repo 工具,並確保它可執行

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo 
chmod a+x ~/bin/repo
  • 初始化repo客戶端

必須使用之前建立的區分大小寫的檔案系統,一般掛載的新的盤是在/Volumes/ 路徑下的

我分出來的區分大小寫的檔案系統名字是Android 所以我cd進去就ok了

建立一個目錄 mkdir XXX (XXX 是你自己取得名字)

cd XXX

如果遇到repo: command not found 問題 請在初始工作目錄輸入

echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc 
export PATH=$PATH:$HOME/bin
  • 配置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

PS:此時需要科學上網,如果不能科學上網沒有關係,我們可以通過其他的映象來完成這一步操作

  • 清華映象下載

下載地址如下:

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

首先我們可以看到僅支援 HTTPS下載,所以我們是無法使用repo來同步程式碼的,所以我們要這麼做:

  1. 下載 jar 包,地址為(https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar

  2. 然後~~等(這個包有31個G,我用迅雷慢慢下載中)

  3. 將下載完的包放在之前建立的工作目錄上

  4. tar xf aosp-latest.tar 解壓的目錄

  5. cd aosp

  6. repo sync (需要將下載的tar檔案刪除掉,不然空間有可能不夠)。此後,每次只需執行 repo sync 即可保持同步。 我們強烈建議您保持每天同步,並儘量選擇凌晨等低峰時間

  • 科大映象下載

https://lug.ustc.edu.cn/wiki/mirrors/help/aosp

科大映象沒有去掉git協議,所以我們可以順暢的完成下載按照頁面提示的操作即可

編譯準備工作

進行檔案下載

https://source.android.com/source/requirements.html#binaries

對於執行帶標記的 AOSP 版本分支的受支援裝置,您可以從Google 的 Nexus 驅動程式頁面

https://developers.google.com/android/drivers

下載相關的官方二進位制檔案。有了這些二進位制檔案,您將有權使用採用非開放原始碼的其他硬體功能。要編譯 AOSP 的 master 分支,請使用Nexus 裝置的二進位制檔案預覽

https://developers.google.com/android/blobs-preview

在針對某種裝置編譯 master 分支時,請使用適用於最新編號版本的二進位制檔案或具有最新日期的二進位制檔案。

https://source.android.com/source/build-numbers

解壓縮下載的檔案將會得到一個sh的檔案通過終端 sh xxx.sh 執行

此處需要agree使用者協議,你只需要按住向下鍵,就可以劃到最後輸入 I ACCEPT 就可以了。

sh執行完成之後會得到一個vendor資料夾,將其複製到原始碼的根目錄下

為了確保新安裝的二進位制檔案在解壓後會被適當考慮在內,請使用以下命令刪除所有以前編譯操作的已有輸出:

make clobber
  • 設定環境

使用 envsetup.sh 指令碼初始化環境

source build/envsetup.sh
  • 選擇目標

使用 lunch 選擇要編譯的目標。然後會出現對應的列表選擇其中某個數字即可

該命令表示針對模擬器進行完整編譯,並且所有除錯功能均處於啟用狀態。

如果您沒有提供任何引數就執行命令,lunch 將提示您從選單中選擇一個目標。

所有編譯目標都採用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號。

BUILDTYPE 是以下型別之一

編譯型別 使用情況
user 許可權受限;適用於生產環境
userdebug 與“user”類似,但具有 root 許可權和可除錯性;是進行除錯時的首選編譯型別
eng 具有額外除錯工具的開發配置

由於本人有一個nexus 5x 的手機 ,所以準備在nexus5x 的手機上執行自己編譯的程式碼,所以我選擇的編譯命令為aosp_bullhead-userdebug

如果想要針對真機除錯,請參閱執行版本進行命令選擇。我在這裡不建議初次接觸原始碼編譯的人進行真機除錯,刷磚了就gg了,執行版本地址如下:

https://source.android.com/source/running

  • 編譯程式碼

您可以使用 make 編譯任何程式碼。GNU Make 可以藉助 -jN 引數處理並行任務,通常使用的任務數 N 介於編譯時所用計算機上硬體執行緒數的 1-2 倍之間。例如,在一臺雙核 E5520 計算機(2 個 CPU,每個 CPU 4 個核心,每個核心 2 個執行緒)上,要實現最快的編譯速度,可以使用介於 make -j16 到 make -j32 之間的命令。

make -j17

請注意,本部分只是一個摘要,用於確保設定已完成。如需關於編譯 Android 的詳細說明,請參閱執行編譯系統。

https://source.android.com/source/running

編譯過程中遇到的問題

  • xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer directory '/Library/Developer/CommandLineTools' is a command line tools instance Answer:

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

build/core/combo/mac_version.mk:26: none of the installed SDKs (wifi-serviceac_sdk_versions_installed) match supported versions (10.8 10.9 10.10 10.11), trying 10.8

原因boxen的版本太低了需要更新,請根據此處進行更新

https://github.com/boxen/our-boxen

  • no SDK 10.8 at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk, trying legacy dir

    build/core/combo/mac_version.mk:40: *****************************************************

    build/core/combo/mac_version.mk:41: * Can not find SDK 10.8 at /Developer/SDKs/MacOSX10.8.sdk

    build/core/combo/mac_version.mk:42: *****************************************************

我們需要下載一個MacOSX10.11.sdk放到這個目錄中。因為10.12這個版本的sdk中syscall這個方法被棄用了,所以我們需要換回11這個版本的sdk,MacOSX10.11.sdk下載地址

https://github.com/phracker/MacOSX-SDKs/releases/download/10.13/MacOSX10.11.sdk.tar.xz

還有注意問題,有興趣的小夥伴可以點選左下角的閱讀原文進行檢視。

7.0 刷機

終於build完成了 真是歷經千幸萬苦啊。首先第一步 在原始碼的更目錄下輸入

sudo adb reboot bootloader

然後你就會到達這個介面

0?wx_fmt=jpeg

fastboot oem unlock

輸入這個命令 然後通過音量鍵選擇yes 通過待機鍵確認,再然後輸入

fastboot flashall -w

出現錯誤error: could not load android-info.txt: No such file or directory

export ANDROID_PRODUCT_OUT=/Volumes/android/android-7.1.1_r24/out/target/product/generic(請替換你自己的目錄)

出現錯誤error: could not load boot.img

你會發現沒有boot.img 這個檔案 這時候你只需要 

make bootimage

就會生成對應的檔案。

結語

到此為止,本文的內容已經講完了。覺得不錯的同學可以關注下作者的部落格,當然對本篇文章的內容有疑問,也可以到作者的部落格中去諮詢。

歡迎長按下圖 -> 識別圖中二維碼

或者 掃一掃 關注我的公眾號

640.png?

640?wx_fmt=jpeg