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

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

文章目录

  • Android.mk和Android.bp的区别和转换详解
    • 一、前言
    • 二、Android.mk和Android.bp的联系
    • 三、Android.mk和Android.bp的区别
      • 1、语法:
      • 2、灵活性:
      • 3、版本兼容性:
      • 4、向后兼容性:
      • 5、编译区别:
    • 四、Android.mk和Android.bp的转换
      • 1、androidmk源码
      • 2、源码环境使用命令把Android.mk转换成Android.bp
        • (1)具体命令是:
        • (2)具体操作
        • (3)转换示例
        • (4)Android.mk无法编译成Android.bp举例
          • ①比如Android.mk里面的shell语句命令,Android.bp是无法实现的:
          • ②比如Android.mk中的 LOCAL_PREBUILT_JNI_LIBS 属性是无法转换到Android.bp,直接转换会报
      • 3、Android.mk转换成Android.bp主要内容
    • 五、其他
      • 1、其他文章 Android.mk和bp 对应关系、转换博客介绍:
      • 2、以个人的理解来看,为啥要把Android.mk都替换成Android.bp:
      • 3、Android.mk和Android.bp同时存在一个目录的编译情况
      • 4、Android.mk转换成Android.bp的限制
      • 5、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详解+入门必备:

https://blog.csdn.net/wenzhi20102321/article/details/135631544

Android.bp详解+入门必备

https://blog.csdn.net/wenzhi20102321/article/details/135631671

从实际开发中接触到的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、编译区别:

**ninja**是一个编译框架,会根据相应的ninja格式的配置文件进行编译,但是ninja文件一般不会手动修改,而是通过将 Android.bp文件转换成ninja格文件来编译1**Android.bp**是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写2. **Soong**类似于之前的Makefile编译系统的核心,负责提供Android.bp语义解析,并将之转换成Ninja文件。Soong还会编译生成一个androidmk命令,用于将Android.mk文件转换为Android.bp文件3. **Blueprint**是生成、解析Android.bp的工具,是Soong的一部分。Soong负责Android编译而设计的工具,而Blueprint只是解析文件格式,Soong解析内容的具体含义。Blueprint和Soong都是由Golang写的项目,从Android 7.0,prebuilts/go/目录下新增Golang所需的运行环境,在编译时使用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 的对应关系

比如:

func init() {addStandardProperties(bpparser.StringType,//前面的是Android.mk的关键字,后面是Android.bp 的关键字map[string]string{"LOCAL_MODULE":                  "name", //mk文件和bp文件,模块名称定义的关键字"LOCAL_CERTIFICATE":             "certificate",//是否系统签名"LOCAL_JAVA_LANGUAGE_VERSION":   "java_version","LOCAL_INSTRUMENTATION_FOR":     "instrumentation_for","LOCAL_MANIFEST_FILE":           "manifest",
...})

android.go文件全部内容查看:

http://aospxref.com/android-13.0.0_r3/xref/build/soong/androidmk/androidmk/android.go

2、源码环境使用命令把Android.mk转换成Android.bp

(1)具体命令是:
androidmk Android.mk > Android.bp 
(2)具体操作

androidmk 是系统编译生成的工具,androidmk 工具可以将 Android.mk 文件 转换为 Android.bp 文件,

如果编译过的源码,可以进行如下操作使用命令把Android.mk 文件 转换为 Android.bp 文件:

(1)找到androidmk工具文件,cd到对该目录下,我这里是:release/out/host/linux-x86/bin
(2)把需要转换的Android.mk文件复制到 androidmk的bin目录下
(3)执行命令:androidmk Android.mk > Android.bp 
就可以在bin目录下看到一个新生成的Android.bp文件了,这个就是系统工具转换的Android.bp文件。亲测有效。
(3)转换示例

Android.mk 示例代码

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)
LOCAL_MODULE := MyFileManager
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := MyFileManager.apkLOCAL_PRIVILEGED_MODULE := true
LOCAL_CERTIFICATE := platforminclude $(BUILD_PREBUILT)

Android.bp转换后的代码

android_app_import {name: "MyFileManager", //(1)编译模块名称certificate: "platform", //(2)系统签名privileged: true, //(3)是否生成到priv-app目录apk: "MyFileManager.apk", //(4)加载需要编译的apk名称}

上面代码的转换就是通过 androidmk工具进行转换的。

这里可以看到,Android.bp更加简洁明了,并且省略了一些非必要的信息。

上面转换的信息是可以在android.go中看出对应关系,具体对应关系查找:

func init() {//string 类型的关键字addStandardProperties(bpparser.StringType,//前面的是Android.mk的关键字,后面是Android.bp 的关键字map[string]string{"LOCAL_MODULE":                  "name", //(1)mk文件和bp文件,模块名称定义的关键字"LOCAL_CERTIFICATE":             "certificate",//(2)系统签名"LOCAL_JAVA_LANGUAGE_VERSION":   "java_version","LOCAL_INSTRUMENTATION_FOR":     "instrumentation_for","LOCAL_MANIFEST_FILE":           "manifest",
...})//boolean 类型关键字addStandardProperties(bpparser.BoolType,map[string]string{// Bool properties"LOCAL_IS_HOST_MODULE":             "host","LOCAL_CLANG":                      "clang","LOCAL_PRIVILEGED_MODULE":          "privileged", //(3)是否生成在priv-app目录。。。}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", //(4)加载需要编译的apk名称"ETC":              "prebuilt_etc",
}func prebuiltClass(ctx variableAssignmentContext) error {class := ctx.mkvalue.Value(ctx.file.scope)if _, ok := prebuiltTypes[class]; ok {ctx.file.scope.Set("BUILD_PREBUILT", class)} else {// reset to defaultctx.file.scope.Set("BUILD_PREBUILT", "prebuilt")}return nil
}

但是从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是无法实现的:
APK_FILE_PATH := $(shell cd $(LOCAL_PATH)/$(1) ; \find ./ -maxdepth 1  -name "*.apk" -and -not -name ".*")
LOCAL_SRC_FILES := $(APK_FILE_PATH)

上面的是Android.mk中查找当前目录下的一个以apk命名结尾的文件,并设置成需要编译的apk文件

还有文件复制查找遍历那些语句在Android.bp是无法实现的。

②比如Android.mk中的 LOCAL_PREBUILT_JNI_LIBS 属性是无法转换到Android.bp,直接转换会报

错:

// ANDROIDMK TRANSLATION ERROR: unsupported assignment to LOCAL_PREBUILT_JNI_LIBS

虽然使用androidmk工具转换不了,并且在android.go文件也未查询到对应关系的字符串,

但是通过网上搜索使用 cc_prebuilt_library_shared 模块类型可以替换,转换如下:

//Android.mk中的引用定义
LOCAL_PREBUILT_JNI_LIBS:= \
lib/armeabi-v7a/libvvo.so \
lib/armeabi-v7a/libvff.so \//Android.bp中的引用定义
cc_prebuilt_library_shared {name: "libvvo",srcs: ["lib/armeabi-v7a/libvvo.so"],
}cc_prebuilt_library_shared {name: "libvff",srcs: ["lib/armeabi-v7a/libvff.so"],
}

但是编译发现还是会报错!

FAILED: out/target/product/rk3588_t/obj/SHARED_LIBRARIES/libvvo_intermediates/check_elf_files.timestamp
/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 --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 )"
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)编译的变量属性定义,包括String、列表、Boolean类型,就这三种变量类型,没有什么数字,浮点数那些。
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_CERTIFICATE_LINEAGE":     "lineage","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_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_USES_LIBRARIES":                "uses_libs","LOCAL_OPTIONAL_USES_LIBRARIES":       "optional_uses_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",// will be rewrite later to "license_kinds:" by byfix"LOCAL_LICENSE_KINDS": "android_license_kinds",// will be removed later by byfix// TODO: does this property matter in the license module?"LOCAL_LICENSE_CONDITIONS": "android_license_conditions","LOCAL_GENERATED_SOURCES":  "generated_sources",})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_PRODUCT_SERVICES_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_CHECK_ELF_FILES": "check_elf_files",})
}//(2)编译的模块类型定义
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
}//(3)预编译类型定义
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",
}

整个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 对应关系、转换博客介绍:

https://blog.csdn.net/amin_hui/article/details/116610959

2、以个人的理解来看,为啥要把Android.mk都替换成Android.bp:

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

3、Android.mk和Android.bp同时存在一个目录的编译情况

当一个Android目录同时包含Android.mkAndroid.bp文件时,Android编译系统会自动检测到这两个构建文件,并根据不同的规则进行编译。

1. 首先,Android编译系统会检测目录中是否存在`Android.bp`文件,如果存在,则优先使用`Android.bp`进行构建。
2. 如果目录中不存在`Android.bp`文件,或者存在但是有语法错误,Android编译系统会尝试使用`Android.mk`进行构建。
3. 如果目录中同时存在有效的`Android.bp`和`Android.mk`文件,Android编译系统会根据以下规则选择使用哪个构建文件:- 如果使用者在构建命令中指定了特定的构建文件(例如,通过`mm`命令指定`Android.mk`),则系统会使用指定的构建文件。- 如果没有指定特定的构建文件,Android编译系统会根据优先级选择使用`Android.bp`或`Android.mk`进行构建。一般来说,`Android.bp`的优先级更高,因为它是新的构建文件格式。

综上所述,如果你的目录同时包含Android.mkAndroid.bp文件,Android编译系统会优先使用Android.bp进行构建,如果Android.bp不存在或有错误,才会回退到使用Android.mk进行构建。但是可以通过命令行参数显式指定使用哪个构建文件进行编译。

4、Android.mk转换成Android.bp的限制

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

5、Android.mk转换成Android.bp经验小结


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

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

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

相关文章

【C++修行之道】STL(初识pair、vector)

目录 一、pair 1.1pair的定义和结构 1.2pair的嵌套 1.3pair自带排序规则 1.4代码示例 二、vector 2.1vector的定义和特性 2.2vector的初始化 一维初始化: 2.3vector的常用函数 2.4vector排序去重 排序: 去重: 示例: 一、pair …

CmakeList教程

一、CmakeList介绍: cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。它会通过写的语句自动生成一个MakeFile,从而实现高效编译 二、CmakeList的常用指令 1.指定…

iphone5s基带部分电源部分主主电源供电及

时序: 1.,基带电源的供电,基带电源也叫pmu。 首先时序图说电池提供供电,电池是J6接口,视频习惯把接口称之为座子。查U2_RF芯片,发现供电信号为PP_BATT_VCC_CONN,但是没查到跟电池座子有关系,电池座子写的是…

回溯算法篇-01:全排列

力扣46:全排列 题目分析 这道题属于上一篇——“回溯算法解题框架与思路”中的 “元素不重复不可复用” 那一类中的 排列类问题。 我们来回顾一下当时是怎么说的: 排列和组合的区别在于,排列对“顺序”有要求。比如 [1,2] 和 [2,1] 是两个不…

电脑磁盘格式化了怎么恢复里面文件?多个方法任你选

在日常生活中,我们可能会遇到由于误操作、病毒攻击等原因导致电脑磁盘被格式化的情况。一旦发生这种情况,我们可能会失去重要的文件,给工作和生活带来很大的困扰。但是,不必过于担心,本文将为您详细介绍如何在电脑磁盘…

Python 什么是点积注意力机制;点击注意力机制代码实现;Dot-Product Attention代码实战;超详细代码实现点积注意力

1.点积注意力机制简介 点积注意力机制(Dot-Product Attention)是一种常用的注意力机制之一,通常与Seq2Seq模型中的自注意力(Self-Attention)机制一起使用。它用于计算查询(Query)和键&#xff0…

Buildroot显示uboot logo

根据之前的开机现象,uboot部分没有开机logo 1、Makefile配置 查看一下u-boot/tools/Makefile是否都有如下配置 # Enable all the config-independent tools ifneq ($(HOST_TOOLS_ALL),) CONFIG_LCD_LOGO y CONFIG_CMD_LOADS y CONFIG_CMD_NET y CONFIG_XWAY_SW…

一.初识Linux 1-3操作系统概述Linux初识虚拟机介绍

目录 一.初识Linux 1.操作系统概述 计算机组成 硬件: 软件: 操作系统: 操作系统工作流程 操作系统作用 常见的操作系统 PC端: 移动端:(掌上操作系统) 一.初识Linux 2.Linux初识 linu…

分布式websocket即时通信(IM)系统保证消息可靠性【第八期】

b站上面本期视频版本,观看视频食用更佳!点击即可跳转,找不到视频可以直接搜索我 目前叫 呆呆呆呆梦 目前已经写的文章有。并且有对应视频版本。 git项目地址 【IM即时通信系统(企聊聊)】点击可跳转 sprinboot单体项目升级成sprin…

Ubuntu用gparted重新分配空间

ubuntu系统使用过程中安装系统时预先留的空间不够使用怎么办? 这么办! 首先 使用df -h 查看当前空间使用情况 已经分配的空间重新规划 ? 先将已分配的空间中的多余空间分离出来; 假设我想将挂载点/home下的一部分空间分给挂载…

《WebKit 技术内幕》学习之八(1):硬件加速机制

《WebKit 技术内幕》之八(1):硬件加速机制 1 硬件加速基础 1.1 概念 这里说的硬件加速技术是指使用GPU的硬件能力来帮助渲染网页,因为GPU的作用主要是用来绘制3D图形并且性能特别好,这是它的专长所在,它…

matlab模型变量一般说明,标定和显示量,以及产生a2l文件,自动填充a2l地址,并使用标定工具ati进行标定(推荐重要)

注意我是用的是matlab2019b 1,输入标定量,使用constant,用cal函数包裹 2,输出显示量,在划线上标注,然后用display函数包裹, 第一步和第二步完成以后,生产标定量a2l 3,输入…

常规二分查找中遇到的问题

以前我们写二分查找的时候&#xff0c;是这么写的&#xff1a; public static int binarySearch2(int []a,int target){int i0,ja.length-1;while(i<j){int mid(ij)/2;if(a[mid]target){return mid;}else if(a[mid]<target){imid1;}else {jmid-1;}}return -1;} 这么写&…

conda环境下OSError: We couldn‘t connect to ‘https://huggingface.co‘问题解决

1 问题描述 (dreamtalk) [rootlocalhost dreamtalk]# python inference_for_demo_video.py --wav_path data/audio/acknowledgement_english.m4a --style_clip_path data/style_clip/3DMM/M030_front_neutral_level1_001.mat --pose_path data/pose/RichardShelby_front_neutr…

【分布式技术专题】「分布式技术架构」 探索Tomcat技术架构设计模式的奥秘(Server和Service组件原理分析)

探索Tomcat技术架构设计模式的奥秘 Tomcat系统架构分析Tomcat 整体结构Tomcat总体结构图以 Service 作为“婚姻”1) Service 接口方法列表 2) StandardService 的类结构图方法列表 3) StandardService. SetContainer4) StandardService. addConnector 以 Server 为“居”1) Ser…

性能优化-OpenCL 介绍

「发表于知乎专栏《移动端算法优化》」 本文首先对 GPU 进行了概述&#xff0c;然后着重地对移动端的 GPU 进行了分析&#xff0c;随后我们又详细地介绍了 OpenCL 的背景知识和 OpenCL 的四大编程模型。希望能帮助大家更好地进行移动端高性能代码的开发。 &#x1f3ac;个人简介…

OpenCV——Scharr边缘检测

目录 一、Scharr算法1、算法概述2、主要函数 二、C代码三、python代码四、结果展示1、灰度图2、X方向一阶边缘2、Y方向一阶边缘3、整幅图像的一阶边缘 五、相关链接 OpenCV——Scharr边缘检测由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&…

MODNet 剪枝再思考: 优化计算量的实验历程分享

目录 1 写在前面 2 模型分析 3 遇到问题 4 探索实验一 4.1 第一部分 4.2 第二部分 Error 1 Error 2 4.3 实验结果 ①参数量与计算量 ②模型大小 ③推理时延 5 探索实验二 5.1 LR Branch 5.2 HR Branch 5.2.1 初步分析 5.2.2 第一部分 enc2x 5.2.3 第二部分 en…

【算法分析与设计】二叉树的层序遍历

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xf…

2017年认证杯SPSSPRO杯数学建模B题(第二阶段)岁月的印记全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 B题 岁月的印记 原题再现&#xff1a; 对同一个人来说&#xff0c;如果没有过改变面容的疾病、面部外伤或外科手术等经历&#xff0c;年轻和年老时的面容总有很大的相似性。人们在生活中也往往能够分辨出来两张不同年龄段的照片是不是同一个人…