这是一份 Android 系统的 Android.bp 构建配置文件,用于构建 gatekeeperd(门卫守护进程)及其相关组件。以下是详细注释:
bison
// Apache 2.0 许可证头部
// 除非法律要求或书面同意,否则按"原样"分发
// 没有任何形式的明示或暗示担保
// 详见许可证中的具体条款
// 声明默认适用的许可证
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
// 定义 gatekeeperd 的默认配置
cc_defaults {
name: "gatekeeperd_defaults",
cflags: [ // 编译标志
"-Wall", // 启用所有警告
"-Wextra", // 启用额外警告
"-Werror", // 将警告视为错误
"-Wunused", // 警告未使用的变量
],
srcs: [ // 源文件
"gatekeeperd.cpp", // 主要实现文件
],
defaults: [ // 继承的默认配置
"keymint_use_latest_hal_aidl_ndk_shared", // 使用最新的 KeyMint HAL AIDL NDK
],
shared_libs: [ // 动态链接库依赖
"libbinder", // Binder IPC 库
"libbinder_ndk", // Binder NDK 库
"libgatekeeper", // gatekeeper 库
"libgsi", // 通用系统镜像库
"liblog", // 日志库
"libhardware", // 硬件抽象层库
"libbase", // Android 基础库
"libutils", // 工具库
"libcrypto", // 加密库(OpenSSL)
"libhidlbase", // HIDL 基础库
"lib_android_keymaster_keymint_utils", // KeyMaster/KeyMint 工具库
"android.hardware.gatekeeper-V1-ndk", // Gatekeeper HAL NDK
"android.hardware.gatekeeper@1.0", // Gatekeeper HAL 1.0
"libgatekeeper_aidl", // Gatekeeper AIDL 库(下面定义的)
"android.security.authorization-ndk", // 安全授权 NDK
],
static_libs: ["libscrypt_static"], // 静态链接库:scrypt 加密算法
include_dirs: ["external/scrypt/lib/crypto"], // 包含目录
}
// 定义 gatekeeperd 可执行文件
cc_binary {
name: "gatekeeperd", // 二进制文件名
defaults: [
"gatekeeperd_defaults", // 继承上面的默认配置
],
srcs: [
"main.cpp", // 主函数入口文件
],
init_rc: ["gatekeeperd.rc"], // init 启动脚本
}
// 定义 AIDL 文件组
filegroup {
name: "gatekeeper_aidl", // 文件组名
srcs: [ // 包含的 AIDL 文件
"binder/android/service/gatekeeper/IGateKeeperService.aidl",
],
path: "binder", // 文件所在路径
}
// 定义 Gatekeeper AIDL 共享库
cc_library_shared {
name: "libgatekeeper_aidl", // 库名
srcs: [
":gatekeeper_aidl", // 引用上面的 AIDL 文件组
"GateKeeperResponse.cpp", // 响应处理实现
],
aidl: { // AIDL 编译配置
export_aidl_headers: true, // 导出 AIDL 头文件
include_dirs: [ // AIDL 包含目录
"system/core/gatekeeperd/binder",
"frameworks/base/core/java/",
],
},
export_include_dirs: ["include"], // 导出的头文件目录
shared_libs: [ // 动态库依赖
"libbase",
"libbinder",
"libcutils",
"liblog",
"libutils",
],
export_shared_lib_headers: [ // 导出的共享库头文件
"libbinder",
],
}
// 定义模糊测试(Fuzzing)目标
cc_fuzz {
name: "gatekeeperd_service_fuzzer", // 模糊测试器名称
defaults: [
"gatekeeperd_defaults", // 继承默认配置
"service_fuzzer_defaults" // 服务模糊测试默认配置
],
srcs: [
"fuzzer/GateKeeperServiceFuzzer.cpp", // 模糊测试源文件
],
fuzz_config: { // 模糊测试配置
cc: [ // 联系人邮箱
"subrahmanyaman@google.com",
"swillden@google.com",
],
},
}
运行结果分析
由于这是一个 构建配置文件 ,不是可执行脚本,因此不能直接"运行"。它需要由 Android 的构建系统(Soong/Blueprint) 处理:
构建系统处理流程:
- 解析配置:构建系统读取此文件,创建模块依赖图
- 编译组件 :
- 生成
libgatekeeper_aidl.so(共享库) - 编译
gatekeeperd可执行文件 - 编译模糊测试器
gatekeeperd_service_fuzzer
- 生成
- 打包到系统镜像 :
gatekeeperd和其.rc文件会被打包到/system/bin/和/system/etc/init/- 库文件打包到
/system/lib/或/vendor/lib/
实际部署后的运行效果:
当 Android 系统启动时:
-
init 进程:
bash# 读取 gatekeeperd.rc 文件 service gatekeeperd /system/bin/gatekeeperd class main user system group system -
启动 gatekeeperd:
- 作为一个守护进程运行,提供设备解锁、密码验证等服务
- 通过 Binder 接口
IGateKeeperService暴露服务
-
功能:
- 处理 PIN/图案/密码验证
- 管理设备解锁凭证
- 与 TEE(可信执行环境)或 HSM(硬件安全模块)交互
-
模糊测试:
bash# 可以运行模糊测试器来检测安全漏洞 adb shell /data/fuzz/arm64/gatekeeperd_service_fuzzer/gatekeeperd_service_fuzzer
关键文件位置:
| 组件 | 构建输出位置 | 系统安装位置 |
|---|---|---|
| gatekeeperd 可执行文件 | out/target/product/[device]/system/bin/gatekeeperd |
/system/bin/gatekeeperd |
| gatekeeperd.rc 启动脚本 | out/target/product/[device]/system/etc/init/gatekeeperd.rc |
/system/etc/init/gatekeeperd.rc |
| AIDL 库 | out/target/product/[device]/system/lib[64]/libgatekeeper_aidl.so |
/system/lib[64]/libgatekeeper_aidl.so |
| 模糊测试器 | out/target/product/[device]/data/fuzz/[arch]/gatekeeperd_service_fuzzer |
/data/fuzz/[arch]/gatekeeperd_service_fuzzer/ |
验证构建成功:
bash
# 在构建环境中检查
m gatekeeperd libgatekeeper_aidl gatekeeperd_service_fuzzer
# 检查生成的文件
ls -la out/target/product/[device]/system/bin/gatekeeperd
ls -la out/target/product/[device]/system/lib[64]/libgatekeeper_aidl.so
这个配置展示了 Android 安全子系统中一个关键组件的完整构建过程,从核心守护进程到 AIDL 接口层,再到安全测试工具的全套实现。