深入理解Android开篇之Android源代码编译及调试

前言

为了学习Android 源码,在Mac 下编译Android源码,Android Studio 下调试。

获取 Android 源码

谷歌官方提供了Android 开源项目(简称AOSP) 网站,获取方法如下:

​ https://source.android.com/setup/downloading

这个页面介绍了 repo 工具的安装,以及基本用法。

Installing 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 项目名称作为参数单独下载这个项目的代码。

在线阅读Android 源码

AndroidXRef(http://androidxref.com/)项目提供 Android 源码的交叉索引,可以快速的搜索符合特定条件的 Android 源代码,后台是基于 OpenGrok 引擎,OpenGrok是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜索、定位、对照代码树。AndroidXRef 提供了完整的 Android kernel源码的索引。在 AndroidXRef 主页的右侧显示了可用的源码版本。

编译Android源码

搭建编译环境

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 。总结一下,其步骤如下:

  1. 执行 source build/envsetup.sh or . build/envsetup.sh ,将初始化Android 的编译环境,并声明了一系列方便操作源代码的bash函数,如 mmm、mm、cgrep、jgrep 等。
  2. 执行 lunch + buildType 设置即将编译的项目及类型 or lunch 再选择编译的项目及类型。
  3. 执行 make -j4 ,启动4个线程进行编译,编译产物都会存储在Android 源代码根目录下的out 文件夹中。

编译错误

编译Android 源码总不会一帆风顺的。根据错误信息提示,少了什么就安装什么。比如:/bin/bash: xmllint: 未找到命令 就执行brew install libxml2 即可,c++ 头文件也是如此。另外多查查资料。

在 IDE 中导入 Android 源码

/development/ide 下分别有eclipse/emacs/intellij 这3个ide 的配置文件

将Android 源码导入Eclipse

首先 \development\ide\eclipse\.classpath 文件复制到Android源码根目录下,因为源码文件十分多,强烈建议eclipse、intellij 增加jvm 内存大小。 可修改.classpath 文件指定 Eclipse 导入那些代码,导入Android源码只需要new Java Project (不是Android project)选择从已存在的工程导入,定位到Android源码的目录进行导入即可。

在 Android Studio中导入 Android 源码

/development/ide 下分别有eclipse/emacs/intellij 这3个ide 的配置文件。因为源码文件十分多,强烈建议as增加jvm 内存大小。

生成导入AS所需配置文件(*.ipr)

  • 编译源码(为了确保生成了.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.如下图
步骤1

点击Project
步骤2

点击Modules, 选择相应的代码模块,比如frameworks、packages 等源码目录,且把它们移动到最前优先从这两个文件夹下查找,而不是在Android.jar中查找
这里写图片描述
NOTE: Empty Library 不要紧的。

DEBUG源码

在’Modules’中添加’Android Framework’来让AS将它作为一个Android工程,从而方便我们调试代码.
这里写图片描述

在代码中加断点,然后选择’Run’->’Attach debugger to Android process’或者直接点击ToolBar 上的Attach debugger图标。在弹出的选择进程(Choose Process)对话框中,勾选显示所有进程,选择要DEBUG的代码所在的进程,点击OK即可.

你可能感兴趣的:(Android)