第二期 AOSP 环境搭建、下载和编译 《手机就是开发板》

来源:互联网 发布:mac手机铃声 编辑:程序博客网 时间:2024/05/14 11:07
        Android最初是由Andy Rubin基于linux内核开发出来用于数码相机的操作系统,Android名字的原型是Andy Rubin小时候最喜欢的一个游戏人物,logo的原型是UI设计师在看到卫生间的简约图标时设计出来的。2005年8月android被Google发现而且收购并用于手机上,随着软件版本的迭代,Android已经有10亿级别的用户量,我们的电视,手机,手持电脑,手表,车载设备都有Android的身影,可以通过https://www.android.com/了解Android相关的第一手信息,当然,您要先学会怎么在大中华区局域网内可以访问到与Google相关的站点。
        如果想从代码级别了解Android就得从这里入口:http://source.android.com/ 
        这一期我们的主题是 Downloading and Building http://source.android.com/source/requirements.html
        AOSP是一个庞大的project,建议单独找块160G以上的硬盘搭建实验环境,内存16G起,编译jar包的时候真的多少内存都不够,CPU四核2.5G起,编译一次大于90分钟(一个晚自习的时间)的话不利于及时发现编译错误。操作系统选择Ubuntu14.04LTS_64bit,一切按google推荐的来,Android6.0需要的JDK为openjdk1.7,Ubuntu14.04原生支持,所以会比较方便。安装好系统后再安装必要的工具:
$ sudo apt-get update$ sudo apt-get install git-core gnupg flex bison gperf build-essential  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip
如果您的系统不是Ubuntu14.04LTS_64bit版本就要复制执行啦,建议每个软件后使用TAB键检查一下是否有这个软件,比如google给出的lib32z-dev在实际中要改为lib32z1-dev。
安装java编译环境jdk
sudo apt-get install openjdk-7-jdkvi ~/.profile
文件尾部加入:
export JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/libexport PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
AOSP的build系统会自动生成JAVA_HOME变量,但为了严禁一点我们还是设置完成的JAVA编译环境变量。
===========================分割线===========================
        编译环境基本搭建完成,现在开始下载AOSP代码,要有个心理准备,都是10G级别的,不建议使用别人下载好打包的代码,少了几分乐趣。
        AOSP的下载在大中华区就不建议通过google下载啦,我们使用国内的mirrors,AOSP国内经典靠谱非盈利的镜像主要有两个:
清华大学的 tuna    https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/ 
中国科学技术大学的 LUG@USTC    https://lug.ustc.edu.cn/wiki/mirrors/help/aosp     
        AOSP的代码管理是基于git的管理方式,但是是由几百个git仓库构成的,这几百个git仓库统一管理就必要要有一个统一的工具,google的工程师用python写了个脚本叫repo,使用它来进行管理android的中每个git仓库对应的版本。
我们先将repo脚本下载到本地,官方给出的方法是:
$ mkdir ~/bin$ PATH=~/bin:$PATH$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo$ chmod a+x ~/bin/repo
如果没有翻墙,就将上面的地址替换成ustc的地址
https://storage-googleapis.proxy.ustclug.org/git-repo-downloads/repo
repo文件的 REPO_URL 的值可以修改成国内的地址
repo的原理可以通过下面这个链接学习一下,前辈讲得太详细了:http://blog.csdn.net/luoshengyang/article/details/18195205
大体上repo由三种repository组成:
        repo repository : 每次执行repo命令时repo都会对自己进行一次更新;
        manifest repository:记录AOSP都包含的子项目的名称、仓库地址,manifest repository 实际上是一系列XML文件组成;
        AOSP project repository:这一层是组成AOSP的各个子项目的repository。
我们来初始化repo仓库,google给出的方式是:
$ repo init -u https://android.googlesource.com/platform/manifest
如果想通过国内镜像站可以使用:
$ repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest或者$ repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
        这个命令实际上是包含了两个操作:将这个命令拆分开,init执行的是repo文件中REPO_URL提供的地址进行repo repository的初始化; -u 和后面的地址则提供 Manifest repository的初始化,以后我们如果下载CM的代码的时候就要重新初始化Manifest repository 。
        上面的命令成功执行完成后使用ll命名就可以看到当前目录下生成.repo文件夹,在.repo目录下,repo文件夹为repo repository目录,manifests目录为manifest repository目录,其中default.xml中记录了当前manifest repository包含的所有子项目信息,可以查看一下里面的内容,每个project对应的一个AOSP子项目,很多人在github放出的androiid ROM源码其实都是发布一个经过修改的manifest库,大部分项目引用AOSP原地址,修改的部分引用自己的地址。同样,如果分析一个android修改版本也是从分析default.xml文件开始的,通过这个文件与AOSP的这个文件比对就可以确定其修改了哪些子项目,然后再去将每个项目的代码下载来分析就OK了。
        在下载AOSP代码前我来确定以下版本,因为如果默认情况下使用master分支,是最新的开发版本,而我们要下载的是android-6.0.1,使用如下命令:
        git --git-dir .repo/manifests/.git/ branch -a
可以查看所有的版本,我们使用 android-6.0.1_r66 版本来作实验,于是执行:
        repo init -b android-6.0.1_r66
来将manifest repository 切换到 android-6.0.1_r66 分支。
        接下来开始下载AOSP代码,执行:
    repo sync -j4  
        -j4 代表4线程同时下载,虽然是个漫长的过程,但还是需要不断关注,如果长时间卡住就ctrl+c,再repo sync重新开始,repo支持断点传输,可以随时停止和继续。
===========================分割线===========================
        环境搭建和下载工作都已就绪,下面进入到编译环节。如果之前工作准备的充分,只需执行:
source ./build/envsetup.shlunchmake -j8
就可以开始编译了,编译成功后会显示绿色的 make completed successfully 信息 。如果编译出错可以根据错误提示然后利用搜索网站排错,当然如果配置低,并发线程大的情况下经常出现莫名错误,多重新执行make,降低-j的数值就能通过。
编译通过后别急着关闭terminal窗口,在执行编译的环境下执行
emulator

就会使用AOSP自带的虚拟机模拟运行刚才编译的android系统。


===========================分割线===========================
        这里补充一下,为了增加编译速度Google官方推荐我们启用ccache,ccache 工具通过将头文件高速缓存到缓存源文件之中而改进了build的性能,因而通过减少每一步编译时添加头文件所需要的时间而提高了build速度。
可以通过设置以下命令来启用ccache。可以将该环境变量写入.bashrc或类似文件,避免每次都设置。
$ export USE_CCACHE=1  (如果想永久开启可以将它写入到~./profile文件中)
默认cache存储在~/.ccache. 可以使用下列命令来设置路径
$ export CCACHE_DIR=<path-to-your-cache-directory>
Google推荐的cache大小为50-100GB. 可以使用下列命令来设置cache size
$ prebuilt/misc/linux-x86/ccache/ccache -M 50G  (工程目录下运行,该设置只需设置一次)
可以使用以下命令来查看ccache的运行状况:
$ watch -n1 -d prebuilt/linux-x86/ccache/ccache -s   (工程目录下运行)
        使用ccache对AOSP第一编译并不会有效果,而make clean后第二期编译时就会节省很多时间,我做了一个实验:没有启用ccache时编译时间是95分钟,而启用ccache后第二次的编译时间为45分钟,节省了一半的时间,还是很有价值的,下面是我的截图,建议使用ccache -s 命令随时查看ccache是否真正被启用,编译一次AOSP产生的ccache缓存大约为7.5G。


        目前android支持x86,arm,mips三个架构,qemu模拟器也同样支持这三种架构,因为我们的开发环境是x86架构,所以模拟x86处理器会速度更快一些,在lunch 选择的时候 选 aosp_x86-eng 然后make 就会编译出x86架构的android系统,用emulator运行一下会发现比arm架构流畅很多。

0 0