Android 编译的配置文件:android.mk 和android.bp

Android.bp文件首先是Android系统的一种编译配置文件,是用来代替原来的Android.mk文件的。在Android7.0以前,Android都是使用make来组织各模块的编译,对应的编译配置文件就是Android.mk。在Android7.0开始,Google引入了ninja和kati来编译,为什么引入ninja?因为随着Android越来越庞大,module越来越多,编译时间也越来越久,而使用ninja在编译的并发处理上较make有很大的提升。Ninja的配置文件就是Android.bp,Android系统使用Blueprint和Soong工具来解析Android.bp转换生成ninja文件。为了兼容老的mk配置文件,Android当初也开发了Kati 工具来转换mk文件生成ninja,目前Android Q里边,还是支持Android.mk方式的。相信在将来的版本中,会彻底让mk文件废弃,同时Kati也就淘汰了,只保留bp配置方式,所以我们要提前学习bp。Blueprint和Soong工具的源码在Android/build/目录下,我们可以通过查阅相关代码来学习。

Make 和 Soong 比较

Make 示例

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linuxLOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/srcLOCAL_SRC_FILES := $(call \all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

 Soong 示例

cc_library_shared {name: “libxmlrpc++”,rtti: true,cppflags: [“-Wall”,“-Werror”,“-fexceptions”,],export_include_dirs: [“src”],srcs: [“src/**/*.cpp”],target: {darwin: {enabled: false,},},
}

android.mk

android.mk 一般位于工程目录中以“LOCAL_PATH := $(call my-dir)”开始,每个mk 可以编译多个应用以inclue $(CLEAR_VARS) 开始,include $(BUILD_XXX)结束,BUILD_XXX 为此应用的类型.

下面介绍一下android.mk的主要参数:
  • LOCAL_MODULE_TAGS (android 10 取消这个参数)

        此参数会影响到库生成后的存放位置.

LOCAL_MODULE_TAGS :=user eng tests optionaluser: 指该模块只在user版本下才编译eng: 指该模块只在eng版本下才编译tests: 指该模块只在tests版本下才编译optional:指该模块在所有版本下都编译
  • LOCAL_PRELINK_MODULE

        Prelink利用事先链接代替运行时链接的方法来加速共享库的加载,它不仅可以加快起动速度,还可以减少部分内存开销,是各种Linux架构上用于减少程序加载时间、缩短系统启动时间和加快应用程序启动的很受欢迎的一个工具。程序运行时的动态链接尤其是重定位(relocation)的开销对于大型系统来说是很大的。

变量设置为false那么将不做prelink操作
LOCAL_PRELINK_MODULE := false
  • LOCAL_MODULE_RELATIVE_PATH 

    指定动态库的相对路径,以各自编译对象放置的目录为参考。

  • LOCAL_MODULE_PATH:

    目标的安装路径LOCAL_PATH := $(call my-dir)

  • TARGET_ROOT_OUT:表示根文件系统。

  • TARGET_OUT:表示system文件系统。

  • TARGET_OUT_DATA:表示data文件系统。

  • LOCAL_CFLAGS  : C语言编译时额外选项,

#-Wno-unused- 加上对应的变量或参数类型,即可忽略当前警告,编译通过。
LOCAL_CFLAGS += -Wno-unused-const-variable \   -Wno-unused-variable \-Wno-unused-parameter
  • LOCAL_CXXFLAGS : C++语言编译时额外选项
  • LOCAL_SRC_FILES :指定源文件位置
  • LOCAL_CC :指定C 编译器
  • LOCAL_CXX : 指定 C++ 编译器
  • LOCA_C_INCLUDES :编译c c++ 所需额外头文件
  • LOCAL_STATIC_LIBRARIES 编译时所需静态库列表
  • LOCAL_SHARTED_LIBRARIES 编译时所需共享库列表
  • LOCAL_JAVA_LIBRARIES 编译时所需JAVA类库
  • BUILD_HOST_XXX ,BUILD_STATIC_XXX ,BUILD_XXX : 各种形式的编译模版,如生成设备端,HOST端,动态库,可执行文件,文档等。

android.mk 的常用模版

  • NDK C++
 1.必须以LOCAL_PATH开头,用于在开发树种查找源文件
# 2.my-dir为宏,由编译系统提供,返回包含Android.mk文件的目录路径
LOCAL_PATH := $(call my-dir) # 1.CLEAR_VARS由build system提供,指向一个指定的GNU Makefile
# 2.负责清理LOCAL_xxx变量,但不清理LOCAL_PATH
# 3.由于所有编译文件都是同一个GNU Makefile解析和执行,变量是全局的,所以清理后才能避免相互影响
include $(CLEAR_VARS)# 1.包含要编译的源文件
LOCAL_SRC_FILES := src/1.cpp src/2.cpp src/3.cpp \src/4.cpp src/5.cpp src/6.cpp
# 打印信息方法
$(info $(LOCAL_SRC_FILES))
$(warning $(LOCAL_SRC_FILES))
$(error $(LOCAL_SRC_FILES))
# 1.追加要搜索的头文件目录
LOCAL_C_INCLUDES += itf/
# 1.android系统编译环境配置成debug时加入test工程
# 2.envsetup.sh中choosecombo第一个参数配置2即是debug模式
ifeq ($(TARGET_BUILD_TYPE), debug)# 获取test目录下所有cpp文件define all-cpp-files-under  # 1.$(patsubst <pattern>,<replacement>,<text>):查找<text>中单词是否符合<pattern>,如果匹配,则以<replacement>替换。# 2.%通配符,表示任意长度字符串$(patsubst ./%,%, $(shell cd $(LOCAL_PATH)/test;find $(1) -name "*.cpp" -or -name "*.cc" -and -not -name ".*"))  endef  define all-test-cpp-files  $(call all-cpp-files-under,.)  endef  LOCAL_SRC_FILES += $(call all-test-cpp-files) LOCAL_C_INCLUDES += test/include
endif
# 1.依赖的动态链接库 
# 2.LOCAL_SHARED_LIBRARIES一般是先找编译好的,找不到就编译得到
# 3. LOCAL_LDLIBS 一般用于链接系统编译的库
# 4. LOCAL_LDFLAGS 一般用于链接第三方库,库要包含扩展名
LOCAL_SHARED_LIBRARIES := liblog
LOCAL_LDLIBS := $(LOCAL_PATH)/src/liblog
LOCAL_LDFLAGS := $(LOCAL_PATH)/src/libthird.so
# 1.指定可识别cpp文件的扩展名,只能选择一种,不支持混合
LOCAL_CPP_EXTENSION:=.cc .cpp .cxx
# 1.定义要生成的模块名字,这里命名为myModule
# 2.build system会自动添加适当的前缀和后缀,例如生成动态库则为libmyModule.so
LOCAL_MODULE := myModule# 1.指定install路径
# 2.optional: out/target/product/OK6410/symbols/system/
# 3.eng:  out/target/product/Ok6410/system/
LOCAL_MODULE_TAGS := optional# 1.keep_symbols:保留动态库中的符号信息
# 2.false:去掉动态库中的符号表等调试信息
LOCAL_STRIP_MODULE := keep_symbolsLOCAL_INIT_RC := myModule.rc# 1.可选设置,在编译C/C++源码时附加编译选项
# 2.比如编译时附加搜索头文件目录的选项,如下所示。这种方法比LOCAL_C_INCLUDES要好,可以被ndk-debug使用
# Wall:所有的警告信息,Werror:所有的错误信息, Wunused:所有的未使用变量信息,Wunreachable-code:所有的未找到定义的信息
LOCAL_CFLAGS += -I<path>
LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code
# 1.分别编译成动态库、静态库、可执行native程序方法
# 2.实际使用中选择一个即可
# 3.主要作用是收集自从上次调用include $(CLEAR_VARS)后的所有LOCAL_xxx信息
include $(BUILD_SHARED_LIBRARY)
include $(BUILD_STATIC_LIBRARY)
include $(BUILD_EXECUTABLE)
  • 多模块(frameworks/base/libs/audioflinger/Android.mk)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)  模块一
ifeq ($(AUDIO_POLICY_TEST),true)ENABLE_AUDIO_DUMP := true
endif
LOCAL_SRC_FILES:= \AudioHardwareGeneric.cpp \AudioHardwareStub.cpp \AudioHardwareInterface.cpp
ifeq ($(ENABLE_AUDIO_DUMP),true)LOCAL_SRC_FILES += AudioDumpInterface.cppLOCAL_CFLAGS += -DENABLE_AUDIO_DUMP
endif
LOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libmedia \libhardware_legacy
ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)LOCAL_CFLAGS += -DGENERIC_AUDIO
endif
LOCAL_MODULE:= libaudiointerface
ifeq ($(BOARD_HAVE_BLUETOOTH),true)LOCAL_SRC_FILES += A2dpAudioInterface.cppLOCAL_SHARED_LIBRARIES += liba2dpLOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DPLOCAL_C_INCLUDES += $(call include-path-for, bluez)
endif
include $(BUILD_STATIC_LIBRARY)  模块一编译成静态库
include $(CLEAR_VARS)  模块二
LOCAL_SRC_FILES:=               \AudioPolicyManagerBase.cpp
LOCAL_SHARED_LIBRARIES := \libcutils \libutils \libmedia
ifeq ($(TARGET_SIMULATOR),true)LOCAL_LDLIBS += -ldl
elseLOCAL_SHARED_LIBRARIES += libdl
endif
LOCAL_MODULE:= libaudiopolicybase
ifeq ($(BOARD_HAVE_BLUETOOTH),true)LOCAL_CFLAGS += -DWITH_A2DP
endif
ifeq ($(AUDIO_POLICY_TEST),true)LOCAL_CFLAGS += -DAUDIO_POLICY_TEST
endif
include $(BUILD_STATIC_LIBRARY) 模块二编译成静态库
include $(CLEAR_VARS) 模块三
LOCAL_SRC_FILES:=               \AudioFlinger.cpp            \AudioMixer.cpp.arm          \AudioResampler.cpp.arm      \AudioResamplerSinc.cpp.arm  \AudioResamplerCubic.cpp.arm \AudioPolicyService.cpp
LOCAL_SHARED_LIBRARIES := \libcutils \libutils \libbinder \libmedia \libhardware_legacy
ifeq ($(strip $(BOARD_USES_GENERIC_AUDIO)),true)LOCAL_STATIC_LIBRARIES += libaudiointerface libaudiopolicybaseLOCAL_CFLAGS += -DGENERIC_AUDIO
elseLOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy
endif
ifeq ($(TARGET_SIMULATOR),true)LOCAL_LDLIBS += -ldl
elseLOCAL_SHARED_LIBRARIES += libdl
endif
LOCAL_MODULE:= libaudioflinger
ifeq ($(BOARD_HAVE_BLUETOOTH),true)LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DPLOCAL_SHARED_LIBRARIES += liba2dp
endif
ifeq ($(AUDIO_POLICY_TEST),true)LOCAL_CFLAGS += -DAUDIO_POLICY_TEST
endif
ifeq ($(TARGET_SIMULATOR),true)ifeq ($(HOST_OS),linux)LOCAL_LDLIBS += -lrt -lpthreadendif
endif
ifeq ($(BOARD_USE_LVMX),true)LOCAL_CFLAGS += -DLVMXLOCAL_C_INCLUDES += vendor/nxpLOCAL_STATIC_LIBRARIES += liblifevibesLOCAL_SHARED_LIBRARIES += liblvmxservice
#    LOCAL_SHARED_LIBRARIES += liblvmxipc
endif
include $(BUILD_SHARED_LIBRARY) 模块三编译成动态库
  • 编译一个应用程序(APK)
 LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# Build all java files in the java subdirectory-->直译(建立在java子目录中的所有Java文件)LOCAL_SRC_FILES := $(call all-subdir-java-files)# Name of the APK to build-->直译(创建APK的名称)LOCAL_PACKAGE_NAME := LocalPackage# Tell it to build an APK-->直译(告诉它来建立一个APK)include $(BUILD_PACKAGE)
  • 编译一个依赖于静态Java库(static.jar)的应用程序
  LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)# List of static libraries to include in the packageLOCAL_STATIC_JAVA_LIBRARIES := static-library# Build all java files in the java subdirectoryLOCAL_SRC_FILES := $(call all-subdir-java-files)# Name of the APK to buildLOCAL_PACKAGE_NAME := LocalPackage# Tell it to build an APKinclude $(BUILD_PACKAGE)

android.bp

bp 文件相对mk来说文件结构更加清晰,写法更加简单。

参考:

Soong 构建系统  |  Android 开源项目  |  Android Open Source Project

Build Docs (storage.googleapis.com)

文件一般以模块类型开头:

cc_binary {name: "gzip",srcs: ["src/test/minigzip.c"],shared_libs: ["libz"],stl: "none",
}

模块类型有:apex_defaults aidl_interface ,cc_binary ,cc_defaults,cc_library_static 等

在模块内部都必须定义 name 属性,并且这个属性必须全局唯一,仅有两个例外情况是命名空间和预构建模块中的 Android.bp 属性值,这两个值可能会重复。

srcs 属性以字符串列表的形式指定用于构建模块的源文件。您可以使用模块引用语法 ":<module-name>" 来引用生成源文件的其他模块的输出,如 genrulefilegroup

类型

变量和属性是强类型,变量根据第一项赋值动态变化,属性由模块类型静态设置。支持的类型为:

  • 布尔值(truefalse
  • 整数 (int)
  • 字符串 ("string")
  • 字符串列表 (["string1", "string2"])
  • 映射 ({key1: "value1", key2: ["value2"]})

条件语句

Soong 不支持 Android.bp 文件中的条件语句。但是,编译规则中需要条件语句的复杂问题将在 Go中处理。大多数条件语句都会转换为映射属性,其中选择了映射中的某个值并将其附加到顶级属性。

例如,要支持特定于架构的文件,请使用以下命令:

cc_library {...srcs: ["generic.cpp"],arch: {arm: {srcs: ["arm.cpp"],},x86: {srcs: ["x86.cpp"],},},
}

默认模块

默认模块可用于在多个模块中重复使用相同的属性。例如:

cc_defaults {name: "gzip_defaults",shared_libs: ["libz"],stl: "none",
}cc_binary {name: "gzip",defaults: ["gzip_defaults"],srcs: ["src/test/minigzip.c"],
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/179055.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是大数据测试?有哪些类型?应该怎么测?

随着目前世界上各个国家使用大数据应用程序或应用大数据技术场景的数量呈指数增长&#xff0c;相应的&#xff0c;对于测试大数据应用时所需的知识与大数据测试工程师的需求也在同步增加。 针对大数据测试的相关技术已慢慢成为当下软件测试人员需要了解和掌握的一门通用技术。…

SPSS生存分析:寿命表分析

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

15 网关实战: 微服务集成Swagger实现在线文档

上节介绍了网关层面聚合API文档,通过网关的路由信息找到了各个服务的请求地址,这节讲一下微服务如何集成Swagger。 网关的API文档默认调用的是微服务的**/v2/api-docs**这个接口获取API详细信息,比如文章服务的URL:http://localhost:9000/blog-article/v2/api-docs,返回信…

Python分享之字符串格式化 (%操作符)

在许多编程语言中都包含有格式化字符串的功能&#xff0c;比如C和Fortran语言中的格式化输入输出。Python中内置有对字符串进行格式化的操作%。 模板 格式化字符串时&#xff0c;Python使用一个字符串作为模板。模板中有格式符&#xff0c;这些格式符为真实值预留位置&#xff…

Python二叉树用法介绍

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 二叉树是一种常见的数据结构&#xff0c;具有树形结构&#xff0c;每个节点最多有两个子节点。Python中有多种方式来表示和操作二叉树&#xff0c;本文将介绍二叉树的基本概念、构建、遍历和一些常见操作&#x…

3个.NET开源免费的仓库管理系统(WMS)

前言 今天给大家推荐3个.NET开源免费的WMS仓库管理系统&#xff08;注意&#xff1a;以下排名不分先后&#xff09;。 仓储管理系统介绍 仓储管理系统&#xff08;Warehouse Management System&#xff0c;WMS&#xff09;是一种用于管理和控制仓库操作的软件系统&#xff0…

F5社区学习心得分享:如何克服云迁移挑战?

伴随数字时代的快速发展&#xff0c;很多企业都会借助云迁移&#xff0c;踏上转型之旅。尽管云迁移被认为是一种能够节约成本&#xff0c;且不会影响正常运营的现代化改造举措&#xff0c;然而我们并不能低估它的复杂性。正如有研究表明&#xff0c;约有41%的企业并没有通过云迁…

lv11 嵌入式开发 WDT实验 12

目录 1 WDT简介 2 Exynos4412下的WDT控制器 2.1 概述 2.2 WDT的特性 2.3 工作原理 2.4 其他细节 3 WDT寄存器详解 3.1 WTCON控制寄存器 3.2 WTDAT 实时中断寄存器 3.3 WTCNT 递减计数器 3.4 WTCLRINT清除中断寄存器 4 WDT编程 1 WDT简介 Watch Dog Timer即看门狗定…

ZKP15.2 Formal Methods in ZK (Part I)

ZKP学习笔记 ZK-Learning MOOC课程笔记 Lecture 15: Secure ZK Circuits via Formal Methods (Guest Lecturer: Yu Feng (UCSB & Veridise)) 15.2 Formal Methods in ZK (Part I) Circuits Workflow Source Code: Witness Generation and ConstraintsWitness Generatio…

【力扣】 209. 长度最小的子数组

【力扣】 209. 长度最小的子数组 文章目录 【力扣】 209. 长度最小的子数组1. 题目介绍2. 解法2.1 暴力求解2.2 前缀和 二分查找2.3 滑动窗口2.4 贪心回溯 3. Danger参考 1. 题目介绍 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 …

ubuntu安装远程桌面

ubuntu安装远程桌面 xrdp远程桌面访问 #用windows远程桌面连接成功,只能用root用户,用普通用户连接是灰色 sudo apt install xrdp systemctl status xrdpsystemctl stop xrdp解决普通用户连接是灰色 参考链接: https://blog.csdn.net/leegh1992/article/details/51160864 s…

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具&#xff0c;而在Python中则使用PyQt这一工具包&#xff0c;它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包&#xff0c;主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Desig…

C或C++报错:ld returned 1 exit status报错的原因

C或C报错&#xff1a;ld returned 1 exit status&#xff08;ld返回1&#xff0c;退出状态&#xff09; 可能是以下原因: 1&#xff09;程序正在运行&#xff0c;无法编译&#xff0c;上次运行的窗口未关闭。 程序窗口重复运行没有及时关闭&#xff0c;存在多个打开窗…

Python中的sys模块详解

1. 简介 sys模块是Python标准库中的一个内置模块&#xff0c;提供了与Python解释器和运行环境相关的功能。它包含了一些与系统操作和交互相关的函数和变量&#xff0c;可以用于获取命令行参数、控制程序的执行、管理模块和包、处理异常等。 2. 常用函数和变量 2.1 命令行参数…

二叉树之推排序(升序)

目录 1.思路1.1大堆的建立方法1.2排序的方法 2.代码实现以及测试代码 1.思路 如何将一个堆进行排序&#xff0c;并变成升序&#xff1f;首先&#xff0c;如果要完成升序&#xff0c;那我们可以建立一个大堆&#xff0c;因为大堆可以选出一个最大的值放在堆的最上面&#xff0c…

数组中的第 K 个最大元素(C++实现)

数组中的第 K 个最大元素 题目思路代码 题目 数组中的第 K 个最大元素 思路 通过使用优先队列&#xff08;最大堆&#xff09;来找到数组中第k大的元素。通过弹出最大堆中的前k-1个元素&#xff0c;留下堆中的顶部元素作为结果返回。 代码 class Solution { public:int find…

Java17(LTS Long Term Support)特性

支持JDK17的主流技术框架 spring framework 6.xspringboot 3.xkafka 3.0(不在支持jdk8)jenkins 2.357&#xff08;必须jdk11起步&#xff09;James Gosling表示赶紧弃用Java8&#xff0c;使用性能最好的JDK17Chart GPT也推荐JDK17&#xff0c;从长期到性能来说。 JDK17的特性 …

htop命令中显示相同进程的解决方案

使用 htop 的过程中会发现有很多同样的进程被标注了绿色大量显示。如下图所示。 这使得在大量程序运行时想要找到需要观察的进程变的困难。本文介绍了如何省略这些重复现实的进程。 输入 htop&#xff0c;显示出 htop 界面。按下 F2 键&#xff0c;进入 Setup 模式点击 Displa…

C++基础 -10- 类

类的格式 public:公共成员 类外可访问 protected:保护成员 类外不可访问 private:私有成员 类外不可访问 class base {public:int a;protected:int b;private:int c;};

WEB渗透—反序列化(八)

Web渗透—反序列化 课程学习分享&#xff08;课程非本人制作&#xff0c;仅提供学习分享&#xff09; 靶场下载地址&#xff1a;GitHub - mcc0624/php_ser_Class: php反序列化靶场课程&#xff0c;基于课程制作的靶场 课程地址&#xff1a;PHP反序列化漏洞学习_哔哩哔_…