一文看懂Android.bp和Androd.mk区别以及宏变量对应关系
目录
一、区别
二、mk转换为bp
三、宏变量对应关系
四、常用宏变量作用
一、区别
- Android.bp --> Soong --> Ninja
- Makefile or Android.mk --> kati --> Ninja
最终都是生成Ninja格式文件进行编译。
相关概念:
- ninja是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将 Android.bp文件转换成ninja格式文件来编译
- Soong类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。
- Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用
- kati是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati
二、mk转换为bp
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。旧的mk可以转换为bp,Soong会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件。只针对简单的mk文件转换,涉及分支,循环等控制转换并不准确。即:
Android.mk --> Soong中androidmk --> Android.bp
三、宏变量对应关系
直接在"build/soong/androidmk/androidmk/android.go"文件中找:
var moduleTypes = map[string]string{"BUILD_SHARED_LIBRARY": "cc_library_shared","BUILD_STATIC_LIBRARY": "cc_library_static","BUILD_HOST_SHARED_LIBRARY": "cc_library_host_shared","BUILD_HOST_STATIC_LIBRARY": "cc_library_host_static","BUILD_HEADER_LIBRARY": "cc_library_headers","BUILD_EXECUTABLE": "cc_binary","BUILD_HOST_EXECUTABLE": "cc_binary_host","BUILD_NATIVE_TEST": "cc_test","BUILD_HOST_NATIVE_TEST": "cc_test_host","BUILD_NATIVE_BENCHMARK": "cc_benchmark","BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host","BUILD_JAVA_LIBRARY": "java_library_installable", // will be rewritten to java_library by bpfix"BUILD_STATIC_JAVA_LIBRARY": "java_library","BUILD_HOST_JAVA_LIBRARY": "java_library_host","BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik","BUILD_PACKAGE": "android_app","BUILD_RRO_PACKAGE": "runtime_resource_overlay","BUILD_CTS_EXECUTABLE": "cc_binary", // will be further massaged by bpfix depending on the output path"BUILD_CTS_SUPPORT_PACKAGE": "cts_support_package", // will be rewritten to android_test by bpfix"BUILD_CTS_PACKAGE": "cts_package", // will be rewritten to android_test by bpfix"BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix"BUILD_CTS_HOST_JAVA_LIBRARY": "cts_host_java_library", // will be rewritten to java_library_host by bpfix
}var prebuiltTypes = map[string]string{"SHARED_LIBRARIES": "cc_prebuilt_library_shared","STATIC_LIBRARIES": "cc_prebuilt_library_static","EXECUTABLES": "cc_prebuilt_binary","JAVA_LIBRARIES": "java_import","APPS": "android_app_import","ETC": "prebuilt_etc",
}var rewriteProperties = map[string](func(variableAssignmentContext) error){// custom functions"LOCAL_32_BIT_ONLY": local32BitOnly,"LOCAL_AIDL_INCLUDES": localAidlIncludes,"LOCAL_ASSET_DIR": localizePathList("asset_dirs"),"LOCAL_C_INCLUDES": localIncludeDirs,"LOCAL_EXPORT_C_INCLUDE_DIRS": exportIncludeDirs,"LOCAL_JARJAR_RULES": localizePath("jarjar_rules"),"LOCAL_LDFLAGS": ldflags,"LOCAL_MODULE_CLASS": prebuiltClass,"LOCAL_MODULE_STEM": stem,"LOCAL_MODULE_HOST_OS": hostOs,"LOCAL_RESOURCE_DIR": localizePathList("resource_dirs"),"LOCAL_SANITIZE": sanitize(""),"LOCAL_SANITIZE_DIAG": sanitize("diag."),"LOCAL_STRIP_MODULE": strip(),"LOCAL_CFLAGS": cflags,"LOCAL_UNINSTALLABLE_MODULE": invert("installable"),"LOCAL_PROGUARD_ENABLED": proguardEnabled,"LOCAL_MODULE_PATH": prebuiltModulePath,"LOCAL_REPLACE_PREBUILT_APK_INSTALLED": prebuiltPreprocessed,// composite functions"LOCAL_MODULE_TAGS": includeVariableIf(bpVariable{"tags", bpparser.ListType}, not(valueDumpEquals("optional"))),// skip functions"LOCAL_ADDITIONAL_DEPENDENCIES": skip, // TODO: check for only .mk files?"LOCAL_CPP_EXTENSION": skip,"LOCAL_MODULE_SUFFIX": skip, // TODO"LOCAL_PATH": skip, // Nothing to do, except maybe avoid the "./" in paths?"LOCAL_PRELINK_MODULE": skip, // Already phased out"LOCAL_BUILT_MODULE_STEM": skip,"LOCAL_USE_AAPT2": skip, // Always enabled in Soong"LOCAL_JAR_EXCLUDE_FILES": skip, // Soong never excludes files from jars"LOCAL_ANNOTATION_PROCESSOR_CLASSES": skip, // Soong gets the processor classes from the plugin"LOCAL_CTS_TEST_PACKAGE": skip, // Obsolete"LOCAL_JACK_ENABLED": skip, // Obselete"LOCAL_JACK_FLAGS": skip, // Obselete
}func init() {addStandardProperties(bpparser.StringType,map[string]string{"LOCAL_MODULE": "name","LOCAL_CXX_STL": "stl","LOCAL_MULTILIB": "compile_multilib","LOCAL_ARM_MODE_HACK": "instruction_set","LOCAL_SDK_VERSION": "sdk_version","LOCAL_MIN_SDK_VERSION": "min_sdk_version","LOCAL_NDK_STL_VARIANT": "stl","LOCAL_JAR_MANIFEST": "manifest","LOCAL_CERTIFICATE": "certificate","LOCAL_PACKAGE_NAME": "name","LOCAL_MODULE_RELATIVE_PATH": "relative_install_path","LOCAL_PROTOC_OPTIMIZE_TYPE": "proto.type","LOCAL_MODULE_OWNER": "owner","LOCAL_RENDERSCRIPT_TARGET_API": "renderscript.target_api","LOCAL_NOTICE_FILE": "notice","LOCAL_JAVA_LANGUAGE_VERSION": "java_version","LOCAL_INSTRUMENTATION_FOR": "instrumentation_for","LOCAL_MANIFEST_FILE": "manifest","LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING": "dex_preopt.profile","LOCAL_TEST_CONFIG": "test_config","LOCAL_RRO_THEME": "theme",})addStandardProperties(bpparser.ListType,map[string]string{"LOCAL_SRC_FILES": "srcs","LOCAL_SRC_FILES_EXCLUDE": "exclude_srcs","LOCAL_HEADER_LIBRARIES": "header_libs","LOCAL_SHARED_LIBRARIES": "shared_libs","LOCAL_STATIC_LIBRARIES": "static_libs","LOCAL_WHOLE_STATIC_LIBRARIES": "whole_static_libs","LOCAL_SYSTEM_SHARED_LIBRARIES": "system_shared_libs","LOCAL_ASFLAGS": "asflags","LOCAL_CLANG_ASFLAGS": "clang_asflags","LOCAL_COMPATIBILITY_SUPPORT_FILES": "data","LOCAL_CONLYFLAGS": "conlyflags","LOCAL_CPPFLAGS": "cppflags","LOCAL_REQUIRED_MODULES": "required","LOCAL_HOST_REQUIRED_MODULES": "host_required","LOCAL_TARGET_REQUIRED_MODULES": "target_required","LOCAL_OVERRIDES_MODULES": "overrides","LOCAL_LDLIBS": "host_ldlibs","LOCAL_CLANG_CFLAGS": "clang_cflags","LOCAL_YACCFLAGS": "yacc.flags","LOCAL_SANITIZE_RECOVER": "sanitize.recover","LOCAL_LOGTAGS_FILES": "logtags","LOCAL_EXPORT_HEADER_LIBRARY_HEADERS": "export_header_lib_headers","LOCAL_EXPORT_SHARED_LIBRARY_HEADERS": "export_shared_lib_headers","LOCAL_EXPORT_STATIC_LIBRARY_HEADERS": "export_static_lib_headers","LOCAL_INIT_RC": "init_rc","LOCAL_VINTF_FRAGMENTS": "vintf_fragments","LOCAL_TIDY_FLAGS": "tidy_flags",// TODO: This is comma-separated, not space-separated"LOCAL_TIDY_CHECKS": "tidy_checks","LOCAL_RENDERSCRIPT_INCLUDES": "renderscript.include_dirs","LOCAL_RENDERSCRIPT_FLAGS": "renderscript.flags","LOCAL_JAVA_RESOURCE_DIRS": "java_resource_dirs","LOCAL_JAVA_RESOURCE_FILES": "java_resources","LOCAL_JAVACFLAGS": "javacflags","LOCAL_ERROR_PRONE_FLAGS": "errorprone.javacflags","LOCAL_DX_FLAGS": "dxflags","LOCAL_JAVA_LIBRARIES": "libs","LOCAL_STATIC_JAVA_LIBRARIES": "static_libs","LOCAL_JNI_SHARED_LIBRARIES": "jni_libs","LOCAL_AAPT_FLAGS": "aaptflags","LOCAL_PACKAGE_SPLITS": "package_splits","LOCAL_COMPATIBILITY_SUITE": "test_suites","LOCAL_OVERRIDES_PACKAGES": "overrides","LOCAL_ANNOTATION_PROCESSORS": "plugins","LOCAL_PROGUARD_FLAGS": "optimize.proguard_flags","LOCAL_PROGUARD_FLAG_FILES": "optimize.proguard_flags_files",// These will be rewritten to libs/static_libs by bpfix, after their presence is used to convert// java_library_static to android_library."LOCAL_SHARED_ANDROID_LIBRARIES": "android_libs","LOCAL_STATIC_ANDROID_LIBRARIES": "android_static_libs","LOCAL_ADDITIONAL_CERTIFICATES": "additional_certificates",// Jacoco filters:"LOCAL_JACK_COVERAGE_INCLUDE_FILTER": "jacoco.include_filter","LOCAL_JACK_COVERAGE_EXCLUDE_FILTER": "jacoco.exclude_filter","LOCAL_FULL_LIBS_MANIFEST_FILES": "additional_manifests",})addStandardProperties(bpparser.BoolType,map[string]string{// Bool properties"LOCAL_IS_HOST_MODULE": "host","LOCAL_CLANG": "clang","LOCAL_FORCE_STATIC_EXECUTABLE": "static_executable","LOCAL_NATIVE_COVERAGE": "native_coverage","LOCAL_NO_CRT": "nocrt","LOCAL_ALLOW_UNDEFINED_SYMBOLS": "allow_undefined_symbols","LOCAL_RTTI_FLAG": "rtti","LOCAL_PACK_MODULE_RELOCATIONS": "pack_relocations","LOCAL_TIDY": "tidy","LOCAL_USE_CLANG_LLD": "use_clang_lld","LOCAL_PROPRIETARY_MODULE": "proprietary","LOCAL_VENDOR_MODULE": "vendor","LOCAL_ODM_MODULE": "device_specific","LOCAL_PRODUCT_MODULE": "product_specific","LOCAL_SYSTEM_EXT_MODULE": "system_ext_specific","LOCAL_EXPORT_PACKAGE_RESOURCES": "export_package_resources","LOCAL_PRIVILEGED_MODULE": "privileged","LOCAL_AAPT_INCLUDE_ALL_RESOURCES": "aapt_include_all_resources","LOCAL_DONT_MERGE_MANIFESTS": "dont_merge_manifests","LOCAL_USE_EMBEDDED_NATIVE_LIBS": "use_embedded_native_libs","LOCAL_USE_EMBEDDED_DEX": "use_embedded_dex","LOCAL_DEX_PREOPT": "dex_preopt.enabled","LOCAL_DEX_PREOPT_APP_IMAGE": "dex_preopt.app_image","LOCAL_DEX_PREOPT_GENERATE_PROFILE": "dex_preopt.profile_guided","LOCAL_PRIVATE_PLATFORM_APIS": "platform_apis","LOCAL_JETIFIER_ENABLED": "jetifier","LOCAL_IS_UNIT_TEST": "unit_test","LOCAL_ENFORCE_USES_LIBRARIES": "enforce_uses_libs",})
}
四、常用宏变量作用
不断更新...记录常用但不好理解的
- LOCAL_PROPRIETARY_MODULE,proprietary:true控制生成路径到vendor/lib,false就是system/lib;
- LOCAL_CLANG,clang:true来指定默认编译器为Clang,Android 8.0后不需要指定,默认是Clang;
- -----------------------------------------------------alibli分割符-------------------------------------------------------
- LOCAL_SRC_FILES:当前模块包含的所有源代码文件
- LOCAL_MODULE:当前模块的名称,这个名称应当是唯一的,模块间的依赖关系就是通过这个名称来引用的
- LOCAL_C_INCLUDES:C 或 C++ 语言需要的头文件的路径
- LOCAL_STATIC_LIBRARIES:当前模块在静态链接时需要的库的名称
- LOCAL_SHARED_LIBRARIES:当前模块在运行时依赖的动态库的名称
- LOCAL_CFLAGS:提供给 C/C++ 编译器的额外编译参数
- LOCAL_JAVA_LIBRARIES:当前模块依赖的 Java 共享库
- LOCAL_STATIC_JAVA_LIBRARIES:当前模块依赖的 Java 静态库
- LOCAL_PACKAGE_NAME:当前 APK 应用的名称
- LOCAL_CERTIFICATE:签署当前应用的证书名称
- LOCAL_MODULE_PATH:指定输出路径
- LOCAL_PRIVILEGED_MODULE:指定生成的apk是否在system/priv-app/下,等同于设置LOCAL_MODULE_PATH := $(TARGET_OUT)/system/priv-app
- LOCAL_MODULE_TAGS:user/debug/eng/optional 指定该模块在什么版本下编译 optional 表示所有版本都编译
- -----------------------------------------------------alibli分割符-------------------------------------------------------
- BUILD_HOST_STATIC_LIBRARY:编译静态库(适用于主机)
- BUILD_HOST_SHARED_LIBRARY:编译动态库(适用于主机)
- BUILD_HOST_EXECUTABLE:编译可执行程序(适用于主机)
- BUILD_HOST_PREBUILT:预编译(适用于主机)
- BUILD_HOST_JAVA_LIBRARY:编译java包(适用于主机)
- BUILD_JAVA_LIBRARY:编译java包
- BUILD_STATIC_JAVA_LIBRARY:编译java静态包
- BUILD_STATIC_LIBRARY:编译静态库
- BUILD_SHARED_LIBRARY:编译动态库
- BUILD_EXECUTABLE:编译可执行程序
- BUILD_PACKAGE:编译apk
- BUILD_PREBUILT:预编译(针对单个预编译文件)
- BUILD_MULTI_PREBUILT:预编译(针对多个预编译文件)
- -----------------------------------------------------alibli分割符-------------------------------------------------------
LOCAL_SHARED_LIBRARIES、LOCAL_LDLIBS、LOCAL_LDFLAGS的区别:
LOCAL_SHARED_LIBRARIES 会生成依赖关系,当库不存在时会去编译这个库。
LOCAL_LDLIBS :链接的库不产生依赖关系,一般用于不需要重新编译的库,如库不存在,则会报错找不到。且貌似只能链接那些存在于系统目录下本模块需要连接的库。如果某一个库既有动态库又有静态库,那么在默认情况下是链接的动态库而非静态库。
如:LOCAL_LDLIBS += -lm –lz –lc -lcutils –lutils –llog …
如果你的Android.mk文件中只有这么一行,那么将会采用动态链接。
LOCAL_LDFLAGS:这个编译变量传递给链接器一个一些额外的参数,比如想传递额外的库和库路径给ld,或者传递给ld linker的一些链接参数,-On,-EL{B}(大小端字节序),那么就要加到这个上面,如:
LOCAL_LDFLAGS += -L$(LOCAL_PATH)/lib/ -lHWrecog –EB{EL} –O{n} …
或者直接加上绝对路径库的全名:
LOCAL_LDFLAGS += $(LOCAL_PATH)/lib/libHWrecog.a –EB{EL} –O{n}
如果是非系统的第三方库,貌似只能用LOCAL_LDFLAGS方式,LOCAL_LDLIBS方式不行。
部分参考优秀博客:
Android.mk常用宏定义 - 简书 (jianshu.com)
一文看懂Android.bp和Androd.mk区别以及宏变量对应关系相关推荐
- 一文看懂Android APK安装的原理
一文看懂Android APK安装的原理 前言 APK包的构成 安装APK 总结 前言 大家有没有想过一个应用的APK是怎么被安装到安卓手机上的,安装的本质是什么?我们知道,Windows应用程序的安 ...
- pdxp协议 C语言,一文看懂PD协议和Type-C的区别
描述 说到充电快,那一定要了解下PD快充协议?那么PD协议和Type-C又有什么关系呢?下面带你一起来搞清楚. Type-C接口 Type-C 口不但更节省空间,还具备传统 USB-A 口不具备的多种 ...
- oracle 触发器 insert 前检查_一文看懂INSTEAD OF 与AFTER 触发器区别与联系
概述 最近在写触发器时碰到一个报错,简单记录如下:报错信息: > [42000] [Microsoft][SQL Server Native Client 10.0][SQL Server]不能 ...
- 一文看懂机器视觉工业相机与普通相机的区别
工业相机是机器视觉系统中的一个关键组件,其最本质的功能就是将光信号转变成为有序的电信号.选择合适的相机也是机器视觉系统设计中的重要环节,相机的不仅是直接决定所采集到的图像分辨率.图像质量等,同时也与整 ...
- 一篇文章一张思维导图看懂Android学习最佳路线
一篇文章一张思维导图看懂Android学习最佳路线 先上一张android开发知识点学习路线图思维导图 Android学习路线从4个阶段来对Android的学习过程做一个全面的分析:Android初级 ...
- 怎么看电脑系统是win几_一文看懂arm架构和x86架构有什么区别
一文看懂arm架构和x86架构有什么区别 本文主要介绍的是arm架构和x86架构的区别,首先介绍了ARM架构图,其次介绍了x86架构图,最后从性能.扩展能力.操作系统的兼容性.软件开发的方便性及可使用 ...
- 《SOC芯片研究框架》深度科普,发展趋势、技术特点、产业链一文看懂
片上系统SoC(System on Chip),即在一块芯片上集成一整个信息处理系统,简单来说 SoC芯片是在中央处理器CPU的基础上扩展音视频功能和专用接口的超大规模集成电路,是智能设备的" ...
- 一文看懂前端和后端开发
作为一名开发者,你可能会想:2021 年最好的软件开发技术和编程语言会是什么?它们又是如何被应用在软件开发当中的?如果你在思考这个问题,那就来对地方了.这篇文章将对前端和后端开发技术做一个对比,先从基 ...
- 一文看懂 AI 训练集、验证集、测试集(附:分割方法+交叉验证)
2019-12-20 20:01:00 数据在人工智能技术里是非常重要的!本篇文章将详细给大家介绍3种数据集:训练集.验证集.测试集. 同时还会介绍如何更合理的讲数据划分为3种数据集.最后给大家介绍一 ...
- 一文看懂计算机视觉-CV(基本原理+2大挑战+8大任务+4个应用)
2020-03-06 20:00:00 计算机视觉(Computer Vision)是人工智能领域的一个重要分支.它的目的是:看懂图片里的内容. 本文将介绍计算机视觉的基本概念.实现原理.8 个任务和 ...
最新文章
- 电大计算机要学多久,电大计算机应用基础是我们必须要学习的科目吗
- 牛客多校10 - Identical Trees(dp+二分图最小权匹配)
- html单行元素居中显示,多行元素居左显示
- Solr基础教程之solrconfig.xml(三)
- flash中物体运动基础之七---------碰撞处理
- mysql关联分组查询,Mysql 分组查询/子查询/关联查询【总结】
- RS485串口模块详解RS232、RS485、RS485
- svn多分支开发合并技巧(idea or tortoiseSVN)
- 【Prometheus】Prometheus联邦的一次优化记录[续]
- UVA 12304 (平面几何)
- php 文字弹幕效果代码,视频弹幕特效代码
- 案例:用逻辑回归制作评分卡
- QTreeview中虚线框解决办法(QWidget控件祛除焦点)
- 优锘科技:扒一扒图化资源申请之三生三世那点事儿
- AdminEAP框架-基于AdminLTE的权限管理
- 利用ANSYS Maxwell仿真结果求功率因数
- java计算机毕业设计考试编排管理系统MyBatis+系统+LW文档+源码+调试部署
- 什么是Y4M文件格式
- 从零开始写设备树DTS
- ArrayList做的员工薪资管理系统
热门文章
- matlab 直接逆滤波,图像复原之直接逆滤波
- C语言的getc()和putc()函数
- c语言现有21根火柴,python应用-21根火柴游戏
- 用excel实现工作日志的更新和汇总
- 计算机显示时区怎么更改,电脑时区自动改怎么办
- 计算机系的的毕业感言,计算机班同学的毕业感言
- web网站http转成https
- 3DMax如何通过光子图渲染
- android7工程自测模式,工程模式测试
- Some WSL system related access rights are not set correctly. This sometimes happens after waking the