Android.mk和Android.bp的区别和转换详解

[复制链接]
发表于 2026-2-22 11:06:48 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Android.mk和Android.bp的区别和转换详解



一、媒介

简朴的说:
Android.mk和Android.bp都是用来编译出类库.jar,应用文件.apk,动态库.so,静态库.a等等作用。
Android.mk就是一个GNU make语法的脚本文件。
Android.bp文件是Android 7.0及更高版本中引入的一种构建脚本文件,是使用Starlark语法编写的,它是一种基于Python的轻量级脚本语言。
他们的关系如下:

上面流程图的解读:
ninja是一个编译框架,体系会根据相应的ninja格式的设置文件举行编译。
体系编译那些应用相干的模块现实上是读取一个个ninja设置举行编译;
Android.mk通过Kati工具可以转换成ninja设置文件;
Android.bp通过Blueprint+Soong工具转换成ninja设置文件;
Android.mk–>Android.bp 指的是mk可以通过androidmk工具编译成bp文件,
在现实编译中会不会把Android.mk先编译成Android.bp处置处罚?
只是知道他们之间的关系着实是没有多大用处的,只是让你对他们的知识内心有个底,
真正的是要分别学会脚本文件的编写和学会转换使用脚本文件。
比如,你获取到的是一个mk文件,你要转换成bp文件,就要学习肯定的内容才气完成。
Android.mk详解+入门必备:

Android.bp详解+入门必备

从现实开辟中打仗到的Android8-13 package相干源码看,
Android9以及之前的代码之前根本没怎么看到有Android.bp文件的使用,
Android11的代码,有一半左右的应用编译脚本使用的是Android.bp,
Android13的代码中90%以上的应用编译都是使用的Android.bp,
以是从Android代码迭代趋势看得出 Android.bp是大趋势,对于编译Android源码来说是要必须把握的。
总的来说,本文应该是全网先容Android.mk和Android.bp知识最全面的一篇文章,有必要的,可以收藏使用。
二、Android.mk和Android.bp的接洽

Android.mk和Android.bp是Android开辟中使用的两种构建文件格式。
Android.mk是旧版本的构建文件格式,使用GNU Make语法,用于界说和设置Android应用或库的构建过程和依赖关系。它是基于Make工具的脚本文件,通过界说模块、源文件、编译选项和依赖关系等内容来完成构建过程。
Android.bp是新一代的构建文件格式,使用雷同于Python的语法,用于界说和设置Android应用或库的构建过程和依赖关系。它是基于Soong构建体系的脚本文件,通过界说模块、源文件、编译选项和依赖关系等内容来完成构建过程。
Android.bp相对于Android.mk具有更强大的功能和更机动的语法。它支持模块的继承、条件构建、模块分割和动态选择等特性,使构建过程更加可控和可设置。
在Android的构建体系中,Android.mk和Android.bp可以共存,但发起使用Android.bp来编写新的构建文件,以便发挥其更多的上风和功能。同时,Soong构建体系也提供了工具和规则来主动将Android.mk转换为对应的Android.bp文件,以便举行平滑的迁徙和兼容。
三、Android.mk和Android.bp的区别

1、语法:

Android.mk使用GNU make语法,而Android.bp使用Starlark语法。Starlark是一种基于Python的轻量级脚本语言。
2、机动性:

相对于Android.mk,Android.bp在模块界说、依赖关系和编译选项等方面更加机动和易于维护。Android.bp具有更强大的表达本事,可以更好地处置处罚复杂的项目布局和构建需求。
Android.bp 只是纯粹的设置文件(雷同json),不包罗分支、循环等流程控制 (如果想要举行分支循环控制可本身写 go 来完成),因此 Android.bp 文件被转化成 ninja 文件的服从远远高于 Android.mk 文件。
3、版本兼容性:

Android.mk实用于Android的早期版本,而Android.bp实用于Android 7.0及更高版本。在新版Android中,发起使用Android.bp来管理和构建项目。
4、向后兼容性:

Android.bp仅在Android 7.0及更高版本引入,而Android.mk仍然可以继承使用。为了保持向后兼容性,Android构建体系可以同时支持Android.mk和Android.bp文件,可以在同一个项目中同时使用两种格式的构建文件。
综上所述,Android.mk和Android.bp是两种差别版本的Android构建脚本文件,它们之间有肯定的关系和区别。Android.bp是更加机动和保举的构建脚本文件,在较新的Android版本中使用。但为了向后兼容性,Android.mk仍然可以继承使用,而且可以与Android.bp文件同时存在于同一个项目中。
5、编译区别:

  1. **ninja**是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将 Android.bp文件转换成ninja格文件来编译
  2. 1**Android.bp**是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写
  3. 2. **Soong**类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件
  4. 3. **Blueprint**是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用
  5. 4. **kati**是专为Android开发的一个基于Golang和C++的工具,主要功能是把Android中的Android.mk文件转换成Ninja文件。代码路径是build/kati/,编译后的产物是ckati
复制代码
上面先容的都是一些概念知识,下面涉及到的代码先容才是现实开辟有有用的知识。
四、Android.mk和Android.bp的转换

Google 提供了 androidmk 工具可以将 Android.mk 转换为 Android.bp。
但是这个工具现在还不美满,不能处置处罚 Android.mk 中的宏开关。
Android.mk内里有些复杂用法,也大概在Android.bp内里未界说使用。
1、androidmk源码

androidmk 的源码在 build/soong/androidmk 目次下:

这里看到 androidmk 是一个文件夹,内里紧张功能文件是:android.go
这个 android.go 文件内里包罗了Android.mk 转换成 Android.bp 的对应关系
比如:
  1. func init() {
  2.         addStandardProperties(bpparser.StringType,
  3.                 //前面的是Android.mk的关键字,后面是Android.bp 的关键字
  4.                 map[string]string{
  5.                         "LOCAL_MODULE":                  "name", //mk文件和bp文件,模块名称定义的关键字
  6.                         "LOCAL_CERTIFICATE":             "certificate",//是否系统签名
  7.                         "LOCAL_JAVA_LANGUAGE_VERSION":   "java_version",
  8.                         "LOCAL_INSTRUMENTATION_FOR":     "instrumentation_for",
  9.                         "LOCAL_MANIFEST_FILE":           "manifest",
  10. ...
  11.                 })
复制代码
android.go文件全部内容检察:
http://aospxref.com/android-13.0.0_r3/xref/build/soong/androidmk/androidmk/android.go
2、源码环境使用下令把Android.mk转换成Android.bp

(1)详细下令是:

  1. androidmk Android.mk > Android.bp
复制代码
(2)详细使用

androidmk 是体系编译天生的工具,androidmk 工具可以将 Android.mk 文件 转换为 Android.bp 文件,
如果编译过的源码,可以举行如下使用使用下令把Android.mk 文件 转换为 Android.bp 文件:
  1. (1)找到androidmk工具文件,cd到对该目次下,我这里是:release/out/host/linux-x86/bin(2)把必要转换的Android.mk文件复制到 androidmk的bin目次下(3)实验下令:androidmk Android.mk > Android.bp
  2. 就可以在bin目次下看到一个新天生的Android.bp文件了,这个就是体系工具转换的Android.bp文件。亲测有用。
复制代码
(3)转换示例

Android.mk 示例代码
  1. LOCAL_PATH := $(call my-dir)
  2. include $(CLEAR_VARS)
  3. LOCAL_MODULE := MyFileManager
  4. LOCAL_MODULE_CLASS := APPS
  5. LOCAL_MODULE_TAGS := optional
  6. LOCAL_SRC_FILES := MyFileManager.apk
  7. LOCAL_PRIVILEGED_MODULE := true
  8. LOCAL_CERTIFICATE := platform
  9. include $(BUILD_PREBUILT)
复制代码
Android.bp转换后的代码
  1. android_app_import {
  2.     name: "MyFileManager", //(1)编译模块名称
  3.     certificate: "platform", //(2)系统签名
  4.     privileged: true, //(3)是否生成到priv-app目录
  5.     apk: "MyFileManager.apk", //(4)加载需要编译的apk名称
  6.    
  7. }
复制代码
上面代码的转换就是通过 androidmk工具举行转换的。
这里可以看到,Android.bp更加轻便明白,而且省略了一些非须要的信息。
上面转换的信息是可以在android.go中看出对应关系,详细对应关系查找:
  1. func init() {
  2.         //string 类型的关键字
  3.         addStandardProperties(bpparser.StringType,
  4.                 //前面的是Android.mk的关键字,后面是Android.bp 的关键字
  5.                 map[string]string{
  6.                         "LOCAL_MODULE":                  "name", //(1)mk文件和bp文件,模块名称定义的关键字
  7.                         "LOCAL_CERTIFICATE":             "certificate",//(2)系统签名
  8.                         "LOCAL_JAVA_LANGUAGE_VERSION":   "java_version",
  9.                         "LOCAL_INSTRUMENTATION_FOR":     "instrumentation_for",
  10.                         "LOCAL_MANIFEST_FILE":           "manifest",
  11. ...
  12.                 })
  13.         //boolean 类型关键字
  14.         addStandardProperties(bpparser.BoolType,
  15.                 map[string]string{
  16.                         // Bool properties
  17.                         "LOCAL_IS_HOST_MODULE":             "host",
  18.                         "LOCAL_CLANG":                      "clang",
  19.                         "LOCAL_PRIVILEGED_MODULE":          "privileged", //(3)是否生成在priv-app目录
  20. 。。。
  21. }
  22. var prebuiltTypes = map[string]string{
  23.         "SHARED_LIBRARIES": "cc_prebuilt_library_shared",
  24.         "STATIC_LIBRARIES": "cc_prebuilt_library_static",
  25.         "EXECUTABLES":      "cc_prebuilt_binary",
  26.         "JAVA_LIBRARIES":   "java_import",
  27.         "APPS":             "android_app_import", //(4)加载需要编译的apk名称
  28.         "ETC":              "prebuilt_etc",
  29. }
  30. func prebuiltClass(ctx variableAssignmentContext) error {
  31.         class := ctx.mkvalue.Value(ctx.file.scope)
  32.         if _, ok := prebuiltTypes[class]; ok {
  33.                 ctx.file.scope.Set("BUILD_PREBUILT", class)
  34.         } else {
  35.                 // reset to default
  36.                 ctx.file.scope.Set("BUILD_PREBUILT", "prebuilt")
  37.         }
  38.         return nil
  39. }
复制代码
但是从android.go 是看不出 BUILD_PREBUILT 的对应关系是 android_app_import。
而且从网上也是搜索 BUILD_PREBUILT 的对应关系说是: cc_prebuilt ,着实是不对的!
以是网上搜索都的很对不能直接使用,只能参考使用。
别的Android.mk 并不是全部的语句都能转换成Android.bp,
(4)Android.mk无法编译成Android.bp举例

①比如Android.mk内里的shell语句下令,Android.bp是无法实现的:

  1. APK_FILE_PATH := $(shell cd $(LOCAL_PATH)/$(1) ; \
  2.           find ./ -maxdepth 1  -name "*.apk" -and -not -name ".*")
  3. LOCAL_SRC_FILES := $(APK_FILE_PATH)
复制代码
上面的是Android.mk中查找当前目次下的一个以apk定名末了的文件,并设置成必要编译的apk文件
尚有文件复制查找遍历那些语句在Android.bp是无法实现的。
②比如Android.mk中的 LOCAL_PREBUILT_JNI_LIBS 属性是无法转换到Android.bp,直接转换会报

错:
  1. // ANDROIDMK TRANSLATION ERROR: unsupported assignment to LOCAL_PREBUILT_JNI_LIBS
复制代码
固然使用androidmk工具转换不了,而且在android.go文件也未查询到对应关系的字符串,
但是通过网上搜索使用 cc_prebuilt_library_shared 模块范例可以更换,转换如下:
  1. //Android.mk中的引用定义
  2. LOCAL_PREBUILT_JNI_LIBS:= \
  3. lib/armeabi-v7a/libvvo.so \
  4. lib/armeabi-v7a/libvff.so \
  5. //Android.bp中的引用定义
  6. cc_prebuilt_library_shared {
  7.     name: "libvvo",
  8.     srcs: ["lib/armeabi-v7a/libvvo.so"],
  9. }
  10. cc_prebuilt_library_shared {
  11.     name: "libvff",
  12.     srcs: ["lib/armeabi-v7a/libvff.so"],
  13. }
复制代码
但是编译发现还是会报错!
  1. FAILED: out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libvvo_intermediates/check_elf_files.timestamp
  2. /bin/bash -c "(rm -f out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libvvo_intermediates/check_elf_files.timestamp ) && (build/make/tools/check_elf_file.py       --skip-bad-elf-magic            --skip-unknown-elf-machine             --soname libvvo.so      --shared-lib out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libc++_intermediates/libc++.so --shared-lib out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libc_intermediates/libc.so --shared-lib out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libm_intermediates/libm.so --shared-lib out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libdl_intermediates/libdl.so
  3.             --system-shared-lib libc --system-shared-lib libm --system-shared-lib libdl                     --llvm-readobj=prebuilts/clang/host/linux-x86/clang-r450784d/bin/llvm-readobj           out/soong/.intermediates/packages/SkgApps/EShare/libvvo/android_arm64_armv8-a_shared/libvvo.so ) && (touch out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libvvo_intermediates/check_elf_files.timestamp )"
  4. out/soong/.intermediates/packages/SkgApps/EShare/libvvo/android_arm64_armv8-a_shared/libvvo.so: error: DT_SONAME "lib1686494415-6485dccfd4c35_20230611224257.so" must be equal to the file name "libvvo.so".
复制代码
这个报错搞不定啊,涉及到详细编译规则的题目,以是不去做过多挣扎了。
对于比力复杂的so编译环境,Android.bp并未美满相干语句,以是这种环境还是继承使用Android.mk编译即可。
3、Android.mk转换成Android.bp紧张内容

上面已经说了,转换的关系是在 android.go 内里有体现,下面是紧张转换的信息:
  1. //(1)编译的变量属性定义,包括String、列表、Boolean类型,就这三种变量类型,没有什么数字,浮点数那些。
  2. func init() {
  3.         addStandardProperties(bpparser.StringType,
  4.                 map[string]string{
  5.                         "LOCAL_MODULE":                  "name",
  6.                         "LOCAL_CXX_STL":                 "stl",
  7.                         "LOCAL_MULTILIB":                "compile_multilib",
  8.                         "LOCAL_ARM_MODE_HACK":           "instruction_set",
  9.                         "LOCAL_SDK_VERSION":             "sdk_version",
  10.                         "LOCAL_MIN_SDK_VERSION":         "min_sdk_version",
  11.                         "LOCAL_NDK_STL_VARIANT":         "stl",
  12.                         "LOCAL_JAR_MANIFEST":            "manifest",
  13.                         "LOCAL_CERTIFICATE":             "certificate",
  14.                         "LOCAL_CERTIFICATE_LINEAGE":     "lineage",
  15.                         "LOCAL_PACKAGE_NAME":            "name",
  16.                         "LOCAL_MODULE_RELATIVE_PATH":    "relative_install_path",
  17.                         "LOCAL_PROTOC_OPTIMIZE_TYPE":    "proto.type",
  18.                         "LOCAL_MODULE_OWNER":            "owner",
  19.                         "LOCAL_RENDERSCRIPT_TARGET_API": "renderscript.target_api",
  20.                         "LOCAL_JAVA_LANGUAGE_VERSION":   "java_version",
  21.                         "LOCAL_INSTRUMENTATION_FOR":     "instrumentation_for",
  22.                         "LOCAL_MANIFEST_FILE":           "manifest",
  23.                         "LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING": "dex_preopt.profile",
  24.                         "LOCAL_TEST_CONFIG":                      "test_config",
  25.                         "LOCAL_RRO_THEME":                        "theme",
  26.                 })
  27.         addStandardProperties(bpparser.ListType,
  28.                 map[string]string{
  29.                         "LOCAL_SRC_FILES":                     "srcs",
  30.                         "LOCAL_SRC_FILES_EXCLUDE":             "exclude_srcs",
  31.                         "LOCAL_HEADER_LIBRARIES":              "header_libs",
  32.                         "LOCAL_SHARED_LIBRARIES":              "shared_libs",
  33.                         "LOCAL_STATIC_LIBRARIES":              "static_libs",
  34.                         "LOCAL_WHOLE_STATIC_LIBRARIES":        "whole_static_libs",
  35.                         "LOCAL_SYSTEM_SHARED_LIBRARIES":       "system_shared_libs",
  36.                         "LOCAL_USES_LIBRARIES":                "uses_libs",
  37.                         "LOCAL_OPTIONAL_USES_LIBRARIES":       "optional_uses_libs",
  38.                         "LOCAL_ASFLAGS":                       "asflags",
  39.                         "LOCAL_CLANG_ASFLAGS":                 "clang_asflags",
  40.                         "LOCAL_COMPATIBILITY_SUPPORT_FILES":   "data",
  41.                         "LOCAL_CONLYFLAGS":                    "conlyflags",
  42.                         "LOCAL_CPPFLAGS":                      "cppflags",
  43.                         "LOCAL_REQUIRED_MODULES":              "required",
  44.                         "LOCAL_HOST_REQUIRED_MODULES":         "host_required",
  45.                         "LOCAL_TARGET_REQUIRED_MODULES":       "target_required",
  46.                         "LOCAL_OVERRIDES_MODULES":             "overrides",
  47.                         "LOCAL_LDLIBS":                        "host_ldlibs",
  48.                         "LOCAL_CLANG_CFLAGS":                  "clang_cflags",
  49.                         "LOCAL_YACCFLAGS":                     "yacc.flags",
  50.                         "LOCAL_SANITIZE_RECOVER":              "sanitize.recover",
  51.                         "LOCAL_LOGTAGS_FILES":                 "logtags",
  52.                         "LOCAL_EXPORT_HEADER_LIBRARY_HEADERS": "export_header_lib_headers",
  53.                         "LOCAL_EXPORT_SHARED_LIBRARY_HEADERS": "export_shared_lib_headers",
  54.                         "LOCAL_EXPORT_STATIC_LIBRARY_HEADERS": "export_static_lib_headers",
  55.                         "LOCAL_INIT_RC":                       "init_rc",
  56.                         "LOCAL_VINTF_FRAGMENTS":               "vintf_fragments",
  57.                         "LOCAL_TIDY_FLAGS":                    "tidy_flags",
  58.                         // TODO: This is comma-separated, not space-separated
  59.                         "LOCAL_TIDY_CHECKS":           "tidy_checks",
  60.                         "LOCAL_RENDERSCRIPT_INCLUDES": "renderscript.include_dirs",
  61.                         "LOCAL_RENDERSCRIPT_FLAGS":    "renderscript.flags",
  62.                         "LOCAL_JAVA_RESOURCE_DIRS":    "java_resource_dirs",
  63.                         "LOCAL_JAVA_RESOURCE_FILES":   "java_resources",
  64.                         "LOCAL_JAVACFLAGS":            "javacflags",
  65.                         "LOCAL_ERROR_PRONE_FLAGS":     "errorprone.javacflags",
  66.                         "LOCAL_DX_FLAGS":              "dxflags",
  67.                         "LOCAL_JAVA_LIBRARIES":        "libs",
  68.                         "LOCAL_STATIC_JAVA_LIBRARIES": "static_libs",
  69.                         "LOCAL_JNI_SHARED_LIBRARIES":  "jni_libs",
  70.                         "LOCAL_AAPT_FLAGS":            "aaptflags",
  71.                         "LOCAL_PACKAGE_SPLITS":        "package_splits",
  72.                         "LOCAL_COMPATIBILITY_SUITE":   "test_suites",
  73.                         "LOCAL_OVERRIDES_PACKAGES":    "overrides",
  74.                         "LOCAL_ANNOTATION_PROCESSORS": "plugins",
  75.                         "LOCAL_PROGUARD_FLAGS":      "optimize.proguard_flags",
  76.                         "LOCAL_PROGUARD_FLAG_FILES": "optimize.proguard_flags_files",
  77.                         // These will be rewritten to libs/static_libs by bpfix, after their presence is used to convert
  78.                         // java_library_static to android_library.
  79.                         "LOCAL_SHARED_ANDROID_LIBRARIES": "android_libs",
  80.                         "LOCAL_STATIC_ANDROID_LIBRARIES": "android_static_libs",
  81.                         "LOCAL_ADDITIONAL_CERTIFICATES":  "additional_certificates",
  82.                         // Jacoco filters:
  83.                         "LOCAL_JACK_COVERAGE_INCLUDE_FILTER": "jacoco.include_filter",
  84.                         "LOCAL_JACK_COVERAGE_EXCLUDE_FILTER": "jacoco.exclude_filter",
  85.                         "LOCAL_FULL_LIBS_MANIFEST_FILES": "additional_manifests",
  86.                         // will be rewrite later to "license_kinds:" by byfix
  87.                         "LOCAL_LICENSE_KINDS": "android_license_kinds",
  88.                         // will be removed later by byfix
  89.                         // TODO: does this property matter in the license module?
  90.                         "LOCAL_LICENSE_CONDITIONS": "android_license_conditions",
  91.                         "LOCAL_GENERATED_SOURCES":  "generated_sources",
  92.                 })
  93.         addStandardProperties(bpparser.BoolType,
  94.                 map[string]string{
  95.                         // Bool properties
  96.                         "LOCAL_IS_HOST_MODULE":             "host",
  97.                         "LOCAL_CLANG":                      "clang",
  98.                         "LOCAL_FORCE_STATIC_EXECUTABLE":    "static_executable",
  99.                         "LOCAL_NATIVE_COVERAGE":            "native_coverage",
  100.                         "LOCAL_NO_CRT":                     "nocrt",
  101.                         "LOCAL_ALLOW_UNDEFINED_SYMBOLS":    "allow_undefined_symbols",
  102.                         "LOCAL_RTTI_FLAG":                  "rtti",
  103.                         "LOCAL_PACK_MODULE_RELOCATIONS":    "pack_relocations",
  104.                         "LOCAL_TIDY":                       "tidy",
  105.                         "LOCAL_USE_CLANG_LLD":              "use_clang_lld",
  106.                         "LOCAL_PROPRIETARY_MODULE":         "proprietary",
  107.                         "LOCAL_VENDOR_MODULE":              "vendor",
  108.                         "LOCAL_ODM_MODULE":                 "device_specific",
  109.                         "LOCAL_PRODUCT_MODULE":             "product_specific",
  110.                         "LOCAL_PRODUCT_SERVICES_MODULE":    "product_specific",
  111.                         "LOCAL_SYSTEM_EXT_MODULE":          "system_ext_specific",
  112.                         "LOCAL_EXPORT_PACKAGE_RESOURCES":   "export_package_resources",
  113.                         "LOCAL_PRIVILEGED_MODULE":          "privileged",
  114.                         "LOCAL_AAPT_INCLUDE_ALL_RESOURCES": "aapt_include_all_resources",
  115.                         "LOCAL_DONT_MERGE_MANIFESTS":       "dont_merge_manifests",
  116.                         "LOCAL_USE_EMBEDDED_NATIVE_LIBS":   "use_embedded_native_libs",
  117.                         "LOCAL_USE_EMBEDDED_DEX":           "use_embedded_dex",
  118.                         "LOCAL_DEX_PREOPT":                  "dex_preopt.enabled",
  119.                         "LOCAL_DEX_PREOPT_APP_IMAGE":        "dex_preopt.app_image",
  120.                         "LOCAL_DEX_PREOPT_GENERATE_PROFILE": "dex_preopt.profile_guided",
  121.                         "LOCAL_PRIVATE_PLATFORM_APIS": "platform_apis",
  122.                         "LOCAL_JETIFIER_ENABLED":      "jetifier",
  123.                         "LOCAL_IS_UNIT_TEST": "unit_test",
  124.                         "LOCAL_ENFORCE_USES_LIBRARIES": "enforce_uses_libs",
  125.                         "LOCAL_CHECK_ELF_FILES": "check_elf_files",
  126.                 })
  127. }
  128. //(2)编译的模块类型定义
  129. var moduleTypes = map[string]string{
  130.         "BUILD_SHARED_LIBRARY":        "cc_library_shared",
  131.         "BUILD_STATIC_LIBRARY":        "cc_library_static",
  132.         "BUILD_HOST_SHARED_LIBRARY":   "cc_library_host_shared",
  133.         "BUILD_HOST_STATIC_LIBRARY":   "cc_library_host_static",
  134.         "BUILD_HEADER_LIBRARY":        "cc_library_headers",
  135.         "BUILD_EXECUTABLE":            "cc_binary",
  136.         "BUILD_HOST_EXECUTABLE":       "cc_binary_host",
  137.         "BUILD_NATIVE_TEST":           "cc_test",
  138.         "BUILD_HOST_NATIVE_TEST":      "cc_test_host",
  139.         "BUILD_NATIVE_BENCHMARK":      "cc_benchmark",
  140.         "BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",
  141.         "BUILD_JAVA_LIBRARY":             "java_library_installable", // will be rewritten to java_library by bpfix
  142.         "BUILD_STATIC_JAVA_LIBRARY":      "java_library",
  143.         "BUILD_HOST_JAVA_LIBRARY":        "java_library_host",
  144.         "BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
  145.         "BUILD_PACKAGE":                  "android_app",
  146.         "BUILD_RRO_PACKAGE":              "runtime_resource_overlay",
  147.         "BUILD_CTS_EXECUTABLE":          "cc_binary",               // will be further massaged by bpfix depending on the output path
  148.         "BUILD_CTS_SUPPORT_PACKAGE":     "cts_support_package",     // will be rewritten to android_test by bpfix
  149.         "BUILD_CTS_PACKAGE":             "cts_package",             // will be rewritten to android_test by bpfix
  150.         "BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix
  151.         "BUILD_CTS_HOST_JAVA_LIBRARY":   "cts_host_java_library",   // will be rewritten to java_library_host by bpfix
  152. }
  153. //(3)预编译类型定义
  154. var prebuiltTypes = map[string]string{
  155.         "SHARED_LIBRARIES": "cc_prebuilt_library_shared",
  156.         "STATIC_LIBRARIES": "cc_prebuilt_library_static",
  157.         "EXECUTABLES":      "cc_prebuilt_binary",
  158.         "JAVA_LIBRARIES":   "java_import",
  159.         "APPS":             "android_app_import",
  160.         "ETC":              "prebuilt_etc",
  161. }
复制代码
整个android.go紧张转换就看上面三个部门:func init() 、var moduleTypes、var prebuiltTypes。
这里就不逐一先容了,用到的时间举行对比就行了。
android.go文件全部内容检察:
[http://aospxref.com/android-13.0.0_r3/xref/build/soong/androidmk/androidmk/android.go](
五、其他

1、其他文章 Android.mk和bp 对应关系、转换博客先容:


2、以个人的明白来看,为啥要把Android.mk都更换成Android.bp:

  1. (1)从上面代码示例看Android.mk代码格式是比较混乱的,Android.bp代码格式清晰明了;
  2. (2)Android.mk的定义都是大写的,比较塑料,Android.bp的定义都是小写的通俗易懂;
  3. (3)加快代码加载问题,Android.mk 的代码格式比 xml格式还老一些,是要优化掉了。
  4. 写过数据文件加载的都知道,json解析比xml解析和使用更加方便快捷,并且数据结构也更加清晰明了,
  5. 何况比xml还旧的代码格式,更新换代是一个必然的结果。
  6. 其他原因也是有的,这里只是一点点理解而已
复制代码
3、Android.mk和Android.bp同时存在一个目次的编译环境

当一个Android目次同时包罗Android.mk和Android.bp文件时,Android编译体系会主动检测到这两个构建文件,并根据差别的规则举行编译。
  1. 1. 首先,Android编译系统会检测目录中是否存在`Android.bp`文件,如果存在,则优先使用`Android.bp`进行构建。
  2. 2. 如果目录中不存在`Android.bp`文件,或者存在但是有语法错误,Android编译系统会尝试使用`Android.mk`进行构建。
  3. 3. 如果目录中同时存在有效的`Android.bp`和`Android.mk`文件,Android编译系统会根据以下规则选择使用哪个构建文件:
  4.   - 如果使用者在构建命令中指定了特定的构建文件(例如,通过`mm`命令指定`Android.mk`),则系统会使用指定的构建文件。
  5.   - 如果没有指定特定的构建文件,Android编译系统会根据优先级选择使用`Android.bp`或`Android.mk`进行构建。一般来说,`Android.bp`的优先级更高,因为它是新的构建文件格式。
复制代码
综上所述,如果你的目次同时包罗Android.mk和Android.bp文件,Android编译体系会优先使用Android.bp举行构建,如果Android.bp不存在或有错误,才会回退到使用Android.mk举行构建。但是可以通过下令行参数显式指定使用哪个构建文件举行编译。
4、Android.mk转换成Android.bp的限定

  1. (1)Android源码可以使用androidmk工具把Android.mk转换成Android.bp文件
  2. (2)Android.bp只是一个配置文件,而Android.mk是可以执行一些控制逻辑,所有有些语句是无法转换的
  3. 比如文件的遍历,条件判断等等代码是无法在Android.bp中执行的
  4. (3)Android.mk到Android.bp有部分属性是找不到对应关系的,有些是暂时无法替换的,比如:LOCAL_PREBUILT_JNI_LIBS
  5. 主要是很多so编译相关的属性,在bp中都还未完善。
复制代码
5、Android.mk转换成Android.bp履历小结

  1. (1)如果是比较简单的代码,直接使用android.go文件对比转换即可
  2. (2)可以参考androidmk工具转换的Android.bp文件,代码会更加简洁
  3. 因为转换后,系统默认的变量,会被自动省略掉,所以看起来会简洁很多;
  4. 但是也不能完全依赖androidmk工具,即使工具有时候也会出现不准确的情况,出现编译报错的情况,可能需要手动适配修改;
  5. (3)Android 所有新版本都是兼容 Android.mk 文件编译的
  6. 如果是比较复杂的Android.mk并且涉及到so文件依赖的脚步需要移植到新版本,一般直接复制过去使用就行,因为不一定能修改成Android.bp。
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表