背景:
前些天有学员朋友在群里问道发现公司的源码项目中,编译某一个目标时候,发现有Android.mk和Android.bp都有同时进行定义,这个为啥?系统到底以哪个为准,mk还是bp?
test@test:~/disk2/aosp14/android_thread$ tree
.
├── Android.bp
├── Android.mk
├── thread_posix.c
└── version.go0 directories, 4 files
比如我们写一个demo,机油Android.mk方式来编译,也有Android.bp方式。请问为啥会有这种情况的出现呢?
Android.mk和Android.bp出现背景
主要原因有如下几个:
1、一套代码可能要考虑多个aosp的版本,Android.bp属于老版本没有的,所以在系统不支持Android.bp的情况下需要用Android.mk
2、Android.bp的一些定义是在不断更新的,有一些目标可能老版本Android.bp没有,只能用Android.mk,但是新版本已经支持了。
所以基于要实行以上的需求背景情况,就可能需要有如下操作:
aosp版本 > 某个版本 :Android.bp定义生效,Android.mk不生效
aosp版本 < 某个版本 :Android.mk定义生效,Android.bp不生效
如果同时定义会如何?
如果Android.bp和Android.mk同时存在情况下,什么也修改,那么会怎么样呢?
In file included from out/soong/Android-sdk_phone_x86_64.mk:1911732:
In file included from android_thread/Android.mk:12:
In file included from build/make/core/executable.mk:53:
In file included from build/make/core/executable_internal.mk:29:
In file included from build/make/core/dynamic_binary.mk:34:
In file included from build/make/core/binary.mk:9:
build/make/core/base_rules.mk:342: error: android_thread: MODULE.TARGET.EXECUTABLES.linux_thread already defined by android_thread.
12:03:20 ckati failed with: exit status 1#### failed to build some targets (47 seconds) ####
明显报错already defined ,这个其实完全可以理解,因为Android.bp和Android.mk都同时哟定义目标linux_thread。
所以Android.mk和Android.bp要同时存在的话,必要考虑解决重复定义的问题,即一套代码只能允许一个生效,要么是Android.mk生效,要么Android.bp生效。
要实现上面需求,就需要使用Android.mk和Android.bp进行条件,然后对模块编译进行开启或者不开启。
(注意:这里大家会说是不是只需要Android.mk进行条件判断不开启就行了,那样Android.bp完全不需要,但是这里注意哈,因为系统已经支持了Android.bp,但是bp可能不支持某特性,这个时候也只能用mk情况)
Android.mk端模块是否开启
mk比较简单,使用ifeq 判断PLATFORM_SDK_VERSION既可以控制是否include $(BUILD_EXECUTABLE)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)LOCAL_SRC_FILES := thread_posix.c LOCAL_MODULE := linux_thread
LOCAL_SHARED_LIBRARIES :=liblog LOCAL_PRELINK_MODULE := false# 小于 Android 14 才在 Android.mk 中定义模块。include $(BUILD_XXX) 才会真正定义一个模块。
ifeq (1,$(filter 1,$(shell echo "$$(( $(PLATFORM_SDK_VERSION) < 34 ))" )))
include $(BUILD_EXECUTABLE)
endif
上面就实现了版本小于Android 14时候Android.mk才会开放编译模块linux_thread
Android.bp端模块是否开启
Android.bp要进行判断是否开启,这里其实就需要前面一篇干货文章知识:
Android.bp高级用法-添加条件判断编译方式
上面配置完成就可以实现不同aosp版本正常编译出目标了
aosp14上编译成功
aosp13上编译成功
总结:
Android.mk和Android.bp同时需要定义一个目标是可以的,需要自己根据条件在决定是否开启,反正最后参与编译的只能有一个,如果Andorid.mk和Android.bp什么条件也不加,两个同时定义的话,立即会报错重复定义。
更多Framework实战开发干货,请关注下面“千里马学框架”。