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 文件来学习更多高级用法。

相关推荐
李坤林2 小时前
Android 12 BLASTBufferQueue 深度分析
android
感觉不怎么会2 小时前
Android13 - 网络模式默认 NR only(仅5G)
android·5g
盐焗西兰花2 小时前
鸿蒙学习实战之路-Core Vision Kit人脸检测实现指南
android·学习·harmonyos
码农搬砖_20202 小时前
【一站式学会compose】 Android UI体系之 Text的使用和介绍
android·compose
介一安全2 小时前
【Frida Android】实战篇18:Frida检测与绕过——基于内核指令的攻防实战
android·网络安全·逆向·安全性测试·frida
冬奇Lab2 小时前
Android稳定性基础:系统架构与关键机制
android·系统架构
李坤林2 小时前
Android ION Memory Manager 深度分析
android
Digitally2 小时前
iPhone 无法向安卓设备发送图片:轻松解决
android·ios·iphone
Digitally2 小时前
如何从 Infinix 手机中删除联系人
android