轉載: MacOS 下載 編譯 Android 8.0

轉載: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
    

    輸出如下圖:

    create-image

    新建的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 # 卸載

爲了方便裝載及卸載映像,可以把上述代碼寫進.bashrczshrc或者類似的文件中:

# 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-address

替換爲:

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校驗一下。

具體執行過程如下:

  1. 先下載repo工具;

  2. 下載初始化包並同步;

    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則有 useruserdebugeng 三種:

  • 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.iprandroid.iml文件。

android-ipr

打開 Android Studio 加載ipr文件即可。

android-studio

open-android-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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章