1.2 Android的开发环境和源代码
↘1.2.1 Android的开发环境
Android的Linux开发环境一般使用Ubuntu主机。在基于Ubuntu的主机环境中,开发Android主机环境包括以下需求:git工具、repo工具、Java的JDK、主机编译工具等。编译过程中主要的目标机编译工具则使用Android开源工程中自带的。
Android系统在编译过程中需要编译主机的工具,因此需要使用主机的GCC工具链。而对于编译目标机文件,Android在prebuilt目录中集成了GCC交叉编译工具链。
新版本Android源代码编译应当使用64位的主机环境,配置方式如下所示:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zliblg-dev libc6-dev lib32ncurses5-dev ia32-libs \ xllproto-core-dev libxll-dev lib32readline5-dev lib32z-dev \ libgll-mesa-dev g++-multilib mingw32 tofrodos python-markdown \ libxml2-utils
而32位的主机开发环境,配置方式如下所示:
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \ zip curl zliblg-dev libc6-dev libncurses5-dev xllproto-core-dev \ libxll-dev libreadline6-dev libgll-mesa-dev tofrodos python-markdown \ libxml2-utils
repo是调用git封装的工具,安装repo的准备工作如下所示:
$ mkdir ~/bin $ PATH=~/bin:$PATH
repo工具同样可以在Android的网站上获得,方法如下所示:
$ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo $ chmod a+x ~/bin/repo
repo是一个由Google提供的工具,本质上是一个脚本,它可能随时更新,因此应当从Google的相应地址获得最新的repo,复制到本地之后更改权限来使用。
↘1.2.2 源代码仓库
AOSP工程的源代码放置在Android的源代码仓库中,其网站为:
https://android.googlesource.com/
这个网址既可以作为使用git工具获取和提交源代码的地方,也可以通过浏览器使用https协议访问,由此获得源代码仓库的一些信息。
1.repo获取全部工程
直接使用repo获取Android完全的源代码方法包括初始化代码仓库和获取代码两个步骤,每个步骤可以增加不同的参数。
使用repo初始化Android的代码仓库的一般方法如下所示:
$ repo init -u https://android.googlesource.com/platform/manifest
由于没有使用额外的参数,此时得到的是代码仓库中master分支(主分支)的最新版本。在初始化过程中,也可以看到列出的各个分支(branch)和标签(tag)的名称,这些就是可以在初始化的过程中使用-b指定的参数。
在repo init时,使用-b选项下载稳定的Android2.3.3版本:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-2.3.3_rl
在repo init时,使用-b选项下载Android4.x的版本:
$ repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.4_r2
repo init之后,将生成隐藏目录.repo,其中文件.repo/manifest.xml为repo工程的描述文件,表示repo时包含的各个工程,其中的几个条目如下所示:
<project path="frameworks/base" name="platform/frameworks/base" /> <project path="hardware/libhardware" name="platform/hardware/libhardware" /> <project path="hardware/libhardware_legacy" name="platform/hardware/libhardware_legacy" />
repo/manifest.xml中的path表示工程获取后的路径(基于当前目录),name表示工程的原始名称。
在经过repo init之后,可以使用repo获取Android的全部代码,方法如下所示:
$ repo sync
使用repo sync时,也可以同步一个单个工程的内容,需要使用工程的名称作为repo sync的参数,工程的名称可以从manifest.xml获得。获得单个工程的方法如下所示:
$ repo sync {project_name}
获取工程后,每个工程的目录中含有一个.git目录,这就是工程版本管理目录,这些.git目录中的内容大部分是到.repo/projects/<project_path>的连接。
从BSP开发的角度,Android源代码工程中,几个重点的目录如下。
·frameworks/base:核心框架部分,包括C++和Java的框架。
·hardware/libhardware:硬件相关内容,包括硬件模块。
·hardware/libhardware_legacy:陈旧的硬件相关内容,有些内容依然在使用。
·hardware/<vendor>/:包括qcom和ti等厂商针对自己硬件的内容。
·device/*/<TARGET_PRODUCT>:各个目标板的配置目录。
2.其他工程
Android的开源代码包括了很多工程,使用repo并非得到所有的工程,而是使用一个特定的工程列表。可以直接使用git工具获取其他工程:
$ git clone https://android.googlesource.com/name
工程的名字可以从https://android.googlesource.com/获取。
例如,获得repo工具的方法如下所示:
$ git clone https://android.googlesource.com/tools/repo
命令执行完成后,将获得名称为repo的目录,其中包含.git目录用于存放工程的版本控制信息。可以进入并查看其中的内容:
$ cd repo $ git branch -r origin/HEAD -> origin/master origin/maint origin/master origin/stable
git branch -r列出了远端的分支名称,进一步使用git checkout可以取出某个稳定分支的代码。
一些与BSP开发相关的工程如下所示。
·kernel/*:各个不同系统的Linux内核的源代码。
·platform/prebuilts/gcc/*:各种交叉编译工具链(包括不同版本和体系结构)。
·toolchain/*:主机自身的一些工具。