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

相关推荐
独自破碎E17 分钟前
【BISHI9】田忌赛马
android·java·开发语言
代码s贝多芬的音符2 小时前
android 两个人脸对比 mlkit
android
darkb1rd3 小时前
五、PHP类型转换与类型安全
android·安全·php
gjxDaniel4 小时前
Kotlin编程语言入门与常见问题
android·开发语言·kotlin
csj504 小时前
安卓基础之《(22)—高级控件(4)碎片Fragment》
android
峥嵘life4 小时前
Android16 【CTS】CtsMediaCodecTestCases等一些列Media测试存在Failed项
android·linux·学习
stevenzqzq5 小时前
Compose 中的状态可变性体系
android·compose
似霰6 小时前
Linux timerfd 的基本使用
android·linux·c++
darling3317 小时前
mysql 自动备份以及远程传输脚本,异地备份
android·数据库·mysql·adb
你刷碗8 小时前
基于S32K144 CESc生成随机数
android·java·数据库