android studio调试源码
环境
- 系统: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系统上. 这边从历史版本下载了Command Line Tools(macOS 10.13) for Xcode 9.3
安装MacPorts或者HomeBrew
主要用于安装软件
macports下载链接 根据自己系统选择
这边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
设置可以同时打开文件数字限制
在~/.zshrc下添加 ulimit -S -n 1024
创建APFS卷宗
可以通过 shell 使用以下命令创建磁盘映像:搞完之后60多G 最后大一点这里搞200g
# hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 200g ~/android.dmg
这将创建一个 .dmg(也可能是 .dmg.sparseimage)文件,该文件在装载后可用作具有 Android 开发所需格式的存储卷。
如果您以后需要更大的存储卷,还可以使用以下命令来调整稀疏映像的大小:
# hdiutil resize -size <new-size-you-want>g ~/android.dmg.sparseimage
对于存储在主目录下的名为 android.dmg 的磁盘映像,您可以向 ~/.zshrc 中添加辅助函数:
要在执行 mountAndroid 时装载磁盘映像,请运行以下命令:
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; }
执行mountAndroid
成功后 在finder中可以找到android存储圈
装载 android 存储卷后,您将在其中开展所有工作。您可以像对待外接式存储盘一样将其弹出(卸载)。
下载源代码
- 确保主目录下有一个 bin/ 目录,并且该目录包含在路径中
mkdir ~/bin
~/.zshrc中加入PATH=~/bin:$PATH
- 下载 Repo 工具,并确保它可执行
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
初始化repo
-
在我们自己创建的android存储卷下一般挂载的新的盘是在/Volumes/ 路径下
makdir WORK_DIR cd WORK_DIR
这里需要科学上网一半用其他镜像完成 -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
进入下载源代码进入漫长的等待。由于下载源码的时间太长,中途可能会出现中断情况,虽然repo同步是支持断点续传,但是不知道什么时候会断开,这一点很麻烦,所以可以写一个shell脚本来开启同步#!/usr/bin/env bash repo sync -j4 while [ $? -ne 0 ] do repo sync -j4 done
执行这个./xxx.sh
编译源代码
在WORK_DIR目录下
make之前有几个地方注意
-
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错误 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
这里又进入漫长等待
源码导入android studio
bash
source build/envsetup.sh # 在新终端下需要执行这一步
mmma development/tools/idegen
development/tools/idegen/idegen.sh
- 由于aosp工程很大,在导入IDEA前需要先修改配置:
-
修改VM内存大小
打开IDEA 菜单栏 Help > Edit Custom VM Options,添加-Xms1g -Xmx5g
-
修改文件大小限制,打开区分大小写选项
打开IDEA 菜单栏 Help -> Edit custom properties, 添加idea.max.intellisense.filesize=100000 idea.case.sensitive.fs=true
重启生效
-
在WORK_DIR根目录下
android.iml 和 android.ipr 这两个文件,这两个文件是 Android Studio 的工程配置文件,这时候其实已经可以直接导入 Android Studio,但会导入所有的源码模块,会很慢,可以进行过滤,除了 frameworks 模块和 packages 模块,其他都给过滤掉,不导入 Android Studio,打开 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打开Android.ipr 等待scanning files to index结束
安装到虚拟机
执行
emulator
这里会打开虚拟机并安装系统镜像
源码调式
点击android studio attach process按钮选择我们需要调式的进程比如system_server在AMS处打上断点就可以调式了
总结
其实只要调式源码没这么麻烦
- 下载framworks部分的代码
- 搞一个对应版本的虚拟机
- 搞一个android.iml 和 android.ipr文件用andriod studio 打开.ipr
- attach进程,打断点。