既然是乱搞安卓的编译,那就了解下其build系统是怎样的吧。
android build系统用来编译android系统、sdk及相关文档。
安卓源码中包含了大量的开源项目及模块,不同使用者对它的定制不同。为了统一管理,才有了build系统:使得在编译时你能够支持面向不同硬件设备、不同编译类型、各种定制拓展。
先来放一张调用图:
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]:
无参数,表示编译整个安卓代码。
下面是部分模块编译指令:
================================================================
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