理解android build 系统,Android点滴——Build系统

本文详细介绍了Android编译系统的结构和工作流程,包括make文件的分类、编译过程以及如何解决编译中遇到的问题,如JDK版本不匹配等。通过lunch命令选择编译目标,使用make或mmm命令编译特定模块。在编译Android源码时,需要关注/out目录下的编译产物,如system.img、ramdisk.img和userdata.img等。
摘要由CSDN通过智能技术生成

既然是乱搞安卓的编译,那就了解下其build系统是怎样的吧。

android build系统用来编译android系统、sdk及相关文档。

安卓源码中包含了大量的开源项目及模块,不同使用者对它的定制不同。为了统一管理,才有了build系统:使得在编译时你能够支持面向不同硬件设备、不同编译类型、各种定制拓展。​

先来放一张调用图:

a4c26d1e5885305701be709a3d33442f.png

main.mk:主要的make文件,首先对编译环境进行检查,同时引入其他make文件;

pathmap.mk:将头文件的路径通过名值的方式定义为映射表,提供include-path-for函数获取。eg:

$(call include-path-for, frameworks-native)可

获取到framework本地代码需要的头文件路径;

envsetup.mk:

配置build系统需要的环境变量,当前编译的主机平台信息在该文件中确定,该文件还指定各种编译结果的​输出路径;

combo/select.mk: 根据当前编译器平台选择相关的make文件;

config.mk:

最重要的make文件之一,包含:定义的许多常量负责不同类型模块的编译,定义编译器参数及常见文件后缀如zip,jar,apk等,根据boardconfig.mk文件配置产品相关参数,设置常用工具的路径;

definitions.mk: 定义了大量的函数,都是build系统的其它文件用到[这些函数都有代码注释];

distdir.mk: 针对dist目标的定义,用来拷贝文件到指定路径;

$(subdir_makefiles): 各个模块的android.mk文件的集合,通过python脚本扫描得到;

=======================================​​

瞬间感觉很复杂。。。但不要急,总会慢慢搞清楚的。

在整个build系统中make文件有3类:

build系统核心文件:定义了整个build系统,框架,其他make文件都是在此基础上写出来;

针对某个产品make文件:device目录下,不同的厂家又有不同的名字。对一个产品的定义需要一组文件。

针对某个模块make文件:系统中包含了大量的模块,每个模块都有专门的make文件,统一命名为“Android.mk”,文件中定义了如何编译当前模块。​​​

编译的时候:

source build/envsetup.sh //初始化编译环境

lunch full-eng //full是源码中已经定义好的一种产品,为模拟器设置。

make -j8

系统编译比较耗时。

编译完后的结果目录:编译产物位于/out目录:

/out/host/:针对主机的android开发工具的产物:各种sdk工具,emulator,

adb, aapt等;

/out/target/common:

针对设备的共通编译产物:java 应用代码和java库;

/out/target/product/:针对特定设备的编译结果及平台相关的c/c++库和二进制文件;

/out/dist:为多种分发准备的包。通过make

dist target将文件拷贝到该目录。​​

build生成的镜像文件:位于/out/target/product/目录下,分别是:

system.img:​​包含了os的系统文件,库,可执行文件及预置的应用程序,将被挂载为根分区;

ramdisk.img:启动时被linux内核挂载为只读分区,包含了/init/文件和一些配置文件,用来挂载其他系统镜像并启动init进程;

userdata.img:被挂在为/data,包含应用程序相关的数据以及用户相关的数据。

===================================

编译命令:

m: 在源码树的根目录执行编译;

mm:编译当前路径下所有模块,但不包含依赖;

mmm [module_path]:

编译指定路径下所有模块,但不包含依赖;

mma:

编译当前路径下所有模块,且包含依赖;

mmma [module_path]:

编译指定路径下所有模块,且包含依赖;

make [module_name]:

无参数,表示编译整个安卓代码。

下面是部分模块编译指令:

a4c26d1e5885305701be709a3d33442f.png

================================================================

build是需要一些环境支持的,编译5.*-6.*需要jdk版本是1.7.*...

自己机子上是1.8,而update-alternative

更改时,显示的却是openjdk1.7

现在为了方便,在bash下临时改变下java环境。

发现build系统是取的java_home路径。。。所以在bash下export

java_home为需要的1.7,然后java

version时发现已经改变。--注意此时的更改仅对当前shell有效。

其实在设置过程中遇到一些问题:系统原来的jdk版本是1.7,自己重新安装的是1.8,想要变回原来的1.7,在bash下export改变路径,java

-version是变了,但javac 时第一次提示变回1.7了,但进入编译时却提示javac版本不对,于是再次javac

-version确认时却提示command not found...

找原因没找到为啥,java_home已经重新设定,path也重新设定,为何识别不了呢?

这就是编译系统的makefile识别了,进入安卓的makefile查看其java的选取,也确实是读取java_home啊...

这时一种解决办法是更改android的makefile,这里为了偷懒,选择重新安装下openjedk了。。。

安装时,先要update,然后再apt-get

install openjdk-7-jdk

[有的时候还需要使用dpkg -l

openjdk-7-jdk查看安装路径,并切换java版本。]​

安装好了,可以继续编译。

[关于jdk版本不对的问题,在编译的时候还会提示:"Types.java:317:

error: TypeVariableImpl is not

abstract and does not

override abstract

method

getAnnotatedBounds() in

TypeVariable private static

final class

TypeVariableImpl<

se-mark="1">D extends

GenericDeclaration>

......host C: libcrypto-host

<= external/boringssl/src/crypto/mem.c

make: ***

[out/host/common/obj/JAVA_LIBRARIES/guavalib_intermediates/javalib.jar]

Error 41",这时要再次检查jdk版本...。我这里通过export

path临时改变了jdk版本,但一执行source后就又掉到原来的错的jdk版本。。。这时解决办法:改大环境,修改profile文件;在make前修改path试试。]​​

接下来按照自己的编译需求进行编译。​​​

假如更改了framework层,需要重新编译,那么如何做?

在编译之前同样的需要在根目录下source build/core/envsetup.sh,

然后需要lunch,直接tab可以看到备选项;[还有的需要choosecombo

Device release myproduct eng的设置];​然后可以在源码根目录下使用mmm -j4

framework/base,或者进入framework/base目录,执行mm -j4

编译好的话会有framework.jar包。​然后替换到机子上system/framework/目录下的framework.jar包,重启后就可以了。

--我在编译时遇到的问题:提示build/tools/diff_package_overlays.py:

permission denied no private recovery resources for

target_device。。。

----解决:没权限,那就chmod

+x(赋予可执行)[​最好在root下编译吧。。。]

这样了以后前面那条permission

denied没了,后面的no private recovery resouces还存在。其实是:make: *** no rule

to make target '/out/host/linux-x86/bin/aidl', needed by

...

什么原因呢?

mm/mmm命令只是编译当前目录/指定目录下的,它并不处理一些依赖关系。​

--解决:于是在源码目录下make

framework。

然后又有问题---编译总是会遇到很多问题,做好心理准备。[很多库需要装,碰到报啥错就安装对应的库]

先是:

make

out/host/linux-x86/obj/executables/adb_intermediates/aidl_lanaguage_y.cpp

error 126​​

根据[5]中的很多问题集锦,这是要安装bison。

但是安装了后还是提示同样的,chmod, chown之后还是不行。。。

stack。。。​

​​

[注]参考:

1.

https://www.ibm.com/developerworks/cn/opensource/os-cn-android-build/​

​2.

http://www.cnblogs.com/fly-fish/archive/2012/05/07/2489274.html

3.

http://zyjznd123456.blog.163.com/blog/static/132635288201339104027908/​

4.

http://wiki.jikexueyuan.com/project/android-actual-combat-skills/switch-jdk-version-under-ubuntu.html​

5.

http://blog.csdn.net/ithomer/article/details/6977386​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值