轉載:http://www.istarx.cc/2018/02/03/download-android-source-code/
在查看源代碼以及二次開發的過程中避免不了和源代碼打交道。本文記錄了在Mac OS(當前10.13.2版本)下載、編譯Android源代碼過程。
設置編譯環境
Mac上默認安裝是在一個保留大小寫但是不區分大小寫的環境下進行的,但是git命令並不能很好的支持該環境,後續編譯也不能正常進行。因此在Mac上下載Android源代碼之前要新建一個始終區分大小寫的文件系統中,並在此文件系統中對源碼進行編譯等操作。
安裝JDK以及 Xcode 命令行工具
安裝jdk
你可以在java官網上下載最新或指定的jdk版本進行安裝。也可以使用HomeBrew命令來進行安裝:
brew cask info java # 查看java最新版本相關信息 brew cask install java # 安裝java最新版本 |
也可以通過如下命令來進行特定版本的安裝:
brew tap caskroom/versions brew cask info java8 brew cask install java8 |
Android 7.0 (Nougat) - Android 8.0 (O)在Ubuntu上需要OpenJDK8,Mac OS上需要jdk8u45或更高版本。
安裝Xcode命令行工具
xcode-select --install |
如果你已經安裝過Xcode,則只需要在第一次打開的時候同意許可即可。
創建大小寫敏感的磁盤映像
創建磁盤映像
-
通過磁盤文件系統創建映像
通過
應用程序—>實用工具—>磁盤工具
,選擇文件-->新建映像-->空白映像
,填寫名稱大小(編譯至少需要25G空間,如果是設置緩存等功能,則需要更大的控件),格式選擇Mac OS 擴展 (區分大小寫,日誌式)。 -
通過shell命令
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 40g ~/AndroidSourceCode/android.dmg
輸出如下圖:
新建的image文件可能是一個
.dmg
,也可能是一個.dmg.sparseimage
。可以使用如下命令來調整稀疏映像的大小:
hdiutil resize -size <new-size-you-want>g ~/AndroidSourceCode/android.dmg.sparseimage
裝載及卸載磁盤映像
執行裝載卸載映像,只需要執行一下命令即可:
hdiutil attach ~/AndroidSourceCode/android.dmg.sparseimage -mountpoint /Volumes/android; # 裝載 hdiutil detach /Volumes/android # 卸載 |
爲了方便裝載及卸載映像,可以把上述代碼寫進.bashrc
或zshrc
或者類似的文件中:
# mount the android file image function mountAndroid { hdiutil attach ~/AndroidSourceCode/android.dmg.sparseimage -mountpoint /Volumes/android; } # unmount the android file image function unmountAndroid { hdiutil detach /Volumes/android; } |
接着執行source .bashrc
或者source .zshrc
就可以使用mountAndroid
命令裝載映像,unmmountAndroid
命令卸載映像。
下載源代碼
初始化Repo
新建一個專門存放repo的bin文件夾,並將其添加到PATH變量中:
mkdir ~/bin PATH=~/bin:$PATH # 也可以執行 echo 'export PATH=~/bin:$PATH' >> ~/.zshrc 命令 |
然後下載Repo工具,在命令行中輸入以下命令:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo |
如果沒有VPN,則可以用清華的鏡像地址替換谷歌的地址。
REPO_URL = 'https://gerrit-googlesource.lug.ustc.edu.cn/git-repo' |
替換爲:
REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/git-repo' |
加載之前創建的稀疏映像,新建工作目錄:
cd /Volumes/android mkdir source_code cd source_code |
執行repo初始化指令
repo init |
如果指定地址和分支,則使用:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r31 |
初始化成功之後在工作目錄下會有一個.repo
文件夾,包含了清單文件。
同步Android源代碼樹
在工作目錄下運行如下命令,經過漫長的等待即可以下載到對應分支的源代碼了。
repo sync |
如果已經有源碼,並需要更換清華源,則需要替換.repo/manifests/default.xml
中的同步源碼
<manifest> <remote name="aosp" - fetch=".." + fetch="https://aosp.tuna.tsinghua.edu.cn/" review="https://android-review.googlesource.com/" /> <default revision="refs/tags/android-8.0.0_r31" remote="aosp" |
通過下載使用每月更新的初始化包同步代碼
由於上述同步工作需要下載30G的數據,任何環節出問題都可能造成同步失敗,所以可以使用清華的每月初始化包進行同步代碼。
下載https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar最新的源代碼tar包以及對應的md5文件,下載完成後執行以下MD5校驗一下。
具體執行過程如下:
-
先下載repo工具;
-
下載初始化包並同步;
wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包 wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar # 下載初始化包對應的md5碼 MD5 aosp-latest.tar #校驗MD5碼 tar xf aosp-latest.tar cd AOSP # 解壓得到的 AOSP 工程目錄,這時 ls 的話什麼也看不到,因爲只有一個隱藏的 .repo 目錄 repo sync # 正常同步一遍即可得到完整目錄或 repo sync -l 僅checkout代碼
切換分支
以每月更新的初始化包下載的代碼,分支爲默認分支,需要切換到所需的分支上。
cd .repo/manifests git branch -a | cut -d / -f 3 repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.0.0_r31 repo sync |
之後就可以使用命令編譯源碼了。
編譯源代碼
清除編譯操作的所有輸出
建議在 bash 環境下執行,否則會出現莫名其妙的問題。
make clobber |
設置環境
Android 源代碼種與編譯相關的文件都放在 build 目錄中,其中envsetup.sh
腳本是初始化環境所用:
source build/envsetup.sh |
可以簡寫爲:
. build/envsetup.sh |
選擇目標
使用lunch
命令,可以在該命令後面添加參數,參數採用 BUILD-BUILDTYPE
的形式指定編譯目標,其中 BUILD
指特定功能組合的代號,而BUILDTYPE
則有 user
、userdebug
、eng
三種:
user
:權限受限;適用於生產環境;userdebug
:與“user”類似,但具有 root 權限和可調試性;是進行調試時的首選編譯類型;eng
:具有額外調試工具的開發配置;
如果在lunch
命令後面不添加參數,則需要從提示菜單中選擇一個編譯目標。
編譯代碼
Android 源碼編譯命令爲 make
,參數爲-jN
,N 是介於所使用計算機硬件線程總數的1~2倍之間。
make -j8 |
常用的編譯命令:
make -k # 繼續編譯 m # 編譯完整的Android源代碼 mm # 此命令必須進入指定的工程的目錄進行編譯 mmm # 可以在任何一級目錄編譯任意指定的工程 |
編譯 fastboot 和 adb
編譯 fastboot 和 adb 命令如下:
make fastboot adb |
之後可以使用物理按鍵的方式((對於Nexus系列可以參考這裏))或者 adb reboot bootloader
命令重啓進入引導加載程序。
解鎖及加鎖引導加載程序
如果要刷寫定製系統,例如各個 Android 廠商的定製 ROM,需要解鎖引導加載程序,而引導加載程序默認處於鎖定狀態。解鎖會導致系統清楚設備上的所有數據,so,在解鎖之前請先備份重要文件。
解鎖引導加載程序的步驟如下:
-
在設置—系統—關於本機,點按
版本號
7次,當看到“您已處於開發者模式”這條消息後,點按返回按鈕; -
進入開發者選項,然後啓用 OEM 解鎖和 USB 調試,如果 OEM 解鎖處於不可用狀態,則需要鏈接互聯網,以便設備至少簽到一次,之後如果仍處於鎖定狀態,說明設備可能已被運營商鎖定 SIM 卡;
-
adb reboot bootloader
命令進入引導加載程序; -
執行以下命令以解鎖:
fastboot flashing unlock # 2015 之後發佈的設備 fastboot oem unlock # 2014 年及之前發佈的設備
-
在屏幕上確認解鎖;
對於加鎖過程,只需要重啓到引導加載程序以後執行以下命令即可:
fastboot flashing lock # 2015 之後發佈的設備 fastboot oem lock # 2014 年及之前發佈的設備 |
使用 Android Studio 加載源代碼
在編譯完全部源代碼一次之後查看out/host/darwin-x86/framework/idegen.jar
是否存在,如不存在,則使用如下命令生成該文件:
source build/envsetup.sh lunch [編譯全部源代碼時選擇的參數] mmm development/tools/idegen/ |
接下來生成配置文件:
development/tools/idegen/idegen.sh |
之後會在源碼目錄下生成android.ipr
和android.iml
文件。
打開 Android Studio 加載ipr文件即可。
遇到的問題
-
RPC failed; curl 18 transfer closed with outstanding read data remaining.
因爲curl的postBuffer默認值太小的原因,重新在終端配置一下這個值就可以了。
git config –global http.postBuffer 524288000
-
curl: (22) The requested URL returned error: 404 Server does not provide clone.bundle; ignoring.
無視即可
-
error.GitError: device/asus/fugu-kernel rev-list (’^fb4baab945ff1b696b84a8bd9af3d54032d3cfaa’, ‘HEAD’, ‘–’): fatal: bad object HEAD
cd AOSP/device/asus/fugu-kernel git fetch --all
-
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to android.googlesource.com:443
升級系統自帶的libressl, openssl 和 curl 即可
-
repo sync discarding xxx commits.
repo forall -c 'git reset --hard; git clean -f -d -x';
-
external/error_prone/soong/Android.bp:1:1: “soong-java-config-error_prone” depends on undefined module “soong-java-config” ninja: error: rebuilding ‘out/soong/.minibootstrap/build.ninja’: subcommand failed.
刪除soong相關的文件
external/error_prone/soong
以及out
文件夾,然後執行repo sync
命令。 -
Could not find a supported mac sdk: [“10.10” “10.11” “10.12”]
下載 10.13 版本的SDK,解壓到
/Applications/XCode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/
目錄下 -
frameworks/layoutlib: MODULE.darwin.JAVA_LIBRARIES.temp_layoutlib already defined by frameworks/base/tools/layoutlib.
刪除源碼中的 framworks 文件夾,重新執行
repo sync
-
FAILED: out/soong/.intermediates/system/tools/aidl/libaidl- common/darwin_x86_64_static/gen/yacc/system/tools/aidl/aidl_language_y.cpp out/soong/.intermediates/system/tools/aidl/libaidl-common/darwin_x86_64_static/gen/yacc/system/tools/aidl/aidl_language_y.h
是因爲 bison 造成的,需要給 bison 打補丁,並且替換現有的 /prebuilt/ 目錄下的二進制文件,具體做法如下:
cd /Volumes/AOSP/external/bison git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160 mm cp /Volumes/AOSP/out/host/darwin-x86/bin/bison /Volumes/AOSP/prebuilts/misc/darwin-x86/bison/
參考網址https://groups.google.com/forum/#!topic/android-building/D1-c5lZ9Oco
-
Unsupported curl, please use a curl not based on SecureTransport. Jack server installation not found
brew install curl --with-openssl echo 'export PATH=$(brew --prefix curl)/bin:$PATH' >> ~/.zshrc source ~/.zshrc caffeinate make -j8 # caffeinate是爲了防止OS X 進入睡眠
-
/bin/bash: xz: command not found
brew install xz
-
Couldn’t locate the directory development/tools/idegen
是因爲編譯時使用zsh,要切換到bash環境下:
bash mmm development/tools/idegen/
-
fatal error: error in backend: IO failure on output stream.
是因爲磁盤分區小了,擴大磁盤分區:
sudo hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage