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

news2024/11/24 21:13:53

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 := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_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 optional

user: 指该模块只在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_symbols
 
LOCAL_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.cpp
  LOCAL_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.cpp
  LOCAL_SHARED_LIBRARIES += liba2dp
  LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
  LOCAL_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
else
 LOCAL_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 libaudiopolicybase
  LOCAL_CFLAGS += -DGENERIC_AUDIO
else
  LOCAL_SHARED_LIBRARIES += libaudio libaudiopolicy
endif
ifeq ($(TARGET_SIMULATOR),true)
 LOCAL_LDLIBS += -ldl
else
 LOCAL_SHARED_LIBRARIES += libdl
endif
LOCAL_MODULE:= libaudioflinger
ifeq ($(BOARD_HAVE_BLUETOOTH),true)
  LOCAL_CFLAGS += -DWITH_BLUETOOTH -DWITH_A2DP
  LOCAL_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 -lpthread
    endif
endif
ifeq ($(BOARD_USE_LVMX),true)
    LOCAL_CFLAGS += -DLVMX
    LOCAL_C_INCLUDES += vendor/nxp
    LOCAL_STATIC_LIBRARIES += liblifevibes
    LOCAL_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 package
  LOCAL_STATIC_JAVA_LIBRARIES := static-library
   
  # Build all java files in the java subdirectory
  LOCAL_SRC_FILES := $(call all-subdir-java-files)
   
  # Name of the APK to build
  LOCAL_PACKAGE_NAME := LocalPackage
   
  # Tell it to build an APK
  include $(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.coloradmin.cn/o/1263129.html

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

相关文章

接口文档自动生成工具:详细教程和实用技巧

本篇文章详细教你如何使用 Apifox 的 IDEA 插件实现自动生成接口代码。好处简单总结有以下几点&#xff1a; 自动生成接口文档&#xff1a; 不用手写&#xff0c;一键点击就可以自动 生成文档&#xff0c;当有更新时&#xff0c;点击一下就可以自动同步接口文档&#xff1b;代…

小程序静默授权获取unionid

文章目录 导文文章重点 导文 小程序静默授权获取unionid 文章重点 用wx.login(Object object)放到app.js里面 wx.login({success (res) {console.log(123);if (res.code) {//发起网络请求// wx.request({// url: https://example.com/onLogin,// data: {// code: res.…

ERRO报错

无法下载nginx 如下解决&#xff1a; 查看是否有epel 源 安装epel源 安装第三方 yum -y install epel-release.noarch NGINX端口被占用 解决&#xff1a; 编译安装的NGINX配置文件在/usr/local/ngin/conf 修改端口

AI - Navmesh 寻路

用cocos2dx引擎简单实现了一下navmesh的多边形划分&#xff0c;然后基于划分多边形的a*寻路。以及路径拐点优化算法 用cocos主要是方便使用一些渲染接口和定时器。重点是实现的原理。 首先画了一个带有孔洞的多边形 //多边形的顶点数据Vec2(100, 100),Vec2(300, 200),Vec2(50…

程序员的软件开发帮手,低代码当仁不让

目录 一、低代码是什么&#xff1f; 二、低代码的能力表现 1.提供可视化开发 2.预构建的组件和模板 3.集成的开发和测试工具 4.跨平台兼容性 5.可伸缩性和可扩展性&#xff1a; 跟随互联网信息技术快速发展的脚步&#xff0c;各行各业都在积极拥抱数字化转型。在这个过程中&…

详解STL库—map和set

目录 一、关联式容器 二、键值对 SGI-STL中关于键值对的定义&#xff1a; 三、set 3.1 set的介绍 3.2 set的使用 1.set的模板参数列表​编辑 2. set的构造 3. set的迭代器 4. set的容量 5. set修改操作 6. set的使用举例 四、map 4.1map的介绍 4.2 map的使用 1…

国产操作系统-银河麒麟V10

一、介绍 银河麒麟操作系统隶属于麒麟软件&#xff0c;麒麟软件是专业从事国产操作系统研发和产业化的企业&#xff0c;面向通用和专用领域打造安全创新的国产操作系统产品和相应解决方案&#xff0c;旗下拥有银河麒麟、中标麒麟、星光麒麟三大产品品牌。 麒麟软件官方网站地…

【攻防世界-misc】glance-50

1.得到一个动图 2.使用GIF动态图片分解&#xff0c;多帧动态图分解成多张静态图片_图片工具网页版&#xff0c;将图片定格组合&#xff0c; 由此得到flag值&#xff0c;拼写提交。

卡码网语言基础课 | 15. 链表的基础操作Ⅲ

目录 一、 插入链表的过程 二、 删除链表的过程 三、 打印链表 3.1 判断节点是否处于链尾 3.2 打印链表 3.3 循环体结束&#xff0c;遍历打印 题目&#xff1a; 请编写一个程序&#xff0c;实现以下链表操作&#xff1a;构建一个单向链表&#xff0c;链表中包含一组整数…

c++没有返回值的返回值

上面的函数search没有返回值,因为a不等于1,但是输出的时候会输出6.这恰巧是x的值,如果我们希望a不等于1时返回x,那么这种结果反而是正确的.有时候这种错误的代码可能产生正确的结果反而会加大debug难度 int search(int n) { 00007FF66DB723E0 mov dword ptr [rsp8],e…

【Linux系统编程】进程概念详解(什么是进程?如何查看进程?)

目录 一、前言 二、 什么是进程&#xff1f; &#x1f4a6;引出进程 &#x1f4a6;进程的基本概念 &#x1f4a6;理解进程 ⭐描述进程--PCB&#xff08;进程控制块&#xff09; ⭐组织进程 三、查看进程 &#x1f4a6; 通过 ps 命令查看进程 &#x1f4a6; 通过 l…

事件代理?

1.什么是事件代理&#xff1f; 事件代理也叫事件委托&#xff0c;只指定一个事件处理程序&#xff0c;就可以管理某一类型得事件。 可以简单理解为&#xff0c;事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是&#xff1a;减少事件得执行&#xff0c;减少浏…

2023/11/28JAVAweb学习

查找哪个进程占用了该端口号 跳过某一个阶段

欧拉公式推导

欧拉恒等式 函数推导过程(幂级数展开的方式近似&#xff0c;后面用到了三角函数展开的方式) 从导数中推导的方程&#xff0c;对于该函数当x0时为1即初值,导数为自身&#xff1b; 设,当x 0时&#xff0c; 因为函数是收敛的所以会越来越精确&#xff08;引用自MIT公开课&#xf…

激光器温度,波长变化

940&#xff0c;波长变化0.3nm/C

小白必知:AIGC 和 ChatGPT 的区别

原文 &#xff1a; https://openaigptguide.com/chatgpt-aigc-difference/ AIGC 和 ChatGPT 都是人工智能技术&#xff0c;但它们的功能和应用场景不同。 AIGC&#xff08;AI-GeneratedContent&#xff0c;人工智能自动生成内容&#xff09;是人工智能、计算机图形学和深度学…

强烈推荐:零售行业升级教程,现学现用

新零售模式是随着科技的迅猛发展而崭露头角的一种零售业态。在这个数字化时代&#xff0c;消费者的购物习惯和期望正在发生根本性的变化&#xff0c;推动着传统零售业寻找创新的方式来满足不断变化的市场需求。 自动售货机作为新零售模式的一部分&#xff0c;以其高效、便捷、智…

凝聚数字经济发展新力量,四象科技受邀出席2023全球数商大会

11月25日&#xff0c;2023全球数商大会在上海开幕。本届大会以“数联全球、商通未来”为主题&#xff0c;上海市委副书记、市长龚正出席大会并宣布大会开幕&#xff0c;国家发展改革委党组成员&#xff0c;国家数据局党组书记、局长刘烈宏&#xff0c;上海市副市长陈杰致辞。四…

写了个数据查询为空的 Bug,你会怎么办?

大家在开发时&#xff0c;遇到的一个典型的 Bug 就是&#xff1a;为什么数据查询为空&#xff1f; 对应的现象就是&#xff1a;前端展示不出数据、或者后端查询到的数据列表为空。 遇到此类问题&#xff0c;其实是有经典的解决套路的&#xff0c;下面鱼皮给大家分享如何高效解决…

【实验】配置用户通过IPv6方式上网

【赠送】IT技术视频教程&#xff0c;白拿不谢&#xff01;思科、华为、红帽、数据库、云计算等等https://xmws-it.blog.csdn.net/article/details/117297837?spm1001.2014.3001.5502【微/信/公/众/号&#xff1a;厦门微思网络】 组网需求 运营商为企业分配了WAN侧的IPv6地址11…