您的位置:首页 > 房产 > 建筑 > 手机版万能视频提取器_游戏代理去什么平台找_免费关键词排名优化_百度一下官网

手机版万能视频提取器_游戏代理去什么平台找_免费关键词排名优化_百度一下官网

2025/4/19 8:30:20 来源:https://blog.csdn.net/learnframework/article/details/147217876  浏览:    关键词:手机版万能视频提取器_游戏代理去什么平台找_免费关键词排名优化_百度一下官网
手机版万能视频提取器_游戏代理去什么平台找_免费关键词排名优化_百度一下官网

背景:

前些天有学员朋友在群里问道发现公司的源码项目中,编译某一个目标时候,发现有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实战开发干货,请关注下面“千里马学框架”。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com