「全國公廁雲平臺」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
就會生成對應的文件。
到此為止,本文的內容已經講完了。覺得不錯的同學可以關注下作者的博客,當然對本篇文章的內容有疑問,也可以到作者的博客中去諮詢。
歡迎長按下圖 -> 識別圖中二維碼
或者 掃一掃 關注我的公眾號