芯片厂商提供的android系统的SDK中分为三部分:android系统源码,kernel源码,boot源码,interface源码.
project:
|
——android
——kernel
——boot
——interface
如果要形成完整的镜像,要分别编译个部分,之后将其生成文件复制到android的out目录,非常繁琐。经过对比研究,决定自己添加脚本,方便整体编译。
project:
|
——android
|
——vendor
|
——brand
|
——kernel
——boot
——interface
但是当把interface代码整合到android源码的vendor目录下,发生以下情况:
单独编译kernel源码 ok;
单独编译boot源码 ok;
单独编译interface源码 ok;
单独编译android源码 er;
经过排查发现,android系统在编译时回去遍历包含所有子目录下的Android.mk文件,正好interface源码中包含Android.mk文件,正好interface中的部分库和android源码中的定义是冲突的。
删除interface源码,整体编译 ok;
分析冲突发生的原因:
interface源码的编译,完全依赖于Makefile,Android.mk目前根本用不到。之所以这样是因为芯片厂商是在另一款芯片的SDK的基础上上修改而来,但是没有清理多余文件。
处于以下目的:
方便其他工程师使用,必须可以整体编译;
芯片厂商的结构虽然很乱,但是不能作太多修改,防止后续他们弥补过失,自己太被动;
于是考虑在编译Android时不去包含interface目录下的Android.mk
回想Android系统的正常编译应该回去遍历加载所有目录下的Android.mk,找到对应的地方,作减法。
ifneq ($(dont_bother),true)
#
# Include all of the makefiles in the system
#
# Can't use first-makefiles-under here because
# --mindepth=2 makes the prunes not work.
subdir_makefiles := \
$(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git $(subdirs) Android.mk)
$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))
原来系统中是有现成的排除语法可用,于是:
subdir_makefiles := \
$(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git --prune=interface $(subdirs) Android.mk)
$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk)))
这样系统在编译时便不会去加载interface目录下的Android.mk