Android8.1源碼編譯實踐(Mac)

来源:https://www.cnblogs.com/monsterdev/archive/2019/07/09/11161282.html
-Advertisement-
Play Games

第0步:版本選擇 AOSP版本選擇很重要,如果選錯了,會造成編譯失敗等各種問題,編譯AOSP對Xcode的版本是有要求的; 比如:AOSP6.0 7.0,要求Xcode的版本是8.3,然而在MacOS 10.14上面是不支持Xcode8.3的這就很尷尬; 由於現在大家的Mac環境基本是更新到最新的1 ...


第0步:版本選擇

AOSP版本選擇很重要,如果選錯了,會造成編譯失敗等各種問題,編譯AOSP對Xcode的版本是有要求的;

比如:AOSP6.0-7.0,要求Xcode的版本是8.3,然而在MacOS 10.14上面是不支持Xcode8.3的這就很尷尬;
由於現在大家的Mac環境基本是更新到最新的10.14了,所以這裡推薦大家選擇android-8.1.0_r1。

編譯環境:

  • OS: macOS Mojave 10.14.4
  • JDK: 1.8.0_144
  • Xcode: 10.2.1
  • XcodeSDK: 10.11
  • AOSP: android-8.1.0_r15
  • Git: 2.21.0

第一步:創建區分大小寫的磁碟映像

由於Mac OS的文件系統預設是不區分大小寫的,Git 並不支持此類文件系統,而且此類文件系統會導致某些 Git 命令(例如 git status)的行為出現異常,所以我們需要在區分大小寫的文件系統中對 AOSP 源文件進行操作。

通過 shell 使用以下命令創建磁碟映像:

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

這裡設置分配150g的大小,這將創建一個 .dmg(也可能是 .dmg.sparseimage)文件,該文件在裝載後可用作具有 Android 開發所需格式的存儲捲。

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

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

雙擊生成的.dmg.sparseimage文件,就會看到掛載的磁碟了,之後所有操作都在這個磁碟分區中進行,您可以像對待外接硬碟一樣將其彈出(卸載)。

如果你喜歡在命令行中掛載/卸載分區,可以向 ~/.bash_profile 中添加輔助函數:

# mount the android file image
function mountAndroid { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; }
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }

註意文件名路徑是否一致,要使.bash_profile配置生效,需要:

# source ~/.bash_profile

之後你就可以在命令行中通過mountAndroid和unmountAndroid來操作了。

第二步:安裝所需的程式包

安裝 Xcode 命令行工具:

一般在安裝Xcode的時候會自動安裝命令行工具,這裡保險起見,檢查一下:

# xcode-select --install

通過 macports.org 安裝 MacPorts。

將以下內容添加到~/.bash_profile中

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

通過 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 中:

# set the number of open files to be 1024
ulimit -S -n 1024

第三步:下載源代碼

安裝Repo

Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git.
直接運行下麵的命令:

# curl https://storage.googleapis.com/git-repo-downloads/repo > ~/repo

會在主目錄下生成repo文件,接著給他賦予可執行的許可權:

# chmod a+x ~/repo

為了可以方面的使用repo命令,我們把它移動到/opt/local/bin裡面,因為這個路徑我們在上一步中已經加入到PATH了,所以我們可以在任何一個地方執行repo命令;

# mv ~/repo /opt/local/bin

同步源碼

進入第一步中創建好的分區,建立工作目錄:

# mkdir aosp
# cd aosp

repo的運行過程中會嘗試訪問官方的git源更新自己,如果想使用tuna的鏡像源進行更新,可以將如下內容複製到你的~/.bash_profile里:

export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'

設置Git用戶名和郵箱:

# git config --global user.name "Your Name"
# git config --global user.email "[email protected]"

初始化repo,這裡採用清華大學的鏡像,並設置分支android-8.1.0_r15:

#repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r15

最後一步:

# repo sync

源碼同步過程中常常會因為網路因素而斷開,如果斷開了繼續執行repo sync命令即可,直到下載完成。

漫長的等待......


下載完成後差不多占用70G大小,因為我們後續不需要再進行分支切換與同步,所以我們可以把目錄下的.repo文件夾給刪除了,畢竟Mac的SSD容量寶貴,刪除之後你會發現硬碟大小沒有釋放,這就有點尷尬了,這個問題目前也沒找到解決的辦法,我的方法是按照第一步創建一個新的分區,把內容拷貝進去,然後把舊的分區刪了,這樣空間就釋放了。

編譯源碼

優化編譯環境 設置 ccache

要使用 ccache,請在源代碼樹的根目錄下執行以下命令:

#export USE_CCACHE=1
#export CCACHE_DIR=/<path_of_your_choice>/.ccache
#prebuilts/misc/darwin-x86/ccache/ccache -M 50G

註意<path_of_your_choice>是你源碼下載的根目錄。

最後請將以下內容添加到 .bash_profile(或等同文件)中:

export USE_CCACHE=1

配置ANDROID_JAVA_HOME環境變數

在~/.bash_profile中添加以下內容,前提必須是安裝了JDK1.8:

export ANDROID_JAVA_HOME=$(/usr/libexec/java_home -v 1.8)

設置XcodeSDK的版本

執行以下命令,打開配置文件:

# vi build/soong/cc/config/x86_darwin_host.go

查看darwinSupportedSdkVersions,這裡列出了支持的sdk版本:

darwinSupportedSdkVersions = []string{
    "10.10",
    "10.11",
    "10.12",
    }

接著我們進入以下目錄查看現有的XcodeSDK版本:

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/

這裡我們選擇10.11的版本,如果沒有MacOSX10.11.sdk則去MacOSX-SDKs 中下載一個,解壓到該目錄,並把其他版本的刪除,確保只保留一個就行了。

開始編譯

首先要把shell切換到bash(如果你使用的是zsh)

#chsh -s /bin/bash

初始化環境:

#source build/envsetup.sh

選擇編譯的分支:

#lunch

會出現以下列表:

Lunch menu... pick a combo:

 1. aosp_arm-eng
 2. aosp_arm64-eng
 3. aosp_mips-eng
 4. aosp_mips64-eng
 5. aosp_x86-eng
 6. aosp_x86_64-eng
 7. aosp_car_arm-userdebug
 8. aosp_car_arm64-userdebug
 9. aosp_car_x86-userdebug
 10. aosp_car_x86_64-userdebug
 ... ... 

Which would you like? [aosp_arm-eng]

要求輸入對應的數字:
如果你想在你的Nexus上設備運行,請參照官方設備對應列表選擇;
如果你只想在本機的虛擬機上運行,Mac系統的話選擇aosp_x86-eng即可。

最後一步,編譯:

#make -j6

通過-jN參數來設置編譯的並行任務數,以提高編譯速度,在此前我的CPU核心數為6,這裡N值最好選在6到12之間,這裡我們設置6個並行任務進行編譯。

這裡需要註意的是,每次退出再進入命令行要執行以上命令之前,都要先執行:

#source build/envsetup.sh

編譯中遇到的問題

問題1:Jack編譯報錯:communication error with Jack server

原因:JACK編譯器不支持多用戶同時編譯,其他用戶在編譯,埠被占用。

解決方法:
如下:修改以下兩個配置文件中的埠號server.service.port和server.admin.port,比如都改為8096/8097:

  1. ~/.jack-settings
  2. ~/.jack-server/config.properties

註意:
兩個文件中的埠號必須一致。
修改後的埠號必須是沒有被使用的。

問題2: 出現Try increasing heap size with java option '-Xmx'

原因: 出現這個錯誤是由於電腦記憶體不足;
解決方法:在命令行分別執行以下三條語句,然後繼續編譯;

# export JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g" 
# ./prebuilts/sdk/tools/jack-admin kill-server 
# ./prebuilts/sdk/tools/jack-admin start-server

問題3: BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d

在log中出現BSION等字樣;

原因:網上說這個bsion的一個bug;
解決方法:拉取新的分支,重新編譯 bison:

#cd external/bison
#git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160

如果這步驟發生錯誤了(比如之前刪除了.repo文件夾)
這時候我們就把bison這個文件夾刪除,下載一個新的:

wget https://android.googlesource.com/platform/external/bison/+archive/c0c852bd6fe462b148475476d9124fd740eba160.tar.gz

解壓後進入bison文件夾,執行:

# mm
# cp out/host/darwin-x86/bin/bison prebuilts/misc/darwin-x86/bison/

結束

最後一切順利的話,經過漫長的編譯後,最終會出現以下畫面則說明編譯Android系統成功了。
Xnip2019-05-18_22-22-31


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 表結構如下: –1.學生表 Student(s_id,s_name,s_birth,s_sex) –學生編號,學生姓名, 出生年月,學生性別 –2.課程表 Course(c_id,c_name,t_id) – –課程編號, 課程名稱, 教師編號 –3.教師表 Teacher(t_id,t_name) ...
  • -- 空表不導出,建立表空間 select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 -- 查詢鎖表 select b.username,b.sid,b.serial#,logo... ...
  • 一、資料庫的介紹 資料庫(Database)是存儲與管理數據的軟體系統,就像一個存入數據的物流倉庫。每個資料庫都有一個或多個不同的API介面用於創建,訪問,管理,搜索和複製所保存的數據。我們也可以將數據存儲在文件中,但是在文件中讀寫數據速度相對較慢,所以我們使用關係型資料庫管理系統(RDBMS)來存 ...
  • 參考:https://github.com/hidu/mysql-schema-sync 需求:測試環境表結構變動同步到開發環境,兩個實例各有數百個庫,不適合每個庫寫一個配置文件 環境:操作系統ubuntu16.04、兩個資料庫實例percona5.7、golang版本1.12 安裝mysql-sc ...
  • 表結構如下: id varchar(32) info json 數據: 現在我需要獲取info中disanme的值,查詢方法有: 1. 結果: id = 1, disname=“小明” 以上sql查出的disname值是帶有雙引號的,有時我們不需要雙引號,此時就需要用到下麵這種方式。 2. 結果: ...
  • 1、文檔 1)ElasticSearch是面向文檔的,文檔是所有可搜索數據的最小單位。例如: a)日誌文件中的日誌項; b)一張唱片的詳細信息; c)一篇文章中的具體內容; 2)在ElasticSearch中,文檔會被序列化成Json格式: a)Json對象是由欄位組成的; b)每個欄位都有對應的字 ...
  • [TOC] 一、資料庫的安裝和連接 1.1 PyMySQL的安裝 1.2 python連接資料庫 1.2.1 更多參數版 二、創建表操作 三、操作數據 3.1 插入操作 3.2 查詢操作 Python查詢Mysql使用 fetchone() 方法獲取單條數據,使用 :方法獲取多條數據。 : 該方法獲 ...
  • Redis主從複製機制詳解 Redis有兩種不同的持久化方式,Redis伺服器通過持久化,把Redis記憶體中持久化到硬碟當中,當Redis宕機時,我們重啟Redis伺服器時,可以由RDB文件或AOF文件恢復記憶體中的數據。 不過持久化後的數據仍然只在一臺機器上,因此當硬體發生故障時,比如主板或CPU壞 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...