当前位置:   article > 正文

Android.bp入门指南之浅析Android.bp语法

android.bp语法

前言

  在前面的章节初始Android.bp里面咱们对Android.bp有了一个基本的认识,知道了它是干啥的。算了吗,仍是再介绍一遍它吗!Android.bp是用来替换Android.mk的配置文件,它使用Blueprint框架来解析。Blueprint是生成、解析Android.bp的工具,是Soong的一部分。Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。Android.bp文件用相似JSON的简洁声明来描述须要构建的模块。介绍了一番是否是仍是有点懵逼,没有关系,在这篇文章里面,我将介绍Android.bp文件的基本语法规则,而后附上实例加以说明。java

注意:关于Android.bp的权威解释能够参见 android.bp权威文档,不过是全英文的。android

一. Android.bp语法初识

Android.bp是一门实战性的东西,光说不练没有啥用,说再多不如直接开练来得舒服。那就直接开始手撕实例了,让咱们开战吗!web

  1. cc_library_shared { //编译成动态库,相似于Android.mk中的BUILD_SHARED_LIBRARY
  2. name: "libbluetooth_jni", //编译出的模块的名称,相似于Android.mk中的LOCAL_MODULE
  3. srcs: [ //源文件,相似于Android.mk中的LOCAL_SRC_FILES
  4. "com_android_bluetooth_btservice_AdapterService.cpp",
  5. "com_android_bluetooth_hfp.cpp",
  6. "com_android_bluetooth_hfpclient.cpp",
  7. "com_android_bluetooth_a2dp.cpp",
  8. "com_android_bluetooth_a2dp_sink.cpp",
  9. "com_android_bluetooth_avrcp.cpp",
  10. "com_android_bluetooth_avrcp_controller.cpp",
  11. "com_android_bluetooth_hid.cpp",
  12. "com_android_bluetooth_hidd.cpp",
  13. "com_android_bluetooth_hdp.cpp",
  14. "com_android_bluetooth_pan.cpp",
  15. "com_android_bluetooth_gatt.cpp",
  16. "com_android_bluetooth_sdp.cpp",
  17. ],
  18. include_dirs: [ //用户指定的头文件查找路径,相似于Android.mk中的LOCAL_C_INCLUDES
  19. "libnativehelper/include/nativehelper",
  20. "system/bt/types",
  21. ],
  22. shared_libs: [ //编译所依赖的动态库,相似于Android.mk中的LOCAL_SHARED_LIBRARIES
  23. "libandroid_runtime",
  24. "libchrome",
  25. "libnativehelper",
  26. "libcutils",
  27. "libutils",
  28. "liblog",
  29. "libhardware",
  30. ],
  31. static_libs: [ //编译所依赖的静态库,相似于Android.mk中的LOCAL_STATIC_LIBRARIES
  32. "libbluetooth-types",
  33. ],
  34. cflags: [ ///编译flag,相似于Android.mk中的LOCAL_CFLAGS
  35. "-Wall",
  36. "-Wextra",
  37. "-Wno-unused-parameter",
  38. ],
  39. }

1.1 模块

从前面的列子能够看出定义一个模块从模块的类型开始,模块有不一样的类型,如前面例子中的cc_library_shared,固然类型还有不少种,譬如cc_binary android_app cc_library_static等等。模块包含一些属性格式为“property-name:property-value”,其中name属性必须指定,其属性值必须是全局惟一的。chrome

其中默认模块可用于在多个模块中重复相同的属性,是否是用文字表达很模糊,好吗,上实例:boots

  1. cc_defaults {// //默认模块名称
  2. name: "default_module",
  3. shared_libs: ["libz"],
  4. stl: "none",
  5. }
  6. cc_binary {
  7. name: "test1",
  8. defaults: ["default_module"], //引用默认模块名称
  9. srcs: ["src/test/test.c"],
  10. }

srcs 属性以字符串列表的形式指定用于编译模块的源文件。您可使用模块引用语法 “:” 来引用生成源文件的其余模块的输出,如 genrule 或 filegroup。是否是感受一头雾水,好吗,仍是上实例说明:bash

  1. ~/ssd/qcom_64/msm8953-9$ cd frameworks/base/core/java/
  2. ~/ssd/qcom_64/msm8953-9/frameworks/base/core/java$ vi Android.bp
  3. filegroup {
  4. name: "IKeyAttestationApplicationIdProvider.aidl",
  5. srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"],
  6. }
  7. filegroup {
  8. name: "IDropBoxManagerService.aidl",
  9. srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"],
  10. ~/ssd/qcom_64/msm8953-9/frameworks/base/core$ cd ..
  11. ~/ssd/qcom_64/msm8953-9/frameworks/base$ vi libs/services/Android.bp
  12. cc_library_shared {
  13. name: "libservices",
  14. srcs: [
  15. ":IDropBoxManagerService.aidl",
  16. "src/os/DropBoxManager.cpp",
  17. "src/os/StatsDimensionsValue.cpp",
  18. "src/os/StatsLogEventWrapper.cpp",
  19. ],
  20. shared_libs: [
  21. "libbinder",
  22. "liblog",
  23. "libcutils",
  24. "libutils",
  25. ],

1.2 变量

咱们知道Android.mk中能够定义变量,固然做为新编译系统中替代Android.mk的Android.bp也是必定存在,更加况且Android.mk还能够必定条件的转换成Android.bp。app

变量范围限定为声明它们的文件的其他部分,可使用 “=” 号赋值, 可是不能使用 “:=” 赋值。变量是不可变的,但有一个例外它们能够附上+= 赋值,但仅在变量被引用以前。框架

  1. error: packages/apps/Bluetooth/jni/Android.bp:2:15: expected "=" or "+=" or "{" or "(", found ":"
  2. ninja: error: rebuilding 'out/soong/.minibootstrap/build.ninja': subcommand failed
  3. 10:28:15 soong failed with: exit status 1

下面咱们看一下正确使用变量的列子:ide

  1. gzip_srcs = ["src/minigzip.c"],
  2. cc_binary {
  3. name: "gzip",
  4. srcs: gzip_srcs,
  5. shared_libs: ["libz"],
  6. stl: "none",
  7. }

1.3 注释

咱们知道Android.mk中能够进行注释,固然Android.bp里面也能够,Android.mk中使用"#"而后添加注释,Android.bp使用单行注释//和多行注释/* */两种方式。svg

1.4类型

具体支持如下几种类型:

  • Bool(true or false)

  • Integers(int)

  • Strings("string")

  • Listsof strings (["string1", "string2"])

  • Maps({key1: "value1", key2: ["value2"]})

1.5 操做符

String类型、字符串列表类型和Map类型支持操做符“+”。

1.6 支持模块类型

Android.bp能够支持android_app、cc_binary、cc_binary_host等多种类型,具体定义在Android源码的build/soong/androidmk/cmd/androidmk/android.go能够查看,具体以下:

  1. var moduleTypes = map[string]string{
  2. "BUILD_SHARED_LIBRARY": "cc_library_shared",
  3. "BUILD_STATIC_LIBRARY": "cc_library_static",
  4. "BUILD_HOST_SHARED_LIBRARY": "cc_library_host_shared",
  5. "BUILD_HOST_STATIC_LIBRARY": "cc_library_host_static",
  6. "BUILD_HEADER_LIBRARY": "cc_library_headers",
  7. "BUILD_EXECUTABLE": "cc_binary",
  8. "BUILD_HOST_EXECUTABLE": "cc_binary_host",
  9. "BUILD_NATIVE_TEST": "cc_test",
  10. "BUILD_HOST_NATIVE_TEST": "cc_test_host",
  11. "BUILD_NATIVE_BENCHMARK": "cc_benchmark",
  12. "BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",
  13. "BUILD_JAVA_LIBRARY": "java_library",
  14. "BUILD_STATIC_JAVA_LIBRARY": "java_library_static",
  15. "BUILD_HOST_JAVA_LIBRARY": "java_library_host",
  16. "BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
  17. "BUILD_PACKAGE": "android_app",
  18. }

1.7 支持预编译类型

Android.bp能够支持多种预编译类型,具体定义在Android源码的build/soong/androidmk/cmd/androidmk/android.go能够查看,以下图所示:

  1. var prebuiltTypes = map[string]string{
  2. "SHARED_LIBRARIES": "cc_prebuilt_library_shared",
  3. "STATIC_LIBRARIES": "cc_prebuilt_library_static",
  4. "EXECUTABLES": "cc_prebuilt_binary",
  5. "JAVA_LIBRARIES": "prebuilt_java_library",
  6. }

1.8 条件式编译

  1. system/core/libusbhost$ cat Android.bp
  2. cc_library {
  3. name: "libusbhost",
  4. vendor_available: true,
  5. vndk: {
  6. enabled: true,
  7. },
  8. host_supported: true,
  9. srcs: ["usbhost.c"],
  10. cflags: ["-Werror"],
  11. export_include_dirs: ["include"],
  12. target: {
  13. android: { //编译Android上运行的程序
  14. cflags: [
  15. "-g",
  16. "-DUSE_LIBLOG",
  17. ],
  18. shared_libs: ["liblog"],
  19. },
  20. darwin: { //编译darwin上运行的程序
  21. enabled: false,
  22. },
  23. },
  24. }

结语

修行至此,恭喜读者你已经对Android.bp语法有必定了解了,行走江湖是有可能的了,还需多多磨练才行,在后续篇章中让咱们一块儿学习。

写在最后

  各位读者看官朋友们,Android.bp入门指南之浅析Android.bp语法 ,但愿能吸引你,激发你的学习欲望和斗志。在最后麻烦读者朋友们若是本篇对你有帮助,关注和点赞一下,固然若是有错误和不足的地方也能够拍砖。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/221777
推荐阅读
相关标签
  

闽ICP备14008679号