在macOS 10.12 上編譯 Android 5.1

官方文檔雖然也有介紹,但是macOS平臺上的編譯環境問題還存在很多坑。本文介紹下如何在在macOS 10.12 上編譯 Android 5.1源碼,導入源碼到Android Studio中,把系統燒錄到Nexus6手機中。


搭建編譯環境

創建分區

AOSP源碼需要一個支持大小寫敏感的文件系統,100G是至少要的。官網有詳細的介紹,這裏簡單列一下。

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

然後掛載這個分區:

$ hdiutil attach ~/android.dmg -mountpoint /Volumes/android;

切換shell

Android的相關編譯只能是使用bash.

$ chsh -s /bin/bash

重啓終端。

安裝Xcode

1、這裏需要兩個Xcode,可以用命令切換需要使用的Xcode,會有不同的用處。
- 去AppStore下載最新的Xcode
- 到這裏下載5.1.1的Xcode

2、創建一個/Developer/SDK文件夾,從Xcode5.1.1中把MacOSX10.8.sdkContents/Developer/Platforms/MacOSX.platform/Developer/SDKs/複製到 /Developer/SDK中。
3、從Xcode5.1.1.dmg複製Xcode.app 到 /Developer目錄中。
4、從AppStore下載的最新版Xcode會默認放在/Applications目錄中
5、給兩個版本的Xcode都安裝command line tools

$ sudo xcode-select -switch /Developer/Xcode.app
$ xcode-select --install
$ sudo xcode-select -switch /Applications/Xcode.app
$ xcode-select --install

安裝JDK

編譯Android5.1需要jdk1.7,去官網下載.
如果有切換多個版本的jdk需求的話,可以使用jenv這個工具,參考在OS X中使用jEnv管理多個Java版本

安裝其他軟件

1、安裝MacPorts,需要去官網下載對應版本的MacPorts
2、配置port命令環境變量

$ export PATH=/opt/local/bin:$PATH

3、下載依賴包

$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg

下載源碼

直接去google官方下載會很慢,這裏推薦用中科大鏡像
1、首先下載 repo 工具。

$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可訪問,可以用下面的:
## curl https://storage-googleapis.proxy.ustclug.org/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

2、在之前創建的大小寫分區上建立一個工作目錄,之後源碼下載和編譯都在這裏進行。

$ mkdir WORKING_DIRECTORY
$ cd WORKING_DIRECTORY

3、初始化倉庫

$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示無法連接到 gerrit.googlesource.com,可以編輯 ~/bin/repo,把 REPO_URL 一行替換成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'

4、選擇某個特定的 Android 版本,具體查看這裏,我選擇的是android-5.1.1_r14,build號是LMY48M,等會用這個build號下載對應的驅動包,燒錄到nexus真機時會用到。

$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-5.1.1_r14

5、同步源碼樹

$ repo sync

源碼下載完後,如果沒有同步的需求的話,就可以把.repo目錄刪掉了,防止編譯時磁盤空間不夠用。

下載驅動

燒錄到真機時需要用到,默認只是用模擬器的話,可以跳過這步。
https://developers.google.com/android/nexus/drivers#hikey中找到對應設備與源碼分支的硬件驅動。剛纔選擇的源碼分支所對應的build碼是LMY48M,因此,就下載此代號的驅動程序即可。
下載得到的是三個tgz文件,我們只需依次解壓三個文件,得到的是三個shell腳本文件,我們先將其置於源碼根目錄中。
依次執行這3個腳本將在源碼根目錄中生成一個vendor文件夾。


編譯

設置文件描述符限制

在macOS中,默認限制的同時打開的文件數量很少,不能滿足編譯過程中的高併發需要,因此需要在shell中運行命令:

$ ulimit -S -n 1024

環境設置

在源碼根目錄下調用下面的命令:

$ source build/envsetup.sh

選擇設備

因爲我編譯後需要燒錄到Nexus6上,所以選擇aosp_shamu-userdebug

$ lunch aosp_shamu-userdebug

如果不需要燒錄到真機上的話,用默認的aosp_arm-eng類型就可以了。

開始編譯

因爲本機CPU的內核是8核的,所以開16個線程加快編譯。

$ make -j16

編譯4.*源碼時還會遇到幾個問題,記錄下:
1、報java版本錯誤,用jenv修改下即可。

You are attempting to build with the incorrect version
of java.

Your version is: java version "1.8.0_131".
The correct version is: Java SE 1.6.
$jenv local 1.6.0.65

2、
build/core/base_rules.mk:130: **external/webrtc/src/system_wrappers/source: MODULE.TARGET.STATIC_LIBRARIES.libwebrtc_system_wrappers already defined by external/webrtc/src/system_wrappers/source. Stop.

解決:
在編譯代碼前,在terminal中取消NDK_ROOT設置,可以參閱
http://stackoverflow.com/questions/18039555/module-already-defined-when-compiling-android-4-3-source-code
unset NDK_ROOT

3、xcode版本問題

“`
make: * [/android/system/out/target/product/mako/obj/GYP/shared_intermediates/ui/jni/DeviceDisplayInfo_jni.h] Error
““`
此時需要 xcode-select 5.0.2版本的xcode

4、
可能遇到的問題:

jar_check found 2 files not in a whitelisted package: com/.DS_Store

解決辦法,找到jar_check.py,在frameworks/webview/chromium/tools/jar_check.py中,修改返回值爲0,禁止報錯即可。

編譯成功後,會有類似下面的日誌:

#### make completed successfully (30:28:08 (hh:mm:ss)) ####

編譯成功的結果都在out目錄中。
如果lunch的是aosp_arm-eng類型,就可以用$ emulator命令刷到模擬器了。


源碼導入到Android Studio中

爲了方便查看源碼,可以把代碼導入到AS中。目前看來,只能支持Java的跳轉,對c++的支持不太好。
爲了讓AS理解代碼的符號和源碼樹的結構,需要用如下命令生成一個android.ipr工程配置文件。

$ mmm development/tools/idegen/
$ development/tools/idegen/idegen.sh

大約需要十幾秒的時間,就能在源碼根目錄下生成android.ipr和android.iml了。
用AS打開android.ipr就能導入整個源碼了。
如果要支持跳轉的話,還需要做些配置,可以看這篇教程:Import AOSP into Android Studio


刷機

Nexus6手機在打開USB調試,連接電腦後允許調試這臺手機,並且在設置中打開“允許 OEM 解鎖”。然後令手機進入recovery模式,在關機下,輸入如下命令即可:

$ adb reboot bootloader

執行如下命令刷機:

$ fastboot -w flashall

刷機成功後,手機會自動重啓,新鮮出爐的系統終於跑起來了。
刷機過程中也出現過變磚的情況,可以試一下這個教程,親測有效。


相關鏈接

Build Android 5.0 Lollipop on OSX 10.10 Yosemite
http://blog.bihe0832.com/macOS-AOSP.html
在OS X中使用jEnv管理多個Java版本
Import AOSP into Android Studio
Nexus 6 恢復官方兼救磚
google官方指南

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章