文章目录
- Android.bp起源
- Android.bp文件结构
- 如何编写Android.bp文件
- 实例详解
- 实例1
- 实例2
- 常见问题解答
- 1. 如何确定使用哪种模块类型?
- 2. 如何指定模块的依赖项?
- 其他疑问可参考官方文档
参考文章:Android.bp 语法和使用
Android.bp起源
早期的Android系统采用的是Makefile(Android.mk)作为其构建系统。这是一种广泛应用于Unix和Linux环境中的构建工具,它依赖于一系列以文本形式编写的指令(称为Makefiles)来自动构建程序。
然而,随着Android项目的规模逐渐扩大,Makefile开始显得不够灵活,而且构建速度相对较慢。特别是在处理复杂的依赖关系和条件编译时,Makefile的语法也显得过于复杂和笨重。
因此,Google决定开发一个新的构建系统——Soong,它使用Go语言编写,专门针对Android项目进行了优化。Soong引入了一种新的配置文件格式:Blueprint,即我们现在所说的Android.bp。
Android.bp是Blueprint配置文件的一种特殊形式,专门用于定义Android源代码树中的构建目标。Blueprint最初是由Google为其Soong构建系统开发的,并在Android Nougat(7.0)版本中首次引入。
Blueprint的设计理念是简单、易读、易写,它基于声明式语法,只需要描述要做什么,而不需要指定如何做。这使得配置文件更加简洁,便于开发者理解和维护。
Android.bp文件采用类似JSON的语法,但更为简洁。它主要包括模块类型、模块名称和模块属性等部分,用于定义如何构建一个模块。
自从引入Android.bp文件以来,Android的构建过程已经变得更加简单和高效。Android.bp提供了一种灵活的方式来配置构建参数,支持各种不同类型的构建目标,如二进制文件、库文件、测试用例等。
同时,由于Android.bp文件的语法简单明了,新手开发者也能快速上手。对于大型项目来说,使用Android.bp可以显著提升构建性能,减少构建时间,提高开发效率。
Android.bp文件结构
Android.bp文件通常包含以下部分:
-
模块类型:如
cc_binary
,cc_library
等,定义了模块的类型。 -
模块名称:通过
name
字段定义,是模块的唯一标识。 -
模块属性:这些属性可用于控制模块的构建行为。例如,
srcs
属性指定了源代码文件,deps
属性则指定了模块的依赖项。
如何编写Android.bp文件
一个基本的Android.bp文件可能看起来像这样:
cc_binary {
name: "my_module",
srcs: ["my_module.c"],
deps: ["my_dependency"],
}
在这个例子中,cc_binary
是模块类型,表示要构建的是一个C/C++可执行文件。name
属性定义了模块名称,srcs
属性指定了源代码文件,而deps
属性则列出了依赖的模块。
实例详解
实例1
下面是一个更复杂的Android.bp文件示例,它涵盖了更多模块属性:
cc_library {
name: "libmylibrary",
srcs: ["my_file.cpp"],
cflags: ["-Wall", "-Werror"],
export_include_dirs: ["include"],
static_libs: ["libmystaticlib"],
shared_libs: ["libmysharedlib"],
}
在这个例子中,cflags
属性用于指定编译器标志,export_include_dirs
属性定义了其他模块可以访问的头文件目录,而static_libs
和shared_libs
属性则分别列出了静态库和共享库的依赖项。
实例2
//
// Copyright (C) 2008 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// This makefile supplies the rules for building a library of JNI code for
// use by our example of how to bundle a shared library with an APK.
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
cc_library_shared {
name: "libsimplejni",
// All of the source files that we will compile.
srcs: ["native.cpp"],
// All of the shared libraries we link against.
shared_libs: ["liblog"],
// No static libraries.
static_libs: [],
cflags: [
"-Wall",
"-Werror",
],
header_libs: ["jni_headers"],
stl: "none",
sdk_version: "current",
}
这是一个用于构建 Android 平台上 JNI (Java Native Interface) 代码库的 android.bp 文件。Android.bp 是 Android 的构建系统 Soong 使用的脚本语言,用于描述如何构建源代码。
以下是各个部分的解读:
-
Copyright
和License
部分:此部分指定了此文件的版权信息和许可证信息,说明该文件遵循 Apache License 2.0 许可证。 -
package
部分:此处指定了默认适用的许可证,即 Android-Apache-2.0。 -
cc_library_shared
部分:定义了一个名为 “libsimplejni” 的共享 C/C++ 库。-
name: "libsimplejni"
:定义了库的名称为 libsimplejni。 -
srcs: ["native.cpp"]
:要编译的源文件列表,这里只有一个文件 “native.cpp”。 -
shared_libs: ["liblog"]
:要链接的共享库列表,这里只链接了一个名为 “liblog” 的库。 -
static_libs: []
:静态库列表为空,表示没有需要链接的静态库。 -
cflags: ["-Wall", "-Werror"]
:要传递给 C/C++ 编译器的选项,“-Wall” 开启所有警告,“-Werror” 将所有警告视为错误。 -
header_libs: ["jni_headers"]
:头文件库列表,包含了 “jni_headers”。 -
stl: "none"
:指定不使用任何 STL (Standard Template Library) 库。 -
sdk_version: "current"
:指定了 SDK 版本为当前版本。
-
常见问题解答
1. 如何确定使用哪种模块类型?
模块类型取决于你要构建的项目。例如,如果你正在构建一个C/C++的可执行文件,应该使用cc_binary
;如果你正在构建一个Java库,应该使用java_library
。
2. 如何指定模块的依赖项?
你可以在deps
属性中列出所有直接依赖的模块名称。Soong构建系统将自动处理这些依赖项,并确保在构建当前模块之前先构建它们。
其他疑问可参考官方文档
Android官方文档