一. Android.bp语法初识

1.1 模块

从前面的列子可以看出定义一个模块从模块的类型开始,模块有不同的类型,如前面例子中的cc_library_shared,当然类型还有很多种,譬如cc_binary、android_app 、cc_library_static等等。模块包含一些属性格式为“property-name:property-value”,其中name属性必须指定,其属性值必须是全局唯一的。

其中默认模块可用于在多个模块中重复相同的属性

cc_defaults {// //默认模块名称

name: "default_module",

shared_libs: ["libz"],

stl: "none",

}

cc_binary {

name: "test1",

defaults: ["default_module"], //引用默认模块名称

srcs: ["src/test/test.c"],

}

srcs 属性以字符串列表的形式指定用于编译模块的源文件。您可以使用模块引用语法 “:” 来引用生成源文件的其他模块的输出,如 genrule 或 filegroup。

实例说明:

~/aosp$ cd frameworks/base/core/java/

~/aosp/frameworks/base/core/java$ vi Android.bp

filegroup {

name: "IKeyAttestationApplicationIdProvider.aidl",

srcs: ["android/security/keymaster/IKeyAttestationApplicationIdProvider.aidl"],

}

filegroup {

name: "IDropBoxManagerService.aidl",

srcs: ["com/android/internal/os/IDropBoxManagerService.aidl"],

~/aosp/frameworks/base/core$ cd ..

~/aosp/frameworks/base$ vi libs/services/Android.bp

cc_library_shared {

name: "libservices",

srcs: [

":IDropBoxManagerService.aidl", //这里引用了上面定义的模板

"src/os/DropBoxManager.cpp",

"src/os/StatsDimensionsValue.cpp",

"src/os/StatsLogEventWrapper.cpp",

],

shared_libs: [

"libbinder",

"liblog",

"libcutils",

"libutils",

]

}

1.2 变量

我们知道Android.mk中可以定义变量,当然作为新编译系统中替代Android.mk的Android.bp也是一定存在,更加何况Android.mk还可以一定条件的转换成Android.bp。

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

error: packages/apps/Bluetooth/jni/Android.bp:2:15: expected "=" or "+=" or "{" or "(", found ":"

ninja: error: rebuilding 'out/soong/.minibootstrap/build.ninja': subcommand failed

10:28:15 soong failed with: exit status 1

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

gzip_srcs = ["src/minigzip.c"],

cc_binary {

name: "gzip",

srcs: gzip_srcs,

shared_libs: ["libz"],

stl: "none",

}

1.3 注释

我们知道Android.mk中可以进行注释,当然Android.bp里面也可以,Android.mk中使用#然后添加注释,Android.bp使用单行注释//和多行注释/* */两种方式。

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可以查看,具体如下:

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",

"BUILD_STATIC_JAVA_LIBRARY": "java_library_static",

"BUILD_HOST_JAVA_LIBRARY": "java_library_host",

"BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",

"BUILD_PACKAGE": "android_app"

}

1.7 支持预编译类型

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

var prebuiltTypes = map[string]string{

"SHARED_LIBRARIES": "cc_prebuilt_library_shared",

"STATIC_LIBRARIES": "cc_prebuilt_library_static",

"EXECUTABLES": "cc_prebuilt_binary",

"JAVA_LIBRARIES": "prebuilt_java_library",

}

1.8 条件式编译

例如:system/core/libusbhost/Android.bp aosp9.0开始

cc_library {

name: "libusbhost",

vendor_available: true,

vndk: {

enabled: true,

},

host_supported: true,

srcs: ["usbhost.c"],

cflags: ["-Werror"],

export_include_dirs: ["include"],

target: {

android: { //编译Android上运行的程序

cflags: [

"-g",

"-DUSE_LIBLOG",

],

shared_libs: ["liblog"],

},

darwin: { //编译darwin上运行的程序

enabled: false,

},

},

}

二. Android.bp 举个例子

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

下面几种库编译类型:

2.1 动态库类型

最终编译为so包

cc_library_shared { //编译成动态库,类似于Android.mk中的BUILD_SHARED_LIBRARY

name: "libbluetooth_jni", //编译出的模块的名称,类似于Android.mk中的LOCAL_MODULE

srcs: [ //源文件,类似于Android.mk中的LOCAL_SRC_FILES

"com_android_bluetooth_btservice_AdapterService.cpp",

"com_android_bluetooth_hfp.cpp",

"com_android_bluetooth_hfpclient.cpp",

"com_android_bluetooth_a2dp.cpp",

"com_android_bluetooth_a2dp_sink.cpp",

"com_android_bluetooth_avrcp.cpp",

"com_android_bluetooth_avrcp_controller.cpp",

"com_android_bluetooth_hid.cpp",

"com_android_bluetooth_hidd.cpp",

"com_android_bluetooth_hdp.cpp",

"com_android_bluetooth_pan.cpp",

"com_android_bluetooth_gatt.cpp",

"com_android_bluetooth_sdp.cpp",

],

include_dirs: [ //用户指定的头文件查找路径,类似于Android.mk中的LOCAL_C_INCLUDES

"libnativehelper/include/nativehelper",

"system/bt/types",

],

shared_libs: [ //编译所依赖的动态库,类似于Android.mk中的LOCAL_SHARED_LIBRARIES

"libandroid_runtime",

"libchrome",

"libnativehelper",

"libcutils",

"libutils",

"liblog",

"libhardware",

],

static_libs: [ //编译所依赖的静态库,类似于Android.mk中的LOCAL_STATIC_LIBRARIES

"libbluetooth-types",

],

cflags: [ ///编译flag,类似于Android.mk中的LOCAL_CFLAGS

"-Wall",

"-Wextra",

"-Wno-unused-parameter",

],

}

**2.2 java库类型: **

最终编译为jar包

java_library { /编译成java库

name: "services",//编译出的模块的名称

dex_preopt: {

app_image: true,

profile: "art-profile",

},

srcs: [ //源文件

"java/**/*.java",

],

// The convention is to name each service module 'services.$(module_name)'

static_libs: [ //编译所依赖的静态库

"services.core",

"services.accessibility",

"services.appwidget",

"services.autofill",

"services.backup",

"services.companion",

"services.coverage",

"services.devicepolicy",

"services.midi",

"services.net",

"services.print",

"services.restrictions",

"services.usage",

"services.usb",

"services.voiceinteraction",

"android.hidl.base-V1.0-java",

],

libs: [

"android.hidl.manager-V1.0-java",

],

// Uncomment to enable output of certain warnings (deprecated, unchecked)

//javacflags: ["-Xlint"],

}

动态库:可以被 install/copy 到应用程序包(apk)

静态库:可以被链接入动态库

name : 模块的名称

src : 模块的源码

include_dirs : 指定的头文件查找路径

shared_libs : 编译时依赖的动态库

static_libs : 编译时依赖的静态库

subdirs : 是一个文件级的顶层属性,指定后会查找次级目录下的Android.bp。

2.3 Andorid应用类型

最终编译为apk包

android_app {

name: "NFC",

srcs: [

"src/**/*.java",

"nci/**/*.java",

":statslog-Nfc-java-gen",

],

platform_apis: true,

certificate: "platform",

jni_libs: ["libsn100nfc_nci_jni"],

libs: ["com.nxp.nfc.nq"],

static_libs: [

"androidx.appcompat_appcompat",

"nearme_nfc",

],

optimize: {

enabled: true,

obfuscate: true,

proguard_flags_files: ["proguard.flags"],

},

}

java_import {

name: "nearme_nfc",

host_supported: true,

jars: [

"libs/env.jar",

],

}

platform_apis : 用 sdk 的 hide 的 api 來编译

certificate : 指定用的是什么签名,如上用的是 platform 签名。

jni_libs : 依赖使用的 JNI 库

libs : 工程中的 libs 库

static_libs : 静态库,其中 nearme_nfc 为下方定义的:java_import

optimize : 压缩配置,enabled 是否开启,obfuscate 是否开启混淆,proguard_flags_files 混淆规则配置文件

host_supported : Android.bp 文件要求每个模块拥有唯一的名称,但每个模块可以内置多种变化,例如可以添加 host_supported: true。

log+android+bp,第二章:Android.bp语法相关推荐

  1. 浅入浅出 Android 安全:第二章 Android Linux 内核层安全

    第二章 Android Linux 内核层安全 来源:Yury Zhauniarovich | Publications 译者:飞龙 协议:CC BY-NC-SA 4.0 作为最广为人知的开源项目之一 ...

  2. 使用java实现面向对象编程第二章_java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1.java关键字 abstract boolean break byte case catch char class const continue default do d ...

  3. JavaSE入门0基础笔记 第二章Java基础语法

    JavaSE入门0基础笔记 第二章Java基础语法 1.运算符 1.1算术运算符 1.1.1运算符和表达式 1.1.2 算术运算符 1.1.3字符的"+"操作 1.1.4 字符串中 ...

  4. 【python第一章 基础捋顺,第二章 python基础语法】

    第一章 基础捋顺,第二章 python基础语法 第一章 基础捋顺 第二章 python基础语法 2.1输入输出 2.2代码注释 2.3代码缩进 2.4命名规范 2.5变量 2.6基本数据类型 2.7数 ...

  5. 第二章:Android之NDK配置与简单使用

    使用Android开发App不只是使用Java,还可以使用C/C++,这就是我们要使用NDK的目的 -- 为了能让Java识别所要调用的C/C++. 第二章 NDK配置与简单使用 前言 对于有过开发跨 ...

  6. Jquery Mobile设计Android通讯录第二章

    本文是jQuery Mobile设计Android通讯录系统教程的第二篇,在上一篇教程中(http://publish.itpub.net/a2011/0517/1191/000001191561.s ...

  7. 第二章 Android内核和驱动程序(转)

    这一章我们来介绍Android系统的核心部分-Android内核.我们说Android系统是基于Linux系统的,最根本的原因就在于Android采用了Linux内核. 2.1 Android内核特性 ...

  8. 尚硅谷Java入门视频教程第二章——Java基本语法

    尚硅谷Java入门视频教程第二章 第一章复习 课后习题 Java语言概述 第2章:Java基本语法 2.1 关键字和保留字 2.2 标识符(Identifier) 2.3 变量 2.3.1 变量基本概 ...

  9. Pro Android 4 第一章 Android 开发平台介绍

    当今这个时代,计算比以往任何一个时代都距离人们更近.各种手持设备已经变身为计算平台.无论是平板和是手机,移动设备凭借其强大的通用计算能力,已经成为真正意义上的个人电脑(PC).所有的传统计算机厂商已经 ...

  10. Android学习第二天-android常用命令

    上一篇文章中,我们重点讲解了adb的常用命令,下面我们一起来看看其它常用的命令 2 android 2.1 查看机器上所有已经安装的Android版本和AVD设备 2.1.1查看机器上已经安装的AVD ...

最新文章

  1. 单片机如何使用?51单片机C语言编程实例有哪些?
  2. oracle中的连接字符串
  3. HTML图片热区map area的用法(转)
  4. 分享android开发过程中用到的一些开源框架
  5. JVM:类加载机制之类加载过程
  6. 学长毕业日记 :本科毕业论文写成博士论文的神操作
  7. mysql执行查询出来的数据_F#连接到在线MySQL数据库执行查询
  8. C#中如何动态加载DockPanel
  9. hdu 4336 Card Collector 容斥原理 多校联合赛(四) 第六题
  10. Julia: LaTeX 符号
  11. Android系统Google TTS 语音数据包安装步骤
  12. 一个 C盘搬家 方式.Chrome搬家到D盘
  13. GD32VF103(riscv)与STM32F103性能对比
  14. [转]富人的28个理财习惯
  15. 史玉柱的“圈钱”神话3
  16. qq,微信抓句柄发送信息
  17. 虚拟变量陷阱原理及算例
  18. .gitignore详解 copy by 博客园-gt;沙耶
  19. Copy On Write机制了解一下
  20. 洛谷P3373线段树2

热门文章

  1. linux arena参数设置,topcoder Arena配置及基本使用方法
  2. hashcat破解wifi密码(kali)
  3. 中国消费者信心指数连月下跌...
  4. 51单片机的GPS公交车自动报站系统设计
  5. 如何用UE4制作2D游戏文档(二)——资源篇
  6. UEFI和Legacy的区别与系统支持 (图文详解)
  7. 国内外设计及素材站[转载]
  8. iPhone无法连接电脑原因分析及解决
  9. 目标检测经典论文——Fast R-CNN论文翻译(中英文对照版):Fast R-CNN(Ross Girshick, Microsoft Research(微软研究院))
  10. heart of sword(浪客剑心主题曲)铃声 heart of sword(浪客剑心...