• Android 安卓 Soong构建系统——Blueprint Android.bp配置文件解析



    参考文章: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文件通常包含以下部分:

    1. 模块类型:如cc_binary, cc_library等,定义了模块的类型。

    2. 模块名称:通过name字段定义,是模块的唯一标识。

    3. 模块属性:这些属性可用于控制模块的构建行为。例如,srcs属性指定了源代码文件,deps属性则指定了模块的依赖项。


    如何编写Android.bp文件

    一个基本的Android.bp文件可能看起来像这样:

    cc_binary {
        name: "my_module",
        srcs: ["my_module.c"],
        deps: ["my_dependency"],
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这个例子中,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"],
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这个例子中,cflags属性用于指定编译器标志,export_include_dirs属性定义了其他模块可以访问的头文件目录,而static_libsshared_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",
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    这是一个用于构建 Android 平台上 JNI (Java Native Interface) 代码库的 android.bp 文件。Android.bp 是 Android 的构建系统 Soong 使用的脚本语言,用于描述如何构建源代码。

    以下是各个部分的解读:

    1. CopyrightLicense 部分:此部分指定了此文件的版权信息和许可证信息,说明该文件遵循 Apache License 2.0 许可证。

    2. package 部分:此处指定了默认适用的许可证,即 Android-Apache-2.0。

    3. 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官方文档

  • 相关阅读:
    华为机试真题 Java 实现【最多颜色的车辆】【2022.11 Q4新题】
    Python【求孪生数】
    第27章_事务原理之MVCC与锁机制
    捕获多种异常练习
    ​LeetCode解法汇总307. 区域和检索 - 数组可修改
    适合tiktok运营的云手机需要满足什么条件?
    Java集合基础知识
    C++模板详解
    在面向对象的创建中,需要用到def init(self)方法。括号里的self是必选参数,必选参数存在的意义是什么,self可以干什么用,请举例表达self的用处。
    【自动化测试】——robotframework实战(三)编写测试用例
  • 原文地址:https://blog.csdn.net/Dontla/article/details/134261919