Android.bp 语法编程指南 1

Android.bp 语法编程指南

一、Android.bp 简介

Android.bp 是 Android 构建系统(Soong)使用的构建描述文件,用于替代传统的 Android.mk 文件。它使用 Blueprint 语言,是一种简单的声明式语言。

二、基本语法规则

1. 注释

go 复制代码
// 单行注释

/*
  多行注释
  这是第二行
*/

2. 模块定义

每个模块以 模块类型 { 开始,} 结束:

go 复制代码
模块类型 {
    属性1: "值1",
    属性2: ["值2", "值3"],
    属性3: 值4,
}

3. 变量定义

go 复制代码
// 字符串变量
变量名 := "值"

// 数组变量
列表变量 := ["item1", "item2"]

// 布尔变量
布尔变量 := true

三、常用模块类型

1. cc_binary - C/C++ 可执行文件

go 复制代码
cc_binary {
    name: "my_executable",
    srcs: ["main.cpp", "utils.cpp"],
    shared_libs: ["liblog", "libutils"],
    static_libs: ["libmystatic"],
    cflags: ["-Wall", "-O2"],
}

2. cc_library - C/C++ 库

go 复制代码
// 静态库
cc_library_static {
    name: "mystaticlib",
    srcs: ["lib.cpp"],
    export_include_dirs: ["include"],
}

// 动态库
cc_library_shared {
    name: "mysharedlib",
    srcs: ["shared.cpp"],
    shared_libs: ["liblog"],
}

3. java_library - Java 库

go 复制代码
java_library {
    name: "mylib",
    srcs: ["src/**/*.java"],
    static_libs: ["otherlib"],
    sdk_version: "current",
}

4. android_app - Android 应用

go 复制代码
android_app {
    name: "MyApp",
    srcs: ["src/**/*.java"],
    resource_dirs: ["res"],
    manifest: "AndroidManifest.xml",
    static_libs: ["support-v4"],
    certificate: "platform",  // 或具体证书名
}

5. android_test - 测试模块

go 复制代码
android_test {
    name: "MyAppTest",
    srcs: ["test/**/*.java"],
    instrumentation_for: "MyApp",
}

四、完整实例

示例 1:简单的 C++ 程序

go 复制代码
// Android.bp 文件

// 编译标志
common_flags := [
    "-Wall",
    "-Werror",
    "-O2",
]

// 静态库
cc_library_static {
    name: "mylib",
    srcs: [
        "src/utils.cpp",
        "src/calculator.cpp",
    ],
    cflags: common_flags,
    export_include_dirs: ["include"],
    local_include_dirs: ["src"],
}

// 可执行文件
cc_binary {
    name: "myapp",
    srcs: ["src/main.cpp"],
    static_libs: ["mylib"],
    shared_libs: ["liblog"],
    cflags: common_flags,
}

示例 2:Android 应用

go 复制代码
// 应用模块
android_app {
    name: "MyCalculator",
    
    // Java 源文件
    srcs: [
        "app/src/main/java/com/example/calculator/*.java",
        "app/src/main/java/com/example/calculator/utils/*.java",
    ],
    
    // 资源文件
    resource_dirs: ["app/src/main/res"],
    
    // 清单文件
    manifest: "app/src/main/AndroidManifest.xml",
    
    // 依赖库
    static_libs: [
        "android-support-v4",
        "android-support-v7-appcompat",
    ],
    
    // 平台签名
    certificate: "platform",
    
    // 权限
    privileged: true,
    
    // 优化选项
    optimize: {
        enabled: true,
        proguard_flags_files: ["proguard.flags"],
    },
}

// 单元测试
android_test {
    name: "MyCalculatorTests",
    srcs: ["app/src/test/**/*.java"],
    instrumentation_for: "MyCalculator",
}

示例 3:复杂的多模块项目

go 复制代码
// 全局变量
gen_src_dir := "generated/"
common_cflags := [
    "-DDEBUG=1",
    "-DANDROID",
]

// 生成文件规则
genrule {
    name: "generate_header",
    tools: ["code_generator"],
    cmd: "$(location code_generator) --output $(genDir)/config.h",
    srcs: ["config.txt"],
    out: ["config.h"],
}

// 库模块
cc_library {
    name: "core_lib",
    srcs: [
        "core/*.cpp",
        ":generate_header",  // 依赖生成的文件
    ],
    generated_headers: ["config_header"],
    cflags: common_cflags,
    export_include_dirs: ["include"],
}

// 另一个库
cc_library {
    name: "network_lib",
    srcs: ["network/*.cpp"],
    shared_libs: [
        "libcore",
        "libnetd",
    ],
}

// 最终的可执行文件
cc_binary {
    name: "server",
    srcs: ["main/server_main.cpp"],
    static_libs: ["core_lib"],
    shared_libs: [
        "network_lib",
        "liblog",
        "libcutils",
    ],
    cflags: common_cflags,
}

五、常用属性和函数

1. 文件操作

go 复制代码
// 文件列表
srcs: [
    "file1.cpp",
    "subdir/file2.cpp",
    "*.cpp",  // 通配符
    "**/*.cpp",  // 递归通配符
],

// 排除文件
exclude_srcs: ["bad_file.cpp"],

2. 条件编译

go 复制代码
target: {
    android: {
        cflags: ["-DANDROID"],
        shared_libs: ["libandroid"],
    },
    host: {
        cflags: ["-DHOST"],
    },
}

3. 版本控制

go 复制代码
// 版本名称
version_name: "1.0.0",

// 版本代码
version_code: 100,

六、高级特性

1. 默认配置

go 复制代码
// defaults 模块(在单独文件中,如 build/soong/defaults.bp)
my_defaults {
    name: "my_defaults",
    cflags: ["-O3"],
    shared_libs: ["libbase"],
}

// 使用 defaults
cc_binary {
    name: "mybinary",
    defaults: ["my_defaults"],
    srcs: ["main.cpp"],
}

2. 预构建模块

go 复制代码
prebuilt_etc {
    name: "my_config",
    src: "config/my_config.txt",
    filename: "my_config.txt",
    sub_dir: "myapp",
}

七、调试技巧

  1. 查看依赖m <module_name>
  2. 构建单个模块make <module_name>
  3. 查看构建命令 :添加 -n 参数

八、最佳实践

  1. 保持简洁:每个模块只做一件事
  2. 使用变量:复用公共配置
  3. 合理分组:相关文件放在一起
  4. 注释清晰:说明模块用途
  5. 版本控制:维护构建配置的版本

学习资源

  1. 官方文档build/soong/README.md
  2. 示例代码:AOSP 源码中的各种 Android.bp 文件
  3. 命令行工具bpmodify(修改 .bp 文件)

这个指南涵盖了 Android.bp 的主要语法和用法。实际开发中,建议多参考 AOSP 源码中的现有 Android.bp 文件来学习更多高级用法。

相关推荐
恋猫de小郭16 小时前
Android 上为什么主题字体对 Flutter 不生效,对 Compose 生效?Flutter 中文字体问题修复
android·前端·flutter
三少爷的鞋17 小时前
不要让调用方承担你本该承担的复杂度 —— Android Data 层设计原则
android
李李李勃谦17 小时前
Flutter 框架跨平台鸿蒙开发 - 创意灵感收集
android·flutter·harmonyos
fengci.18 小时前
ctfshow其他(web396-web407)
android
JJay.18 小时前
Android 17 大屏适配变化解
android
TE-茶叶蛋19 小时前
结合登录页-PHP基础知识点解析
android·开发语言·php
alexhilton19 小时前
Jetpack Compose元球边缘效果
android·kotlin·android jetpack
y小花20 小时前
安卓音频子系统之USBAlsaManager
android·音视频
KevinCyao21 小时前
安卓android视频短信接口怎么集成?AndroidStudio视频短信开发指南
android