1. 程式人生 > >mac編譯原始碼

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的學習了,漫漫長路踏出第一步。