記一次Android源碼編譯過程
實驗環境
- MacOS Mojave 10.14; RAM 16G
- SSD硬盤 960G
- 能訪問google的網絡環境
第一步:準備環境
可參考官網說明:https://source.android.com/setup/build/initializing
-
準備磁盤
- 磁盤鏡像方式(官方推薦25G,建議60G+)
# 創建一個 .dmg(也可能是 .dmg.sparseimage)文件 hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 60g ~/android.dmg # 調整大小 hdiutil resize -size 100g ~/android.dmg.sparseimage # 在 .bash_profile 中添加掛載輔助函數 mountAndroid() { hdiutil attach ~/android.dmg.sparseimage -mountpoint /Volumes/android; } umountAndroid() { hdiutil detach /Volumes/android; }
- 外置硬盤方式:直接格式外外置硬盤(MAC OS拓展 (區分大小寫,日誌式))
- 磁盤鏡像方式(官方推薦25G,建議60G+)
-
安裝Xcode命令行工具:這一步一般會需要最新的MacOS大版本(目前需要MoJave)
# 安裝Xcode命令行工具 ,直接使用最新版本會有一些問題,可以在下面的鏈接下載舊版本的命令行工具即可(9.4.1) # 建議從這裏下:https://developer.apple.com/download/more/ xcode-select --install
-
安裝MacPorts:https://www.macports.org/install.php
# 從上面的鏈接選擇合適版本安裝後,編輯 ~/.bash_profile,確保 /opt/local/bin 必須顯示在 /usr/bin 前面: export PATH=/opt/local/bin:$PATH
-
用MacPorts準備相關編譯工具
# 分別是gmake,libsdl,gnupg(gnupg1過時了,這裏選擇gnupg2),git POSIXLY_CORRECT=1 sudo port install gmake libsdl gnupg2 git
-
設置文件符數量上限
# ~/.bash_profile: set the number of open files to be 1024 ulimit -S -n 1024
-
配置Repo與下載源碼
mkdir ~/bin PATH=~/bin:$PATH # 下載Repo curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo chmod a+x ~/bin/repo # 掛載磁盤並創建源碼存放路徑 mountAndroid mkdir /Volumes/android/aosp cd /Volumes/android/aosp # 檢出分支 默認master 加 -b android-8.1.0_r64 可切換到8.1 repo init -u https://android.googlesource.com/platform/manifest # 長達一個小時+的下載過程 repo sync # 切換分支到 repo start android-8.1.0_r64 --all
第二步:編譯源碼
到這裏,如果image鏡像是在模擬器運行就可以開始編譯了,否則還需按官網說明下載驅動。
# 清空輸出目錄
cd /Volumes/android/aosp
make clobber
# 生成編譯腳本
. build/envsetup.sh
# 選擇構建目標
lunch
aosp_x86_64-eng
# aosp:Android Open Source Project,可供進行編譯使用;
# _x84_64: Binder支持64位;
# -eng:擁有各種調試工具的開發版設置,擁有root跟debug權限
# 編譯;make jN,一般N爲當前CPU核心數的1~2倍,這個過程應該需要一點時間 :)
make -j4
# 經過漫長莫約3h+後,我這邊已經build好了,由於沒有原生真機只能模擬器運行了
# 關閉命令行後,可以先跑下面兩個命令:
# . build/envsetup.sh
# lunch
emulator
附
導入源碼到AS調試Java層代碼
由於導入源碼佔內存較大,可先在 /應用程序/Android Studio/Contents/bin/studio.vmoptions
中配置內存參數:-Xmx2048m
# 初始化命令工具
. build/envsetup.sh
#編譯 idegen 模塊,生成idegen.jar
mmm development/tools/idegen/
# 生成針對 Android 開發工具的配置文件
./development/tools/idegen/idegen.sh
# 這樣會在源碼路徑下生成以下三個熟悉的文件
# android.ipr:編譯器配置、入口,相關的libraries等。也是導入源碼的入口。
# android.iml:描述了modules和依賴關係等,有確認不需要導入的文件夾可在這裏設置。
# android.iws:工作區的設置。
android.ipr
# 一段時間後,就能導入進來了,配置一下依賴跳轉
# File -> Project Structure 打開 Module,然後選中 Dependencies:
# 保留 JDK 跟 Module Source 項,並添加源碼的 external 和 frameworks 依賴
# 啓動模擬器,就可以 Attach Debugger to Android process 調試了。
# 調試可以參考:http://weishu.me/2016/05/30/how-to-debug-android-framework/
使用gdbclient調試C層代碼
gdb操作可參考:https://blog.csdn.net/dream_cs/article/details/78847065
# 通過 shell ps + grep 過濾進程
adb shell ps -A | grep calculator
# gdbclient <pid> 可以通過 gdbserver 調試對應的進程
gdbclient 2341
# r:run
# b <path/file>:<line>:breakpoint
# c:continue
# s:step
# p <variable>:print
(gdb) c
問題記錄
-
MacOS 編譯Android源碼提示找不到tools.jar
build/core/config.mk:663: error: Error: could not find jdk tools.jar at /System/Library/Frameworks/JavaVM.framework/Versions/Current/Commands/../lib/tools.jar, please check if your JDK was installed correctly.
解決:可以保證設備是有JDK的,查一下文件發現,還需要在 .bash_profile 中配置變量
export ANDROID_JAVA_HOME=$JAVA_HOME
,好了了以後需要刷新一下:. ~/.bash_profile
-
找不到對應的macOS.sdk:internal error: Could not find a supported mac sdk: [“10.10” “10.11” “10.12” “10.13”]
解決:# 先查看XCode 中 mac sdk的版本,我的是 10.14 cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/ ls # 方式一、在源碼目錄 darwinSupportedSdkVersions 中添加(這個方式我試過,後續在我的設備還是編譯不過去) vim build/soong/cc/config/x86_darwin_host.go darwinSupportedSdkVersions = []string{ "10.10", "10.11", "10.12", "10.13", "10.14", } # 方式二、在 https://github.com/phracker/MacOSX-SDKs/releases 下載 Command_Line_Tools_macOS_10.13_for_Xcode_9.4.1.dmg (這個以前是10.13的)安裝即可。
另外有參考:
https://www.cnblogs.com/liumce/p/8027559.html
https://blog.csdn.net/yemao_guyue/article/details/80871390
https://www.jianshu.com/p/063a0bcdc7f5