Android.bp入门指南之浅析Android.bp文件

简介: 【2月更文挑战第6天】

image.png

@[toc]

Android.bp文件是什么?

Android.bp 文件是 Android 构建系统(Android Build System)中使用的构建描述文件,它用于定义 Android 项目中的模块、库、应用等构建规则。该文件使用 Blueprint 语言,是 Soong 构建系统的一部分。
Soong则是专为Android编译而设计的工具,Blueprint只是解析文件的形式,而Soong则解释内容的含义,最终转换成Ninja文件。Android.bp文件用类似JSON的简洁声明来描述需要构建的模块。
Android.bp的出现就是为了替换Android.mk文件。bp跟mk文件不同,它是纯粹的配置,没有分支、循环等流程控制,不能做算数逻辑运算。如果需要控制逻辑,那么只能通过Go语言编写。
Android.mk可以引用Android.bp中的模块,反之Android.bp不能引用Android.mk中的模块。

Android.bp的主要作用

以下是 Android.bp 文件的一些主要作用:

模块定义

Android.bp 文件用于定义 Android 项目中的模块,这些模块可以是共享库、可执行文件、静态库等。每个模块都有其自己的属性和规则,用于描述模块的构建过程和依赖关系。

依赖关系

在 Android.bp 文件中,你可以指定一个模块依赖于其他模块,定义了模块之间的依赖关系。这包括依赖于其他库、系统库、源代码文件等。

构建规则

通过 Android.bp 文件,你可以指定模块的构建规则,包括编译选项、链接选项、源文件列表等。这使得开发者可以配置模块的构建过程。

模块属性

对每个模块,你可以定义一系列属性,这些属性包括模块的名称、类型、源文件列表、编译选项、依赖项等。这些属性在构建过程中用于指导构建系统。

插件支持

Android.bp 文件支持插件,这使得开发者可以自定义构建规则,添加额外的构建步骤或其他功能。

模块的可配置性

通过 Android.bp 文件,你可以定义模块的可配置属性,允许构建系统在不同的场景或设备上使用不同的配置。

在整个 Android 构建系统中,Android.bp 文件是非常重要的一部分,它提供了一种灵活且可扩展的方式来定义和配置 Android 项目的构建过程。这样的设计使得 Android 构建系统能够适应不同的硬件、设备和项目需求。

为什么会引入Android.bp

Android.bp 文件是Android构建系统中引入的一种构建文件,用于替代之前的Makefile和其他构建描述文件。主要的原因包括:

构建系统的现代化: 传统的Makefile构建系统在复杂项目中的管理和维护上存在一些困难,特别是随着Android项目的复杂性的增加。Soong构建系统和Android.bp文件的引入旨在提供更现代、可扩展、易维护的构建系统。

模块化和可配置性: Android.bp 文件引入了模块化的构建方式,允许将Android项目拆分为多个模块,并为每个模块定义独立的构建规则。这种模块化的设计使得开发者能够更好地组织项目结构,提高代码的可维护性。同时,Android.bp 文件支持配置属性,允许根据不同的设备或条件进行灵活的配置。

性能和并发构建: Soong构建系统和Android.bp文件的设计旨在提高构建系统的性能。它支持并发构建,可以更高效地利用多核处理器,并在大型项目中减少构建时间。

支持新的Android平台特性: 随着Android平台的不断演进,新的构建需求和特性不断涌现。Soong和Android.bp文件的引入使得构建系统更容易适应这些新的需求,包括对新的硬件架构、系统组件等的支持。

Android.bp 文件的引入是为了提供一个更先进、可扩展和高效的Android构建系统,以满足复杂Android项目的构建需求,并使得构建过程更具灵活性和性能优势。

语法

Android.bp 文件是 Soong 构建系统中的构建描述文件,用于配置 Android 项目的构建规则。以下是 Android.bp 文件的主要语法要点:

模块类型定义:
使用 module_type 字段指定模块的类型,例如 module_type: "android_library" 或 module_type: "android_app"。

模块名定义:
使用 name 字段指定模块的名称,例如 name: "MyLibrary"。

模块属性:
使用各种字段来定义模块的属性,例如 srcs(源文件列表)、cflags(编译选项)、include_dirs(包含目录)等。
例如:

srcs: ["file1.c", "file2.c"],
cflags: ["-Wall", "-Werror"],

默认属性集:
使用 defaults 字段引用一个默认属性集,以便继承一组默认的属性。例如:

defaults: ["my_defaults"],

模块依赖关系:
使用 deps 字段指定模块的依赖关系,即依赖于其他模块。例如:

deps: ["lib1", "lib2"],

可选依赖关系:
使用 optional_uses_libs 字段指定可选的依赖关系。例如:

optional_uses_libs: ["optional_lib1", "optional_lib2"],

构建配置块:
使用 build 字段定义一个构建配置块,其中可以包含 target、host 或 device 等不同配置。例如:

build: {
    target: {
        cflags: ["-O2"],
    },
    device: {
        cflags: ["-DDEVICE_BUILD"],
    },
},

构建工具配置:
使用 tool 字段配置构建过程中使用的工具。例如:

tool: {
    yacc: ["my_yacc_tool"],
},

标记特定模块属性:
使用 tags 字段给模块打标签,以便在其他模块中引用。例如:

tags: ["my_tag"],

架构相关配置:
使用 arch 字段指定特定的架构相关配置。例如:

arch: {
    arm64: {
        cflags: ["-march=armv8-a"],
    },
    x86: {
        cflags: ["-march=x86-64"],
    },
},

变量和函数:
可以使用变量和函数来简化配置。例如:

my_var = "my_value";
my_func = {
    name: "my_function",
    args: ["arg1", "arg2"],
};

命名空间:

使用 namespace 字段来定义一个命名空间,将一组模块组织在同一个命名空间下。例如:

namespace {
    module_type: "my_namespace_type",
    name: "my_namespace",
    srcs: ["namespace_file1.c", "namespace_file2.c"],
}

模块分隔:
使用 group 字段将一组模块组织在同一个分组中,以便对它们应用相同的配置。例如:

group {
    name: "my_group",
    srcs: ["group_file1.c", "group_file2.c"],
}

源文件通配符:
使用通配符指定源文件,例如 srcs: ["src/*/.c"],表示匹配 src 目录及其所有子目录下的所有 .c 文件。

条件语句:
使用条件语句来根据不同的条件执行不同的配置。例如:

if (my_condition) {
    // 针对条件为真时的配置
    srcs: ["file_condition_true.c"],
} else {
    // 针对条件为假时的配置
    srcs: ["file_condition_false.c"],
}

标签过滤:
使用 required 和 host_required 字段指定模块的标签过滤条件。例如:

required: ["my_required_tag"],
host_required: ["my_host_required_tag"],

模块替代:
使用 overrides 字段指定被当前模块替代的其他模块。例如:

overrides: ["my_overridden_module"],

私有模块属性:
使用 private 字段指定私有属性,这些属性只能在同一 Android.bp 文件中的其他属性块中使用。例如:

private: {
    my_private_var: "private_value",
}

自动生成的源文件:
使用 generated_sources 字段指定由构建系统自动生成的源文件。例如:

generated_sources: ["generated_file1.c", "generated_file2.c"],

构建工具:
使用 tool 字段指定使用的构建工具及其配置。例如:

tool: {
    aidl: {
        flags: ["-Ipath/to/aidl/include"],
    },
},

这些语法要点提供了 Android.bp 文件中一些常见的配置选项和结构。要了解更多详细信息,可以查阅官方 Soong 构建系统文档,该文档提供了全面的语法和配置选项说明,以及更多实际的示例。

例子

android_app {
    name: "TvLocalMediaPlayer",
    defaults: ["xxx_DexPreOptVariant_defaults"],

    srcs: ["src/**/*.java",
          "src/**/*.kt"],
    resource_dirs: ["res"],

    optional_uses_libs: [
        "javax.obex",
    ],

    static_libs: [
        "com.mediatek.exoplayerlib",
        "com.mediatek.tv.oneworld.basic",
        "com.mediatek.tv.oneworld.tvapi",
        "extservice_api",
        "com.mediatek.tv.agent.settingspqdb.lib",
        "com.mediatek.tv.oneworld.systemapi",
        "com.mediatek.xxxPhoto",
        "androidx.recyclerview_recyclerview",
        "androidx.preference_preference",
        "androidx.appcompat_appcompat",
        "androidx.leanback_leanback-preference",
        "androidx.leanback_leanback",
        "androidx.lifecycle_lifecycle-runtime",
        "androidx.lifecycle_lifecycle-common",
        "com.mediatek.tv.common.views"
    ],

    certificate: "platform",
    platform_apis: true,
    privileged: true,
    system_ext_specific: true,

    optimize: {
        proguard_flags_files: ["proguard.flags"],
    },
    overrides: ["LiveTv"],
}

这个 Android.bp 文件是一个用于构建 Android 应用程序模
块的配置文件,采用 Soong 构建系统的语法。以下是对文件中的各个部分的详细解释:

android_app 模块类型:

android_app 是 Android 构建系统中用于定义 Android 应用程序模块的一种模块类型。
这个模块类型表示一个Android应用程序,它将编译成一个APK文件。
模块的基本信息:

name: "TvLocalMediaPlayer":指定应用程序模块的名称为 "TvLocalMediaPlayer"。
defaults: ["xxx_DexPreOptVariant_defaults"]:引用了一个名为 "xxx_DexPreOptVariant_defaults" 的默认配置。
源代码和资源文件:

srcs: ["src//*.java", "src//*.kt"]:指定了Java和Kotlin源代码文件的路径,这些文件将被编译成应用程序的可执行代码。
resource_dirs: ["res"]:指定了资源文件的路径,这些资源文件将被包含在最终的APK中。
可选使用的库:

optional_uses_libs: ["javax.obex"]:指定了一个可选使用的库,即 javax.obex。如果该库可用,则将其链接到应用程序中。
静态库依赖关系:

static_libs 部分列举了应用程序依赖的静态库模块。这些库模块将被链接到应用程序中。
例如,"com.mediatek.exoplayerlib"、"com.mediatek.tv.oneworld.basic" 等。
证书和平台相关属性:

certificate: "platform":指定应用程序使用平台证书进行签名,这是 Android 平台的标准做法。
platform_apis: true:表明该应用程序使用了 Android 平台的 API。
privileged: true:表明该应用程序是特权应用,可能需要更高的系统权限。
system_ext_specific: true:

system_ext_specific: true:表明该应用程序是专门为 System Ext 分区设计的,System Ext 是 Android 10 引入的一个扩展系统分区。

优化配置:
optimize 部分定义了一些优化配置。
proguard_flags_files: ["proguard.flags"]:指定了 ProGuard 优化的配置文件。

overrides: ["LiveTv"]:
overrides 部分列举了该应用程序覆盖的其他模块,这里是 "LiveTv"。这意味着当前应用程序可能包含或修改了 "LiveTv" 模块的一些功能。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!
相关文章
|
2月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
93 1
|
5天前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
22 7
|
16天前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
40 10
|
24天前
|
IDE Java 程序员
安卓应用开发入门:打造你的第一个“Hello World”
【9月更文挑战第11天】在编程的世界里,每一个初学者的旅程都从一个简单的“Hello World”开始。本文将带领安卓开发的新手们,通过简单直观的方式,一步步构建出自己的第一个安卓应用。我们将探索安卓工作室(Android Studio)的安装、项目的创建,以及如何运行和调试你的应用。无论你是编程新手还是想扩展技能的老手,这篇文章都将为你打开一扇通往安卓世界的大门。
77 7
|
24天前
|
IDE Java API
安卓应用开发入门:打造你的第一个"Hello World"
【9月更文挑战第11天】在探索安卓开发的海洋中,每个开发者的航行都从简单的"Hello World"开始。本文将作为你的航标,引导你驶向安卓应用开发的精彩世界。我们将一起启航,通过浅显易懂的语言和步骤,学习如何构建并运行你的第一个安卓应用。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供所需的知识和信心。准备好了吗?让我们揭开安卓开发的神秘面纱,一起创造些令人兴奋的东西吧!
|
2月前
|
开发工具 git 索引
repo sync 更新源码 android-12.0.0_r34, fatal: 不能重置索引文件至版本 ‘v2.27^0‘。
本文描述了在更新AOSP 12源码时遇到的repo同步错误,并提供了通过手动git pull更新repo工具来解决这一问题的方法。
57 1
|
2月前
|
运维 Cloud Native Android开发
云原生之旅:容器化与微服务架构的融合之道安卓应用开发入门指南
本文将深入探讨云原生技术的核心要素——容器化和微服务架构,并揭示它们如何共同推动现代软件的开发与部署。通过实际案例分析,我们将看到这两种技术如何相辅相成,助力企业实现敏捷、可扩展的IT基础设施。文章旨在为读者提供一条清晰的道路,指引如何在云原生时代利用这些技术构建和优化应用。 本文将引导初学者了解安卓应用开发的基本概念和步骤,从安装开发环境到编写一个简单的“Hello World”程序。通过循序渐进的讲解,让读者快速掌握安卓开发的核心技能,为进一步深入学习打下坚实基础。
43 1
|
2月前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
61 0
|
2月前
|
XML IDE Java
安卓应用开发入门:打造你的第一个“Hello World”
【8月更文挑战第31天】 在安卓的浩瀚宇宙中,每一个新星都从一句简单的问候开始闪耀。本文将作为你的航标,引导你探索安卓开发的银河系。无论你是初心者还是资深开发者,构建第一个“Hello World”应用总是令人兴奋的里程碑。通过这篇文章,我们将一起搭建起通往安卓开发世界的桥梁。让我们摒弃复杂的术语,用最简单直白的语言,一步步地走过这段旅程。准备好了吗?让我们一起开启这段冒险吧!
|
2月前
|
搜索推荐 Java Android开发
打造个性化安卓启动器:从入门到精通
【8月更文挑战第31天】在这个数字时代,智能手机几乎成了我们生活的延伸。而作为最流行的操作系统之一,安卓的可定制性让它在众多用户中独树一帜。本文将带你了解如何从零开始构建你自己的安卓启动器,这不仅是一项挑战技能的项目,更是一次让你的设备与众不同的机会。我们将一步步探索创建启动器的过程,包括设计思路、关键代码实现以及最终的测试与优化。无论你是编程新手还是有一定基础的开发者,都能通过这个项目提升技术水平,并给你的日常使用带来便利。准备好了吗?让我们一起潜入安卓开发的海洋,打造专属于你的个性化世界!
下一篇
无影云桌面