android studio調(diào)試源碼
環(huán)境
- 系統(tǒng):macOS High Sierra 10.13.2
- JDK: 1.8.0_201
- Xcode:9.3
- AOSP分支:andriod-8.1.0_r20
- python:2.7 (一般自帶)
安裝xcode 命令行工具
xcode歷史版本
由于appstore上的xcode只能裝10.14系統(tǒng)上. 這邊從歷史版本下載了Command Line Tools(macOS 10.13) for Xcode 9.3
安裝MacPorts或者HomeBrew
主要用于安裝軟件
macports下載鏈接 根據(jù)自己系統(tǒng)選擇
這邊shell用的:zsh
-
直接編輯~/.zshrc文件
添加
export PATH = /opt/local/bin:$PATH
保存POSIXLY_CORRECT=1 sudo port install gmake libsdl git gnupg`
或者
brew install gmake libsdl git gnupg
設(shè)置可以同時(shí)打開(kāi)文件數(shù)字限制
在~/.zshrc下添加 ulimit -S -n 1024
創(chuàng)建APFS卷宗
可以通過(guò) shell 使用以下命令創(chuàng)建磁盤(pán)映像:搞完之后60多G 最后大一點(diǎn)這里搞200g
# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 200g ~/android.dmg
這將創(chuàng)建一個(gè) .dmg(也可能是 .dmg.sparseimage)文件匿垄,該文件在裝載后可用作具有 Android 開(kāi)發(fā)所需格式的存儲(chǔ)卷色冀。
如果您以后需要更大的存儲(chǔ)卷,還可以使用以下命令來(lái)調(diào)整稀疏映像的大小:
# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
對(duì)于存儲(chǔ)在主目錄下的名為 android.dmg 的磁盤(pán)映像竿裂,您可以向 ~/.zshrc 中添加輔助函數(shù):
要在執(zhí)行 mountAndroid 時(shí)裝載磁盤(pán)映像,請(qǐng)運(yùn)行以下命令:
function mountAndroid { hdiutil attach ~/android.dmg -mountpoint /Volumes/android; }
注意:如果系統(tǒng)創(chuàng)建的是 .dmg.sparseimage 文件,請(qǐng)將 ~/android.dmg 替換成 ~/android.dmg.sparseimage奢赂。
要在執(zhí)行 umountAndroid 時(shí)卸載磁盤(pán)映像,請(qǐng)運(yùn)行以下命令:
# unmount the android file image
function umountAndroid() { hdiutil detach /Volumes/android; }
執(zhí)行mountAndroid
成功后 在finder中可以找到android存儲(chǔ)圈
裝載 android 存儲(chǔ)卷后颈走,您將在其中開(kāi)展所有工作膳灶。您可以像對(duì)待外接式存儲(chǔ)盤(pán)一樣將其彈出(卸載)。
下載源代碼
- 確保主目錄下有一個(gè) bin/ 目錄立由,并且該目錄包含在路徑中
mkdir ~/bin
~/.zshrc中加入PATH=~/bin:$PATH
- 下載 Repo 工具轧钓,并確保它可執(zhí)行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
初始化repo
-
在我們自己創(chuàng)建的android存儲(chǔ)卷下一般掛載的新的盤(pán)是在/Volumes/ 路徑下
makdir WORK_DIR cd WORK_DIR
這里需要科學(xué)上網(wǎng)一半用其他鏡像完成 -b命令指定分支
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-8.1.0_r20
在~/.zshrc中添加
export REPO_URL ='https://mirros.tuna.tsinghua.edu.cn/git/git-repo'
然后
repo sync
進(jìn)入下載源代碼進(jìn)入漫長(zhǎng)的等待。由于下載源碼的時(shí)間太長(zhǎng)锐膜,中途可能會(huì)出現(xiàn)中斷情況毕箍,雖然repo同步是支持?jǐn)帱c(diǎn)續(xù)傳,但是不知道什么時(shí)候會(huì)斷開(kāi)道盏,這一點(diǎn)很麻煩而柑,所以可以寫(xiě)一個(gè)shell腳本來(lái)開(kāi)啟同步#!/usr/bin/env bash repo sync -j4 while [ $? -ne 0 ] do repo sync -j4 done
執(zhí)行這個(gè)./xxx.sh
編譯源代碼
在WORK_DIR目錄下
make之前有幾個(gè)地方注意
-
could not find jdk tools.jar
在~/.zshrc下添加JAVA_HOME
-
could not find mac sdk
在build/soong/cc/config/x86_darwin_host.go文件中添加10.13支持darwinSupportedSdkVersions=[]String{ "10.10", "10.11", "10.12", "10.13",//添加 }
-
遇到bison錯(cuò)誤 BISON_PKGDATADIR=external/bison/data prebuilts/misc/darwin-x86/bison/bison -d --
cd WORK_DIR/external/bison git cherry-pick c0c852bd6fe462b148475476d9124fd740eba160 mm cp WORK_DIR/out/host/darwin-x86/bin/bison WORK_DIR/prebuilts/misc/darwin-x86/bison/
source build/envsetup.sh
lunch aosp_arm-eng
make -j4
這里又進(jìn)入漫長(zhǎng)等待
源碼導(dǎo)入android studio
bash
source build/envsetup.sh # 在新終端下需要執(zhí)行這一步
mmma development/tools/idegen
development/tools/idegen/idegen.sh
- 由于aosp工程很大,在導(dǎo)入IDEA前需要先修改配置:
-
修改VM內(nèi)存大小
打開(kāi)IDEA 菜單欄 Help > Edit Custom VM Options荷逞,添加-Xms1g -Xmx5g
-
修改文件大小限制媒咳,打開(kāi)區(qū)分大小寫(xiě)選項(xiàng)
打開(kāi)IDEA 菜單欄 Help -> Edit custom properties, 添加idea.max.intellisense.filesize=100000 idea.case.sensitive.fs=true
重啟生效
-
在WORK_DIR根目錄下
android.iml 和 android.ipr 這兩個(gè)文件种远,這兩個(gè)文件是 Android Studio 的工程配置文件涩澡,這時(shí)候其實(shí)已經(jīng)可以直接導(dǎo)入 Android Studio,但會(huì)導(dǎo)入所有的源碼模塊坠敷,會(huì)很慢妙同,可以進(jìn)行過(guò)濾,除了 frameworks 模塊和 packages 模塊常拓,其他都給過(guò)濾掉渐溶,不導(dǎo)入 Android Studio,打開(kāi) android.iml 文件弄抬,搜下
excludeFolder
茎辐,在后面加入如下代碼
<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$/hardware" />
<excludeFolder url="file://$MODULE_DIR$/kernel" />
<excludeFolder url="file://$MODULE_DIR$/libcore" />
<excludeFolder url="file://$MODULE_DIR$/libnativehelper" />
<excludeFolder url="file://$MODULE_DIR$/out" />
<excludeFolder url="file://$MODULE_DIR$/pdk" />
<excludeFolder url="file://$MODULE_DIR$/platform_testing" />
<excludeFolder url="file://$MODULE_DIR$/prebuilts" />
<excludeFolder url="file://$MODULE_DIR$/sdk" />
<excludeFolder url="file://$MODULE_DIR$/system" />
<excludeFolder url="file://$MODULE_DIR$/test" />
<excludeFolder url="file://$MODULE_DIR$/toolchain" />
<excludeFolder url="file://$MODULE_DIR$/tools" />
<excludeFolder url="file://$MODULE_DIR$/.repo" />
用android studio打開(kāi)Android.ipr 等待scanning files to index結(jié)束
安裝到虛擬機(jī)
執(zhí)行
emulator
這里會(huì)打開(kāi)虛擬機(jī)并安裝系統(tǒng)鏡像
源碼調(diào)式
點(diǎn)擊android studio attach process按鈕選擇我們需要調(diào)式的進(jìn)程比如system_server在AMS處打上斷點(diǎn)就可以調(diào)式了
總結(jié)
其實(shí)只要調(diào)式源碼沒(méi)這么麻煩
- 下載framworks部分的代碼
- 搞一個(gè)對(duì)應(yīng)版本的虛擬機(jī)
- 搞一個(gè)android.iml 和 android.ipr文件用andriod studio 打開(kāi).ipr
- attach進(jìn)程,打斷點(diǎn)掂恕。