教你如何在Mac系統下編譯Android系統的源碼

2021-02-25 郭霖


「全國公廁雲平臺」11月19日上線試運行,匯總全國近33萬條公廁信息,初步實現快速尋廁功能。11月19日是「世界廁所日」。據了解,該平臺由住房和城鄉建設部組織研發,群眾可隨時隨地尋找就近環衛部門管理的公廁和社會開發公廁。隨著系統不斷完善,還將實現評價、投訴和反饋功能,群眾如廁後可評價共享公廁信息、提出建議或投訴,政府主管部門根據群眾意見完善基礎數據、實時監管投訴處理情況,巡查人員及時上傳投訴處理結果及日常巡查結果,不斷提升公廁管理水平。

本篇來自 qqdds 的投稿,主要講解了如何在Mac系統下編譯Android源碼,希望大家喜歡。

qqdds 的博客地址:

http://www.jianshu.com/u/cfdb92fdf95c

由於在工作中遇到了很多關於android內部實現的問題,雖然後面都解決了,有些是看了源碼實現,有些源碼看不了只能去google,百度。這就導致了對於很多的問題其實是知其然不知其所以然,所以從現在開始我下定決心開始學習Android的源碼。那說到源碼就必須提到編譯源碼這件事情。

最開始是在我的MBP上面安裝了linux的雙系統準備在ubuntu上面來安裝編譯源碼,不過這個方法有個弊端就是查看源碼的過程真是爽翻天啊,所以開始搗鼓再mac上面編譯源碼

在google了一些方法之後發現比較混亂以至於難以完成,所以這次使用官方的方法來完成源碼的編譯。

系統要求:Mac OS(Intel/x86)

Android 6.0 (Marshmallow) - AOSP master:Mac OS v10.10 (Yosemite) 或更高版本,具有 Xcode 4.5.2 和命令行工具

Android 5.x (Lollipop):Mac OS v10.8 (Mountain Lion),具有 Xcode 4.5.2 和命令行工具

Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat):Mac OS v10.6 (Snow Leopard) 或 Mac OS X v10.7 (Lion),以及 Xcode 4.2(Apple 的開發者工具)

Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich):Mac OS v10.5 (Leopard) 或 Mac OS X v10.6 (Snow Leopard),以及 Mac OS X v10.5 SDK

JDK

這裡會需要註冊一個 甲骨文的帳號

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html#jdk-8u45-oth-JPR

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR

http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html#jdk-7u71-oth-JPR

主要程序包

gmake 後面會下載的,你只需要安裝好python2.7 然而一般python是安裝好的

搭建編譯環境

您可以使用磁碟映像在現有的 Mac OS 環境中創建區分大小寫的文件系統。要創建磁碟映像,請啟動磁碟工具,然後選擇「新建映像」。完成編譯至少需要 25GB 空間;更大的空間能夠更好地滿足未來的需求。使用稀疏映像有助於節省空間,而且以後可以隨著需求的增加進行擴展。請務必選擇「Case sensitive, Journaled」存儲卷格式。

我推薦使用這種方式來建立磁碟映像

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

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

這將創建一個 .dmg(也可能是 .dmg.sparseimage)文件,該文件在裝載後可用作具有 Android 開發所需格式的存儲卷。

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

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

對於存儲在主目錄下的名為 android.dmg 的磁碟映像,您可以向 ~/.bash_profile 中添加輔助函數:

要在執行 mountAndroid 時裝載磁碟映像,請運行以下命令:

# mount the android file image function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }

注意:如果系統創建的是 .dmg.sparseimage 文件,請將 ~/android.dmg 替換成 ~/android.dmg.sparseimage。

要在執行 umountAndroid 時卸載磁碟映像,請運行以下命令:

# unmount the android file image function umountAndroid() { hdiutil detach /Volumes/android; }

裝載 android 存儲卷後,您將在其中開展所有工作。您可以像對待外接式存儲盤一樣將其彈出(卸載)。

你只需要在AppStore 裡面安裝Xcode就可以了。

之後需要運行一下命令

$ xcode-select --install

或者你也可以選擇字節運行命令,不過我不推薦,下個xcode有好處的哦

根據自己的系統來選擇,下載地址如下:

https://www.macports.org/install.php

編輯.bash_profile,如果沒有就新建(不用特意操作,vi可以自動生成的)

vi ~/.bash_profile

vi 的小提示,按i切換到 insert 模式就是編輯模式,按 esc 退出編輯模式,按:wq 保存退出,複製  export PATH=/opt/local/bin:$PATH 到文件中。

輸入 source ~/.bash_profile 使命令生效

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

ulimit -S -n 1024

在原始碼的根目錄下執行以下命令

export USE_CCACHE=1
export CCACHE_DIR=/<path_of_your_choice>/.ccache

下載原始碼

確保主目錄下有一個 bin/ 目錄,並且該目錄包含在路徑中

mkdir ~/bin PATH=~/bin:$PATH

(要在~/.bash_profile中添加;輸入source ~/.bash_profile 使命令生效)

下載 Repo 工具,並確保它可執行

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo

必須使用之前創建的區分大小寫的文件系統,一般掛載的新的盤是在/Volumes/ 路徑下的

我分出來的區分大小寫的文件系統名字是Android 所以我cd進去就ok了

創建一個目錄 mkdir XXX (XXX 是你自己取得名字)

cd XXX

如果遇到repo: command not found 問題 請在初始工作目錄輸入

echo 'export PATH=$PATH:$HOME/bin' >> ~/.bashrc export PATH=$PATH:$HOME/bin

git config --global user.name "Your Name" git config --global user.email "you@example.com"

repo init -u https://android.googlesource.com/platform/manifest

PS:此時需要科學上網,如果不能科學上網沒有關係,我們可以通過其他的鏡像來完成這一步操作

下載地址如下:

https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/

首先我們可以看到僅支持 HTTPS下載,所以我們是無法使用repo來同步代碼的,所以我們要這麼做:

下載 jar 包,地址為(https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar)

然後~~等(這個包有31個G,我用迅雷慢慢下載中)

將下載完的包放在之前建立的工作目錄上

tar xf aosp-latest.tar 解壓的目錄

cd aosp

repo sync (需要將下載的tar文件刪除掉,不然空間有可能不夠)。此後,每次只需運行 repo sync 即可保持同步。 我們強烈建議您保持每天同步,並儘量選擇凌晨等低峰時間

https://lug.ustc.edu.cn/wiki/mirrors/help/aosp

科大鏡像沒有去掉git協議,所以我們可以順暢的完成下載按照頁面提示的操作即可

編譯準備工作

進行文件下載

https://source.android.com/source/requirements.html#binaries

對於運行帶標記的 AOSP 版本分支的受支持設備,您可以從 Google 的 Nexus 驅動程序頁面

https://developers.google.com/android/drivers

下載相關的官方二進位文件。有了這些二進位文件,您將有權使用採用非開放原始碼的其他硬體功能。要編譯 AOSP 的 master 分支,請使用 Nexus 設備的二進位文件預覽。

https://developers.google.com/android/blobs-preview

在針對某種設備編譯 master 分支時,請使用適用於最新編號版本的二進位文件或具有最新日期的二進位文件。

https://source.android.com/source/build-numbers

解壓縮下載的文件將會得到一個sh的文件通過終端 sh xxx.sh 運行

此處需要agree用戶協議,你只需要按住向下鍵,就可以劃到最後輸入 I ACCEPT 就可以了。

sh運行完成之後會得到一個vendor文件夾,將其複製到原始碼的根目錄下

為了確保新安裝的二進位文件在解壓後會被適當考慮在內,請使用以下命令刪除所有以前編譯操作的已有輸出:

make clobber

使用 envsetup.sh 腳本初始化環境

source build/envsetup.sh

使用 lunch 選擇要編譯的目標。然後會出現對應的列表選擇其中某個數字即可

該命令表示針對模擬器進行完整編譯,並且所有調試功能均處於啟用狀態。

如果您沒有提供任何參數就運行命令,lunch 將提示您從菜單中選擇一個目標。

所有編譯目標都採用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能組合的代號。

BUILDTYPE 是以下類型之一

編譯類型使用情況user權限受限;適用於生產環境userdebug與「user」類似,但具有 root 權限和可調試性;是進行調試時的首選編譯類型eng具有額外調試工具的開發配置

由於本人有一個nexus 5x 的手機 ,所以準備在nexus5x 的手機上運行自己編譯的代碼,所以我選擇的編譯命令為aosp_bullhead-userdebug

如果想要針對真機調試,請參閱運行版本進行命令選擇。我在這裡不建議初次接觸源碼編譯的人進行真機調試,刷磚了就gg了,運行版本地址如下:

https://source.android.com/source/running

您可以使用 make 編譯任何代碼。GNU Make 可以藉助 -jN 參數處理並行任務,通常使用的任務數 N 介於編譯時所用計算機上硬體線程數的 1-2 倍之間。例如,在一臺雙核 E5520 計算機(2 個 CPU,每個 CPU 4 個內核,每個內核 2 個線程)上,要實現最快的編譯速度,可以使用介於 make -j16 到 make -j32 之間的命令。

make -j17

請注意,本部分只是一個摘要,用於確保設置已完成。如需關於編譯 Android 的詳細說明,請參閱運行編譯系統。

https://source.android.com/source/running

編譯過程中遇到的問題

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer

build/core/combo/mac_version.mk:26: none of the installed SDKs (wifi-serviceac_sdk_versions_installed) match supported versions (10.8 10.9 10.10 10.11), trying 10.8

原因boxen的版本太低了需要更新,請根據此處進行更新

https://github.com/boxen/our-boxen

no SDK 10.8 at /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk, trying legacy dir

build/core/combo/mac_version.mk:40: *****************************************************

build/core/combo/mac_version.mk:41: * Can not find SDK 10.8 at /Developer/SDKs/MacOSX10.8.sdk

build/core/combo/mac_version.mk:42: *****************************************************

我們需要下載一個MacOSX10.11.sdk放到這個目錄中。因為10.12這個版本的sdk中syscall這個方法被棄用了,所以我們需要換回11這個版本的sdk,MacOSX10.11.sdk下載地址

https://github.com/phracker/MacOSX-SDKs/releases/download/10.13/MacOSX10.11.sdk.tar.xz

還有注意問題,有興趣的小夥伴可以點擊左下角的閱讀原文進行查看。

7.0 刷機

終於build完成了 真是歷經千幸萬苦啊。首先第一步 在原始碼的更目錄下輸入

sudo adb reboot bootloader

然後你就會到達這個界面

fastboot oem unlock

輸入這個命令 然後通過音量鍵選擇yes 通過待機鍵確認,再然後輸入

fastboot flashall -w

出現錯誤error: could not load android-info.txt: No such file or directory

export ANDROID_PRODUCT_OUT=/Volumes/android/android-7.1.1_r24/out/target/product/generic(請替換你自己的目錄)

出現錯誤error: could not load boot.img

你會發現沒有boot.img 這個文件 這時候你只需要 

make bootimage

就會生成對應的文件。

到此為止,本文的內容已經講完了。覺得不錯的同學可以關注下作者的博客,當然對本篇文章的內容有疑問,也可以到作者的博客中去諮詢。

歡迎長按下圖 -> 識別圖中二維碼

或者 掃一掃 關注我的公眾號

相關焦點

  • 定製Andorid 系統第一步,更換開機圖片~
    BootAnimation 位於aosp10/frameworks/base/cmds/bootanimation/BootAnimation.cpp通過上面的代碼,我們可以判斷出:images/android-logo-mask.png
  • Spring源碼解析之源碼的下載編譯
    老粉應該知道了,筆者最近剛上架技術生涯的第一本書《Java源碼模擬面試解析指南 》。於是趁著年輕時還有時間修福報,準備再做一個 Spring源碼面試指南。相比於之前是直接閱讀引入jar包的方式來研讀 JDK 源碼,由於框架源碼的複雜性及強可插拔性,一般將源碼編譯到本地,由此便可以邊研讀源碼邊加自由地注釋,方便調試程序等。首先進入 spring 官方倉庫,fork 一份倉庫到自己帳號下,方便自己提交。
  • LayaAir示例項目源碼編譯運行指南
    由於一些開發者不知道如何去使用和編譯Github上的源碼示例,本篇將引導開發者去使用Github上的DEMO。這對於引擎初學者,快速了解引擎API與引擎示例效果會有著幫助。一、克隆 LayaAir源碼項目到本地先安裝好Git環境,不會的可以自行百度搜索一下,這裡就不展開了。
  • 超詳細的mac重裝系統教程
    mac重裝系統相對來說還是比較簡單的,不過對於不熟悉Mac系統的用戶來說可能還是有一些困難的,本文:「超詳細的mac重裝系統教程」應該能為第一次安裝Mac系統的朋友提供一些幫助。下面本文就通過圖文詳細介紹一下如何用Mac系統優盤格式化硬碟重裝Mac系統:推薦一個Mac軟體下載網站:https://www.macapp.so/ 1、首先準備一個macOS系統安裝優盤,詳細的macOS系統優盤製作方法看這裡:macOS Catalina 正式版安裝優盤製作圖文方法
  • 搭建直播系統,在線直播系統網站源碼身份大揭秘
    目前市面上各類直播軟體基本發展到成熟階段,各行各業對直播軟體的需求與日俱增,開發一個成熟的直播軟體系統,有一套成熟的在線直播系統網站源碼是關鍵。在直播軟體開發過程中用到的是開源的在線直播系統網站源碼,是指利用開源語言及工具編輯的直播系統源碼,開源即免費的,也可以支持開發人員進行二次開發。目前市面上一般是商業開源的在線直播系統網站源碼,也就是說需要向購買源碼的運營方開放原始碼,並允許運營方在源碼上根據自己的需求進行二次開發、軟體運維等活動。
  • Mac如何重裝系統?macOS在線重裝系統圖文教程
    Mac如何重裝系統?如果您的Mac當前系統使用時間太長,或者使用過程中遇到不可抗拒的問題,想要重裝系統,其實很簡單。Mac重裝系統一共有三種種方法,一種是製作一個macOS啟動U盤(適合進不了系統的,快但是肯能會遇到一些問題,比較複雜),一種是從appstore下載進行安裝(最簡單,適合升級系統),還有一種就是今天我們要介紹的macOS在線重裝系統圖文教程(適合進不了系統的,最好但是耗時)。
  • 案例分享|如何基於XuperChain部署一個儲存千萬數據量的存證系統
    (接下來a、b、c介紹如何通過mac安裝go語言環境,非mac的小夥伴可以跳過了)部分代碼需要滑動才能查看完整版噢通過brew安裝gobrew install go這樣就安裝好了。既然編譯環境準備好了,下面就開始編譯xuperchain源碼。
  • 看直播軟體源碼,如何實現直播系統業務以及技術注意點分析
    直播軟體源碼 一、直播軟體源碼如何開發直播系統 移動網際網路技術和各種智能設備在快速的發展、更新,若在這樣快速的時代下搭建部署屬於自己的直播平臺,首先要做的就是選擇一套完整現成的直播軟體源碼。
  • 知識付費系統源碼的解決方案以及技術突破
    針對於軟體開發商而言,需要從中找出存在的問題,然後一一解決,才可開發出完整的付費系統。針對於系統存在的問題以及知識付費系統源碼的解決方案,我們來具體了解一下。另外,知識付費平臺只完成了知識付費的「任務」,在如何保證用戶留存以及知識付費內容的宣傳推廣方面,還存在一定的缺陷。2、知識付費系統源碼的解決方案如果想要從根本上解決問題,就要看知識付費源碼的了。
  • 八六互聯知識付費系統源碼丨PHP知識付費源碼內容變現源碼
    知識付費系統開發找八六互聯,知識付費軟體開發,知識付費APP開發,知識付費小程序開發,知識付費源碼提供,知識付費源碼定製系統開發;教育行業知識付費系統專業開發公司,內容付費系統源碼提供;八六互聯一直從事網際網路系統開發,知識付費系統從17年立項開發
  • 一對一直播軟體的靈魂:語音源碼系統
    1.更方便的社交方式在社交上,一對一語音源碼系統不再是傳統的先錄音再傳輸的模式,而是逐步拓展為語音傳輸同步,多人實時對講模式等。現在語音輸入不再需要虛擬鍵盤,只需要通過相應的錄音鍵或者語音通話鍵就可以實現語音的傳輸,降低了使用的門檻,交互變易性得到提升。
  • hive之編譯源碼
    使用maven來進行源碼,真的是靠運氣,特別是你網絡很差的情況下,再特別是你沒有本地庫的時候,靠運氣吃飯。。。
  • 直播帶貨系統源碼:直播帶貨系統的本質是什麼?
    直播帶貨系統源碼也因此水漲船高,成為軟體開發行業一大熱門。利用帶貨系統源碼搭建出的直播帶貨系統本質什麼?我們來了解一下。直播帶貨系統源碼直播帶貨系統從本質上來講,是為了實現人與人、人與物之間的信任和交互。利用直播帶貨系統源碼搭建出的直播帶貨系統,是以直播的形式展現的。
  • Windows和Mac 哪家強?你沒見過的深度系統測評!
    微軟No.2 續航問題這在之前也算一個熱點話題,但是這幾年情況有所改觀,以前的mac續航是領先於pc的,但是因為技術革新,pc功耗高,我們可以換大容量電池嘛,所以在這裡也不多說。蘋果No.3 遊戲方面毫無置疑,遊戲方面Windows穩贏。mac用的都是圖形卡,在3D處理方面欠佳。
  • 分布式調度系統XXL-JOB安裝和簡單使用
    我看了一下 GitHub 上開源的分布式調度系統,目前是 xxl-job 項目是分布式調度開源系統中最多 starts 的(當然也有可能因為這個 xxl-job 出來挺久了)window ,mac 或docker 安裝如果為 window,mac 等安裝,可以先根據github 上的 SQL
  • 反編譯SO文件到C源碼
    1、下載IDA Pro,我用的是6.8的版本,解壓後,有idaq.exe、idaq64.exe兩個可執行文件,分別用於反編譯32位、64位的so的so文件。IDA工具2、打開IDA,將需要反編譯的so文件拖到IDA中,在彈出的」load a new file」窗口中, 選擇」ELF for ARM(Shared object)[elf.ldw]」選項,然後再點擊ok按鈕。
  • Mac系統Option鍵的妙用,能夠提升你的效率
    option鍵在Mac上是一個非常神奇的存在,所謂Option用的好,滑鼠用的少,Option鍵存在一些隱藏功能,能夠極大提升你的效率。但是因為是隱藏功能,所以經常被多數人忽視,接下來就為你總結下更多的功能操作,提升你的Mac使用體驗和效率!
  • 用戶關於一對一直播系統源碼的功能需求點
    在移動網際網路發展越來越強大的今天,很多人都想藉此賺錢,尤其是一對一的直播系統的出現,其用戶活躍度高、社交性強、應用廣泛而成為大家關心的首選之一,在一對一直播系統源碼的開發中,哪些點是吸引我們使用的關鍵,一起來了解一下用戶對一對一直播系統功能的需求點吧。
  • 老司機總結下 Android Studio 實用小技巧
    前言相信介紹 Android Studio 快捷鍵啊使用技巧的文章估計比我們屌絲程序猿的數量還要多,所以多我一篇不多,少我一篇不行,那本猿就把自己幾乎每天都用的快捷鍵整理一下,希望能有人用到,如果你已經知曉了,那麼請輕噴,畢竟我too young….(本屌用的是mac,所以win/linux稍微參考一下,畢竟差不多).常用1 .
  • 直播系統開發中,直播源碼起到的作用有哪些?
    直播系統的需求比以往要火熱,直播源碼技術不斷前進,儘管用戶總流量紅利期已過,但網絡直播平臺已經進入成熟的成長期。在現場直播中,現場直播源碼功能的多樣性是在視頻直播市場中出彩的關鍵。直播源開發作為直播系統的脊梁骨幹。那麼直播系統開發中,直播源碼起到的作用有哪些?