mac編譯原始碼
Mac 編譯 android framework 6.0原始碼
工作到現在為止剛好一年半,一直做著公司Android產品的半開發半維護的工作,內心一直嚮往一份關於android framework開發方面的工作,前面幾個月研讀了一些設計模式和android framework原始碼的書,接下來的目標就是搭建除錯framework的環境,聽說mac不錯,於是買了個mba 128g的筆記本,現在有點後悔,如果時間能重新選擇,一定買mbp,本來打算編譯2.3點原始碼的,但是看了官方的android版本於編譯系統的對應關係,還是決定按要求來吧,選擇了android6.0.1版本,而且自己有個nexus5,正好可以刷。
Android版本 | Mac OS (Intel/x86) |
---|---|
Android 6.0 (Marshmallow) - Android最新版本 | Mac OS v10.10 (Yosemite) or later with Xcode 4.5.2 and Command Line Tools |
Android 5.x (Lollipop) | Mac OS v10.8 (Mountain Lion) with Xcode 4.5.2 and Command Line Tools |
Android 4.1.x-4.3.x (Jelly Bean) - Android 4.4.x (KitKat) | Mac OS v10.6 (Snow Leopard) or Mac OS X v10.7 (Lion) and Xcode 4.2 (Apple’s Developer Tools) |
Android 1.5 (Cupcake) - Android 4.0.x (Ice Cream Sandwich) | Mac OS v10.5 (Leopard) or Mac OS X v10.6 (Snow Leopard) and the Mac OS X v10.5 SDK |
1、本文相關配置
硬體:
1、MacBook Air i5雙核處理器 硬碟128g 記憶體8g
2、一塊2T的行動硬碟
3、nexus5
軟體:
1、各個版本的jdk,jdk6、jdk7、jdk8,(本文選擇android版本為6.0.1因此預設用jdk7)網盤地址 密碼:tz95
2、repo 下載地址
3、清華映象站的初始化包 下載地址
4、選擇編譯的android版本為android-6.0.1_r60(r60分支只支援刷入nexus5)
5、xcode8(最新版為xcode9,但是編譯過程提示xcode和aosp中externl庫函式衝突,google發現別人也有這個問題,換xcode8後解決了)
6、MacOSX10.11.sdk(xcode8預設的MacOSX10.12.sdk編譯時會提示有些函式廢棄了編譯不了,因此需要下載10.11.sdk,並拷貝到10.12.sdk同一目錄下)網盤地址密碼:kv23
7、MacPorts(用於方便安裝make、git、gpg等相關工具)下載地址
8、nexus5 r60分支版本的驅動
nexus5 r60分支版本MOB30Y的驅動網盤地址密碼:2a33,不同版本對應不同驅動,這個要注意
2、下載原始碼
國內有長城,google下不來,可以從清華大學開源軟體映象站下,看介紹原始碼會有30g以上,但是自己的筆記本卻只有128g,而且現在就剩40g了,查資料發現可以在行動硬碟弄,於是乎買了個2t的行動硬碟。
3、下載repo工具
1.這個命令會下載一個repo的檔案到當前命令的目錄下
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
*第一個知識點:repo
2.在home目錄下建立bin目錄
mkdir ~/bin
3.把上面下載的repo拷貝到~/bin目錄下
4.賦予許可權
chmod a+x ~/bin/repo
5.用文字編輯的方式開啟repo,並且修改為REPO_URL為:
REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
4、安裝MacPorts
接著使用下面等MacPorts命令安裝make、git等工具
sudo port install gmake libsdl git-core gnupg
5、建立一個區分大小寫的映象檔案
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 100g ~/android.dmg.sparsefile.sparseimage
這個映象主要是用來存放原始碼的,由於我用的是行動硬碟來編譯原始碼,因此把這個映象檔案移動到移動硬盤裡,因為自己筆記本容量小,因此把映象檔案拷到行動硬碟後再進行使用映象,這步很重要,這個100g是映象的上限,新建立時並沒有100g,只有200多m,而且可以動態改變大小,只要用下面的命令
hdiutil resize -size 150g ~/android.dmg.sparsefile.sparseimage
我編譯了模擬器以及真機的映象,最後映象大小為127g,當然如果編譯時空間不夠,可以把.repo刪除了
在~/根目錄下看看有沒有.bash_profile檔案,沒有就建立一個,這個檔案主要是用來進行一些環境變數的配置,下面是我自己的.bash_profile檔案
# 用來掛載映象的函式
function mountAndroid { hdiutil attach /Volumes/mhdd/android.dmg.sparsefile.sparseimage -mountpoint /Volumes/android; }
# 推出映象,跟在桌面推出效果一樣
function umountAndroid() { hdiutil detach /Volumes/android; }
# 安裝MacPorts的變數配置
PATH=/opt/local/bin:$PATH
PATH=/opt/local/sbin:$PATH
#解除1024限制
ulimit -S -n 1024
# -------------java的環境變數start---------------------
# Mac預設 JDK 6
export JAVA_6_HOME=`/usr/libexec/java_home -v 1.6`
# 設定 JDK 7
export JAVA_7_HOME=`/usr/libexec/java_home -v 1.7`
# 設定 JDK 8
export JAVA_8_HOME=`/usr/libexec/java_home -v 1.8`
#預設JDK 7
export JAVA_HOME=$JAVA_7_HOME
#alias命令動態切換JDK版本,直接在命令列輸入jdk6或其他版本就可切換了
alias jdk6="export JAVA_HOME=$JAVA_6_HOME"
alias jdk7="export JAVA_HOME=$JAVA_7_HOME"
alias jdk8="export JAVA_HOME=$JAVA_8_HOME"
# -------------java的環境變數end---------------------
#-------------------repo環境變數-------------------
export PATH=$PATH:$HOME/bin
#-----------------android sdk環境變數--------------
#主要是執行adb命令,fastboot命令等用到,這是我本地的路徑,根據需要自己修改
ANDROID_HOME=/Users/xuanliang/coding/android/android-sdk-macosx
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
*第二個知識點:bash_profile檔案是什麼
用命令列mountAndroid掛載好映象檔案後,就可以像硬碟一樣使用映象檔案了,在映象中建立aosp資料夾,接著從清華映象站下載好40多g的原始包,把它解壓到映象檔案aosp資料夾裡,是一個.repo的檔案。(一開始自己是先從筆記本硬碟把壓縮檔案拷到映象裡再解壓,發現很慢,想起來是因為映象在行動硬碟上的原因,於是採用直接從筆記本用命令把檔案解壓到映象檔案裡,就快多了),命令列進入到aosp目錄,執行初始化repo到命令:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-6.0.1_r60
r60代表是nexus5的MOB30Y版本,_r60這個引數很重要,因為對應著機型版本以及驅動版本,版本不對燒寫真機時容易出問題,可以根據需要取其他分支。然後執行下面的命令進行同步。
repo sync
同步完成後aosp目錄會生成6.0.1_r60分支的所有程式碼,可以通過.repo目錄裡的manifest檔案看看所下分支是否正確。(執行repo sync命令時遇到了一個坑,查了半天發現是當時解壓用的軟體解壓的,解壓的不完全,解壓出的檔案有問題,後來把檔案都刪除了,重新用命令列解壓後再進行repo sync同步就好了,得了個教訓以後對於大檔案解壓還是得用命令列)
然後就是進行編譯了
$ source build/envsetup.sh
lunch
make -j4
編譯成功會在products裡生成hammerhead資料夾,燒寫入真機時要進入這個資料夾執行fastboot等命令,如果上面lunch選擇1則會generic資料夾,裡面是模擬器用到的映象相關檔案
因為要燒寫入真機,因此先執行驅動的三個指令碼檔案生成相關檔案,如果只需要模擬器則跳過這步
首先把驅動指令碼拷進aosp目錄,然後依次執行三個驅動指令碼
./extract-broadcom-hammerhead.sh
./extract-lge-hammerhead.sh
./extract-qcom-hammerhead.sh
執行過程中會有一些條款,閱讀完後會提示輸入“同意”指令,輸入完會在相關目錄生成驅動檔案。
最後手機連上電腦,執行adb命令
adb reboot bootloader
這個命令會讓手機重啟並進入刷機模式,如果adb命令找不到,先看看是否環境變數配置正確,adb工具以及fastboot工具在android的sdk裡,參考步驟5裡的配置
#cd 到原始碼編譯輸出的目錄執行fastboot命令
fastboot -w flashall
最後刷機成功。
接著是生成android studio能匯入的檔案,使用如下命令
make idegen && development/tools/idegen/idegen.sh
會在原始碼目錄生成兩個檔案,如下圖,
可以對android.imp進行編輯去掉一些模組,這樣android studio匯入就會快點。
<excludeFolder url="file://$MODULE_DIR$/.repo" />
<excludeFolder url="file://$MODULE_DIR$/abi" />
<excludeFolder url="file://$MODULE_DIR$/art" />
<excludeFolder url="file://$MODULE_DIR$/bionic" />
<excludeFolder url="file://$MODULE_DIR$/bootable" />
<excludeFolder url="file://$MODULE_DIR$/build" />
<excludeFolder url="file://$MODULE_DIR$/cts" />
<excludeFolder url="file://$MODULE_DIR$/dalvik" />
<excludeFolder url="file://$MODULE_DIR$/developers" />
<excludeFolder url="file://$MODULE_DIR$/development" />
<excludeFolder url="file://$MODULE_DIR$/device" />
<excludeFolder url="file://$MODULE_DIR$/docs" />
<excludeFolder url="file://$MODULE_DIR$/external" />
<excludeFolder url="file://$MODULE_DIR$/external/bluetooth" />
<excludeFolder url="file://$MODULE_DIR$/external/chromium" />
<excludeFolder url="file://$MODULE_DIR$/external/emma" />
<excludeFolder url="file://$MODULE_DIR$/external/icu4c" />
<excludeFolder url="file://$MODULE_DIR$/external/jdiff" />
<excludeFolder url="file://$MODULE_DIR$/external/webkit" />
<excludeFolder url="file://$MODULE_DIR$/frameworks/base/docs" />
<excludeFolder url="file://$MODULE_DIR$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/ndk" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/out/eclipse" />
<excludeFolder url="file://$MODULE_DIR$/out/host" />
<excludeFolder url="file://$MODULE_DIR$/out/target/common/docs" />
<excludeFolder url="file://$MODULE_DIR$/out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates" />
<excludeFolder url="file://$MODULE_DIR$/out/target/product" />
<excludeFolder url="file://$MODULE_DIR$/packages" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/prebuilt" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
接著還要在android stuidio中進行一些原始碼關聯sdk的配置,
然後就可以通過真機除錯framework原始碼了。手機連上電腦,關聯debugger可以看到手機上的所有程序。選擇system_process繫結,
然後在activitymanagerservice中找個位置打上斷點,隨便開啟一個app,發現可以跳進斷點了。
編譯過程完成,後面就是進一步對android framework的學習了,漫漫長路踏出第一步。