AOSP (一):获取源码

来源:互联网 发布:m1协同软件 编辑:程序博客网 时间:2024/05/16 10:54

  • 准备知识
  • 获取源码
    • 编译环境
    • 下载源码
  • 编译运行AOSP
    • 编译AOSP
    • 运行AOSP
  • Anroid内核源码

准备知识

AOSP即Android Open Source Project,也就是Android系统源码的相关内容。这块代码巨多,而且牵扯比较广,需要各种各样的相关知识。不过AOSP的内容模块相对清晰,仔细啃还是可以的。

AOSP的相关参考资料也是很多的,我现在一般是跟着老罗的Android系统源码情景分析的书和博客搞事情,他的讲解都有源码和例子,废话比较少,比较易懂。同时他的内容比较多的涉及framework方面的东西,底层比如bionic,ART和dalvik虚拟机的部分相对就讲的少一点,所以我又搞了刘超的《深入解析Android5.0系统》这本书,两边现在都在慢慢啃。Anyway,资料这玩意只是辅助,提供思路,最后还是自己啃代码靠谱。

除了源码部分的内容,Android系统是基于Linux系统建立的,一定程度上讲Android其实算是运行在Linux操作系统上的软件,所以Linux的相关内容也是需要了解的。这部分资料就更多了,随意就行。

获取源码

编译环境

Android源码目前只能在Linux上编译使用,所以要看源码请移步Linux系统。我用的是Ubuntu,算是主流了吧。然后获取和运行源码需要以下工具:

  • Git工具:其实也不一定,一些镜像支持直接下载
  • Java SDK: 不然拿头跑
  • 可能还需要一些工具包,可以用以下命令获取:
sudo apt-get install flex bison gperf libsdl-dev libesd0-dev libwxgtk2.6-dev build-essential zip curl valgrind

这些工具都是用来获取和编译源码的,具体作用如下:

工具 作用 flex and bison 用来解析各种各样格式的文件 gperf 用来生成高效的hash函数,并以C或C++代码形式给出 libsdl-dev SDL(Simple DirectMedia Layer)的开发库 libesd0-dev ESD(Enlightened Sound Daemon)开发库 libwxgt-dev wxWidgets(主要用来开发夸平台C应用的C++库)开发库 build-essential 各项build工具(gcc,g++等)的meta package zip 压缩工具不用多说了吧 curl 利用URL语法进行文件传输的工具 valgrind 用于内存调试,内存泄漏检测和性能分析的工具

这些工具不是必须的,有些可能也已经有了,可以按需。

下载源码

这部分不复杂,但是容易崩,因为aosp很大,sync一个20来G的玩意,如果从官方往下搞因为大家都知道的原因会很慢而且容易崩,甚至卡进度。所以推荐国内镜像,比如清华的镜像就很好,上边有详细的下载教程。

编译运行AOSP

编译AOSP

拿到源码之后,到根目录下,就可以开始编译。AOSP有一套自己的build系统,用来应对源码大量的编译整合工作,基本上原则就是分模块编译然后整合,并实现增量编译,并且可以根据设置编译不同版本和平台的Android系统源码。这部分就可以看好久了。。。尤其是我这种菜鸡。

最简单的编译命令是这样的:

. build/envsetup.shlunchmake

基本上就是envsetup.sh构建环境,定义一些shell命令,然后lunch选择想要编译的版本,最后make进行编译。第一次编译时间很长而且会有各种坑,比如我遇到了jdk版本问题,AOSP要求必须是OpenJDK。然后就是漫长的等待,推荐跪着编译,效果拔群。

运行AOSP

玩游戏,就是要赢编译代码,就是为了运行,所以编译好以后就可以常识运行。默认情况下,模拟器自身在out/host/linux-x86/bin里边,然后需要加载四个文件,分别是一个Linux内核镜像文件zImage,默认为out/host/linux-x86/bin/kernel-qemu;三个Android系统镜像文件system.img, userdata.img,以及ramdisk.img,这仨货是编译生成的,在`out/target/product/generic文件夹底下。运行的时候为了方便,可以把这些路径扔到系统变量里去。于是用以下命令执行:

export PATH = $PATH:/<path-to-aosp>/out/host/linux-x86/binexport ANDROID_PRODUCT_OUT = /<path-to-aosp>/out/target/product/genericemulator

这里,ANDROID_PRODUCT_OUT是默认的emulator找Andorid系统镜像的地址,需要手动设置一下。另外,AOSP默认的Linux内核是没有源码的,需要看这部分的话需要单独下载。

Anroid内核源码

这部分其实跟AOSP关系不大,但是可能需要针对不同机型的话就需要相对应修改这一部分。首先这部分要用git来把代码搞下来:

git clone https://android.googlesrouce.com/kernel/goldfish.git

其中,goldfish是模拟器用的内核版本,可以根据不同的版本需求用不同的库,其余类型还有common,exynos等。

拿到源码之后,checkout一个分支出来就可以吃了。具体checkout哪一个,需要看你的Android源码支持适配哪个版本,也就是之前运行用的那个image是哪个版本的。比如goldfish,可以到device/generic/goldfish文件夹下边用git log查看最新的commit,然后根据commit来checkout相应的branch和commit就可以了。

再来就是编译内核,新版本的内核不需要太多配置,可以使用make help查看有哪些合适的目标,然后使用make <target>设置配置文件,最后再使用make进行编译就可以了,最后会提示相应的文件所在的位置,把文件扔到上边运行虚拟机的配置里替换原来的内核就可以了。内核源码这部分还比较糊,后边要用的话再说。

0 0