正文:
? ? ? ?本來我是打算借用公司服務(wù)器進行android原生源碼的編譯,不過由于沒有root權(quán)限,軟件方面不能自己想裝啥就裝啥,更配備不了VPN,所以還是自己先在自己機器上編一波,后面再拷貝過去。
? ? ? ?經(jīng)過參考了網(wǎng)上很多篇介紹說明,我整理了一下,主要是針對一臺完全沒有配置過的mac系統(tǒng),因為坑爹的我發(fā)現(xiàn)網(wǎng)上很多文章介紹只介紹了一半,大多都是直接下載就開編了。我下載的是android6.0的編譯源碼,機器從零開始。mac系統(tǒng)本身就是基于unix系統(tǒng),原來就配備有
步驟1:下載Xcode,在mac上編譯Android源碼需要依賴MacOSX10.xx.SDK,這個到APP STORE下載就好。
步驟2:配備javajdk。這個要看你編譯的android源碼需要的是哪一版本的,通常使用jdk1.7或者1.8就可以了。不過需要注意的是在mac10.10系統(tǒng)以后安裝jdk1.7和1.8會有裝不進去的情況,這里需要對安裝包進行重新打包一下。具體操作方法可參考以下鏈接:http://blog.csdn.net/daiyelang/article/details/42779645
步驟3:創(chuàng)建磁盤環(huán)境。
Step 1. 創(chuàng)建一個大小寫敏感的磁盤鏡像
$ sudo hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g ~/android.dmg

當(dāng)然,你可能覺得80g不夠用,就自己給大點,只要不超過鏡像文件所在磁盤的剩余空間就行,還有點就是鏡像文件在磁盤上占的空間大小是你向鏡像文件里放置的文件的實際大小,而不是上面定義的80g,這個最大空間的大小將來還能更改,所以不必擔(dān)心弄太大占了空間,如果通過上面已經(jīng)創(chuàng)建了,你可以通過下面重新設(shè)置鏡像大小
$ sudo hdiutil resize -size ? ?<new-size-you-want>g ?~/android.dmg.sparseimage

Step 2. 加載分區(qū)
$ sudo hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android

步驟4:設(shè)置文件描述符限制
Mac 系統(tǒng)下默認只能同時打開 1024 個文件,而在進行Android源碼編譯時有可能會超出這個限制,因此需要解除這個限制。在~/.bash_profile中添加以下內(nèi)容:
ulimit -S -n 1024

步驟5:下載repo文件并修改repo路徑
下載repo文件之前,可以先創(chuàng)建一個bin文件夾,用于存放repo腳本。
$ mkdir ~/bin
$ PATH=~/bin:$PATH
然后在命令行中輸入下面的命令,下載Repo,并且修改屬性:
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
當(dāng)然啦,通過上面的路徑下載是需要VPN的,我們也可以使用清華tuna的鏡像源進行下載,那就不用掛VPN啦。編輯repo文件,修改REPO_URL地址為
REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo'
步驟6:下載源碼
終于到了激動人心的下載源碼的時刻了,雙擊第一步生成鏡像文件,然后可以重命名為AOSP,然后進入鏡像文件
cd /Volumes/AOSP/
創(chuàng)建源碼目錄:
mkdir android-6.0.1
cd android-6.0.1
根據(jù)你的Nexus設(shè)備,選擇代碼分支:Source Code Tags and Builds,我的是Nexus 6,支持Nexus 6的分支有android-6.0.1_r06。執(zhí)行repo init
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r06
完成后,執(zhí)行下面的命令,
repo sync
由于下載源碼的時間太長,中途可能會出現(xiàn)中斷情況,雖然repo同步是支持?jǐn)帱c續(xù)傳,但是不知道什么時候會斷開,這一點很麻煩,所以可以寫一個shell腳本來開啟同步。
可以打開sublime text命名新建一個aospdown.sh,然后拷貝到android-6.0.1,運行./aospdown.sh,等待下載
#!/bin/bash
PATH=~/bin:$PATH
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r59
repo sync
while [ $? = 1 ]; do
echo "================sync failed, re-sync again ====="
sleep 3
repo sync
done
下載完成后可以,完成后可以刪除.repo/文件
$ rm -rf .repo/
步驟7:下載驅(qū)動
把你對應(yīng)的機型的驅(qū)動都下載下來,然后解壓到android-6.0.1 根目錄。以nexus 7的6.0.1為例,解壓過來之后分別是三個sh文件extract-asus-flo.sh、extract-broadcom-flo.sh、extract-qcom-flo.sh。分別都執(zhí)行以下,就會在根目錄生成vendor目錄,里面就是需要編譯的驅(qū)動文件。
好啦好啦,至此android源碼已經(jīng)下載完畢,可以開始編譯了。
編譯部分
如果你和我一樣,使用的是Mac OS 的EI Capitan系統(tǒng),在編譯之前,需要做一些兼容性處理。打開build/core/combo/mac_version.mk文件,在mac_sdk_versions_supported變量后添加版本號10.11:
mac_sdk_versions_supported := 10.6 10.7 10.8 10.9 10.11 10.12
接下來就可以開編啦,至于選擇的機型,可以根據(jù)這個去找,
https://source.android.com/source/running.html#selecting-device-build
當(dāng)然了,編譯過程還會遇到一些問題,也是需要繼續(xù)配置的。在這里我在網(wǎng)上整理了一下,大致有如下幾個問題。
下載源碼遇到的問題一:
這個error信息忘了詳細記錄了,就是某個./repo/projects/.............下面報錯了,把報錯的文件夾刪掉,repo sync
error:
………………………………………………………………………...
Traceback (most recent call last):
File "/Volumes/aosp/android-6.0.1/.repo/repo/main.py", line 531, in
_Main(sys.argv[1:])
…………………………….
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd4 in position 578: ordinal not in range(128)
解決辦法:根據(jù)error的提示,刪除./repo/projects/...相應(yīng)下的git就行了,然后再repo sync
編譯源碼遇到的問題二:
build/core/combo/mac_version.mk:39: * Can not find SDK 10.12 at /Developer/SDKs/MacOSX10.6.sdk
build/core/combo/mac_version.mk:40: *****************************************************
build/core/combo/mac_version.mk:41: *** Stop..? Stop.
配置mac_sdk_versions_supported里添加10.12
編譯源碼遇到的問題三:
system/core/libcutils/threads.c:38:10: error: 'syscall' is deprecated: first deprecated in OS X 10.12 - syscall(2) is unsupported; please switch to a supported interface. For SYS_kdebug_trace use kdebug_signpost(). [-Werror,-Wdeprecated-declarations]
return syscall(SYS_thread_selfid);
^
host C: libcutils <= system/core/libcutils/iosched_policy.c
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/unistd.h:733:6: note: 'syscall' has been explicitly marked deprecated here
int syscall(int, ...);
MacOSX-SDKs下載地址:https://github.com/phracker/MacOSX-SDKs
刪除10.12,下載MacOSX10.11.sdk,解壓拷貝到/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs
然后確保AOSP源碼下build/core/combo/mac_version.mk文件中
mac_sdk_versions_supported := 10.9 10.10 10.11
后面不要寫10.12。
編譯源碼遇到的問題四:
找不到com.sun.javadoc.ClassDoc
external/doclava/src/com/google/doclava/ClassInfo.java:20:
error: package com.sun.javadoc does not exist import com.sun.javadoc.ClassDoc;external/doclava/src/com/google/doclava/apicheck/XmlApiFile.java:80:
error: cannot find symbol ClassDoc classDoc = null; ^
symbol: class ClassDoc location: class XmlApiFile Note: Some input files use unchecked or unsafe operations. Note: Recompile with -Xlint:unchecked for details. 163 errors
make: *** [out/host/common/obj/JAVA_LIBRARIES/doclava_intermediates/javalib.jar] Error 41
在bash_profile里添加
export ANDROID_JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home