为了学习Android 源码,在Mac 下编译Android源码,Android Studio 下调试。
谷歌官方提供了Android 开源项目(简称AOSP) 网站,获取方法如下:
https://source.android.com/setup/downloading
这个页面介绍了 repo
工具的安装,以及基本用法。
1.确保您的主目录中有一个bin /目录,并将其包含在您的路径中:
mkdir ~/bin
PATH=~/bin:$PATH
2.下载Repo工具并确保它是可执行的:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
3.通过 repo init
将当前目录初始化为工作区
repo init -u <repository 地址> -b <分支名称>
成功初始化后,会在当前工作目录下创建 .repo
文件夹(隐藏的),并从 -u
参数所指定的repository 下载一个 mainffest.xml
文件到.repo
文件夹。清单文件定义了Android源代码中所有的git项目的清单。
<manifest>
<remote name="aosp"
fetch=".." />
<default revision="refs/tags/android-7.1.1_r28"
remote="aosp"
sync-j="4" />
<project path="build" name="platform/build" groups="pdk,tradefed" >
<copyfile src="core/root.mk" dest="Makefile" />
project>
...
manifest>
显而易见,其中每个 project 项都代表一个 git 项目,name
属性指定了git 项目名称,path
属性指定了git 项目将被下载到哪个文件中。revision
指定了那个分支的代码。通过 repo sync
命令便可以下载代码。repo sync
可以接受 -j 参数进行多线程的代码下载以提高下载速度。例:repo sync -j4
。
repo sync platform/frameworks/base
repo sync 也可以接受 git 项目名称作为参数单独下载这个项目的代码。
AndroidXRef(http://androidxref.com/)项目提供 Android 源码的交叉索引,可以快速的搜索符合特定条件的 Android 源代码,后台是基于 OpenGrok 引擎,OpenGrok是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜索、定位、对照代码树。AndroidXRef 提供了完整的 Android kernel源码的索引。在 AndroidXRef 主页的右侧显示了可用的源码版本。
aosp 官网上介绍如何设置您的本地工作环境来构建Android源文件。您将需要使用Linux或Mac OS。比如我用Mac 就可以参考Mac 编译环境 进行配置。
简单来说,一个创建大小写敏感的磁盘映像来装源码,Android 6.0的代码大约需要50GB,编译后达70多GB。
1.创建磁盘空间
hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 50g ~/android.dmg
2.调整磁盘空间的大小
hdiutil resize -size 85g ~/android.dmg.sparseimage
3.挂载映像
function mountAsop { hdiutil attach /Volumes/Mac/MySourceFiles/aosp/android.dmg.sparseimage -mountpoint /Volumes/android; }
function umountAsop() { hdiutil detach /Volumes/android; }
在Mac中,默认的文件同时打开数实在太低,一个高速并行的编译进程运行时可能会遇到瓶颈。(注:Mac上限制最大打开文件数的原因是每打开一个文件,系统都需要内存来管理它们,内存是有限的资源)
为了增加最大文件打开数量,在~/.bash_profile中添加:
# 设置文件打开数量为1024
ulimit -S -n 1024
下载和编译 Android 源代码之前,请先确保您的系统符合官方要求。请参阅requirements
开始编译Android 源码,请参阅Preparing to Build 。总结一下,其步骤如下:
source build/envsetup.sh
or . build/envsetup.sh
,将初始化Android 的编译环境,并声明了一系列方便操作源代码的bash函数,如 mmm、mm、cgrep、jgrep 等。lunch + buildType
设置即将编译的项目及类型 or lunch
再选择编译的项目及类型。make -j4
,启动4个线程进行编译,编译产物都会存储在Android 源代码根目录下的out 文件夹中。编译Android 源码总不会一帆风顺的。根据错误信息提示,少了什么就安装什么。比如:/bin/bash: xmllint: 未找到命令
就执行brew install libxml2
即可,c++ 头文件也是如此。另外多查查资料。
在 /development/ide
下分别有eclipse/emacs/intellij 这3个ide 的配置文件
首先 \development\ide\eclipse\.classpath
文件复制到Android源码根目录下,因为源码文件十分多,强烈建议eclipse、intellij 增加jvm 内存大小。 可修改.classpath
文件指定 Eclipse 导入那些代码,导入Android源码只需要new Java Project (不是Android project)选择从已存在的工程导入,定位到Android源码的目录进行导入即可。
在 /development/ide
下分别有eclipse/emacs/intellij 这3个ide 的配置文件。因为源码文件十分多,强烈建议as增加jvm 内存大小。
编译源码(为了确保生成了.java文件,如R.java;如果编译过,则无需再次编译)
检查out/host/linux-x86/framework/目录下是否有idegen.jar
如果idegen.jar不存在, 执行:
mmm development/tools/idegen/
development/tools/idegen/idegen.sh
等待出现类似下面的结果:
Read excludes: 5ms
Traversed tree: 44078ms
这时会在源码的根目录下生成android.ipr和android.iml两个IntelliJ IDEA(AS是基于IntelliJ IDEA社区版开发的)的配置文件.
Tips:AS在导入代码时比较慢,建议先修改android.iml,将自己用不到的代码exclude出去.可以仿照过滤.repo文件夹的语法,如:
"file://$MODULE_DIR$/.repo" />
"file://$MODULE_DIR$/abi" />
"file://$MODULE_DIR$/art" />
...
还可以通过as 的module settings - dependents 删除掉所有不需要的module-library项
这样在导入时就会跳过abi和art文件夹.过滤的越多,AS的处理速度就会越快.最后在AS中打开源码根目录下新生成的android.ipr
要为当前工程设置正确的SDK和JDK,需要Android API 19 Platform,jdk 则无所谓,因为libcore 目录下包括了jdk 的源码。添加一个jdk 接着把classpath 所有项remove 掉,接着Android API 19 Platform 选择空的jdk.如下图
点击Project
点击Modules, 选择相应的代码模块,比如frameworks、packages 等源码目录,且把它们移动到最前优先从这两个文件夹下查找,而不是在Android.jar中查找
NOTE: Empty Library 不要紧的。
在’Modules’中添加’Android Framework’来让AS将它作为一个Android工程,从而方便我们调试代码.
在代码中加断点,然后选择’Run’->’Attach debugger to Android process’或者直接点击ToolBar 上的Attach debugger图标。在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.