# aosp_device **Repository Path**: SuGarSJL/aosp_device ## Basic Information - **Project Name**: aosp_device - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-06-16 - **Last Updated**: 2026-06-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Sugar MySystem — Android 16 Device 配置 基于 **Android 16 QPR2 (Baklava)** 标准的完整设备配置,由 Hermes Agent 生成。 --- ## 快速开始 ```bash cd ~/workspace/aosp source build/envsetup.sh lunch mysystem-trunk_staging-userdebug make -j$(nproc) ``` 产物输出到 `out/target/product/mysystem/`。 --- ## 提交记录 ``` adb594c Virtual A/B OTA — AB_OTA_PARTITIONS、VABC 压缩、update_engine 4cac9de Android 16 Soong 格式、TARGET_COPY_OUT、基类修正、移除 vendorsetup.sh 9828251 README 完整架构文档 4c5b304 Android 16 QPR2 完整合规 — AVB 链、GKI、odm_dlkm、OTA 4a89943 添加 vbmeta + system_dlkm 分区(AVB 签名链) 25cbf6d add my android system(初始 32 个文件创建) ``` --- ## 文件结构 ``` device/sugar/mysystem/ │ ├── 🔧 构建入口 │ ├── AndroidProducts.mk 产品注册(Soong 格式,含 COMMON_LUNCH_CHOICES) │ ├── mysystem.mk 主产品 makefile │ ├── device.mk 设备包/权限/文件拷贝整合 │ └── BoardConfig.mk 硬件架构 + 分区大小 + AVB + GKI │ ├── 🚀 启动系统 init/ │ ├── init.mysystem.rc init 进程启动脚本 │ │ ├── misc 分区初始化(创建 /misc、设置权限) │ │ ├── ZRAM / thermal / health HAL 配置 │ │ └── debug console(userdebug/eng) │ ├── init.mysystem.usb.rc USB 配置(mtp/adb 模式切换) │ └── ueventd.mysystem.rc 设备节点权限 │ ├── 🔒 SELinux sepolicy/vendor/ │ ├── file_contexts 安全上下文定义 │ ├── sepolicy.mk SELinux 编译配置 │ └── common/ │ ├── misc.te misc 分区类型 + 权限 │ ├── misctrl.te BCB 控制工具域 │ └── hal_health.te 健康 HAL 策略 │ ├── 🔧 VINTF vintf/ │ ├── manifest.xml 设备 HAL 声明(17 个 HAL) │ └── compatibility_matrix.xml 框架兼容矩阵(FCM Level 7) │ ├── ⚙️ 属性 │ ├── system.prop 系统属性(显示/音频/WiFi/蓝牙/电源/性能) │ └── product.prop CPU ABI 属性 │ ├── 🎨 配置 configs/ │ ├── media/ │ │ ├── media_codecs.xml 编解码器(H.264/HEVC/VP9/AAC/FLAC/Opus) │ │ └── media_profiles_V1_0.xml 录制配置 │ ├── audio/ │ │ └── audio_policy_configuration.xml 音频路由策略 │ ├── bluetooth/ │ │ └── bt_vendor.conf 蓝牙 UART/协议栈配置 │ ├── wifi/ │ │ ├── wpa_supplicant_overlay.conf │ │ └── p2p_supplicant_overlay.conf │ ├── keylayout/ │ │ └── Generic.kl 按键映射 │ └── public.libraries.txt 公开原生库声明 │ ├── 🎭 资源覆盖 overlay/ │ ├── frameworks/base/core/res/ │ │ ├── Android.bp + AndroidManifest.xml │ │ └── res/values/config.xml 显示/网络/蓝牙/通知/电源配置 │ └── packages/apps/Settings/ │ ├── Android.bp + AndroidManifest.xml │ └── res/values/config.xml "关于本机" / 开发者选项 │ ├── 🗂️ fstab.mysystem 文件系统挂载表 ├── 📦 prebuilts/ 预编译库目录(待填充) ├── idc/ 输入设备配置目录 └── README.md 本文件 ``` --- ## 分区表 ### 动态分区(Super Partition — 8 GB) | 分区 | 大小 | 文件系统 | 用途 | |------|------|---------|------| | system | 2 GB | erofs/ext4 | Android 系统框架 | | system_ext | 512 MB | erofs/ext4 | 系统扩展 | | product | 512 MB | erofs/ext4 | 产品定制 | | vendor | 512 MB | erofs/ext4 | 硬件抽象层 | | system_dlkm | 64 MB | erofs/ext4 | GKI 系统内核模块 | | vendor_dlkm | 64 MB | erofs/ext4 | 供应商内核模块 | | odm | 128 MB | erofs/ext4 | 原始设计制造商定制 | | odm_dlkm | 32 MB | erofs/ext4 | ODM 内核模块 | ### 独立分区(Standalone) | 分区 | 大小 | 类型 | 用途 | |------|------|------|------| | boot | 64 MB | boot image | 内核 + 通用 ramdisk | | init_boot | 8 MB | boot image | init 专用 ramdisk | | vendor_boot | 64 MB | boot image | 供应商 ramdisk + DTB | | **misc** | **4 MB** | **raw/emmc** | **Bootloader Control Block (BCB)** | | recovery | 64 MB | boot image | 恢复模式 | | userdata | 8 GB | f2fs/ext4 | 用户数据 | | metadata | 64 MB | ext4 | 加密元数据 | | cache | 256 MB | ext4 | 缓存/OTA 暂存 | | vbmeta | — | AVB 元数据 | 根验证元数据 | | vbmeta_system | — | AVB 元数据 | system/product 链签名 | --- ## misc 分区详解 ### 是什么 `misc` 是 Bootloader Control Block(BCB)分区,用于 Bootloader 和 Recovery/Android 之间的通信。 ### 为什么是 raw 分区 BCB 是裸二进制结构,不是文件系统: ```c struct bootloader_message { char command[32]; // "boot-recovery", "bootloader", "wipe-data" 等 char status[32]; // 状态字段 char recovery[768]; // recovery 阶段参数 char stage[32]; // UI stage char reserved[224]; // 保留 }; ``` ### 配置位置 ```makefile # BoardConfig.mk BOARD_USES_MISCIMAGE := true BOARD_MISCIMAGE_PARTITION_SIZE := 4194304 BOARD_MISCIMAGE_FILE_SYSTEM_TYPE := emmc ``` ```ini # fstab.mysystem /dev/block/by-name/misc /misc emmc defaults defaults ``` ```makefile # device.mk PRODUCT_PACKAGES += bootloader_message misctrl ``` ### 运行时 - Recovery 启动时读取 misc 分区获取 BCB 命令 - Bootloader 在重启前写入命令到 misc - `misctrl` 工具提供 misc 分区的读写接口 - SELinux 策略 (`misc.te`/`misctrl.te`) 保护访问权限 --- ## AVB(Android Verified Boot)完整签名链 ``` vbmeta(根) ├── vbmeta_system ───── system, system_ext, product ├── vbmeta_system_dlkm ─ system_dlkm(GKI 模块) ├── vbmeta_vendor ───── vendor, odm ├── vbmeta_vendor_dlkm ─ vendor_dlkm(供应商模块) ├── boot ────────────── kernel + generic ramdisk └── init_boot ───────── init ramdisk ``` 签名算法: SHA256_RSA4096 回滚保护: 基于 `PLATFORM_SECURITY_PATCH_TIMESTAMP` --- ## GKI(Generic Kernel Image)支持 | 配置项 | 说明 | |--------|------| | `BOARD_USES_GENERIC_KERNEL_IMAGE := true` | 使用 GKI 通用内核 | | `BOARD_GENERIC_RAMDISK_KERNEL_MODULES_LOAD := dm-user.ko` | GKI ramdisk 模块 | | `BOARD_MOVE_RECOVERY_RESOURCES_TO_VENDOR_BOOT := true` | recovery 资源移到 vendor_boot | | `BOARD_EXCLUDE_KERNEL_FROM_RECOVERY_IMAGE := true` | recovery 不含内核 | | `BOARD_BOOT_HEADER_VERSION := 4` | Boot image v4 格式 | --- ## 构建与编译 ### 环境要求 | 要求 | 最低 | 建议 | |------|------|------| | RAM | 32 GB | 64 GB | | 磁盘 | 300 GB | 500 GB SSD | | CPU | 8 核 | 32 核 | | OS | Ubuntu 22.04 LTS | 同左 | ### 本地编译 ```bash # 1. 进入 AOSP 根目录 cd ~/workspace/aosp # 2. 加载环境 source build/envsetup.sh # 3. 选择产品 lunch mysystem-trunk_staging-userdebug # 4. 编译(全量) make -j$(nproc) # 编译特定目标 make misc_info # 只验证分区配置 make bootimage # 只编译 boot.img make superimage # 只编译 super.img make droidcore # 编译系统核心 ``` ### 云服务器编译 如果本地资源不够(16GB RAM 会 OOM): ```bash # 1. 开一台 32C64G 云服务器(阿里云/腾讯云,¥5-10/小时) # 2. SSH 登录,安装依赖 sudo apt update && sudo apt install -y git repo openjdk-17-jdk python3 # 3. 同步代码(或上传已有代码) # 4. 编译 source build/envsetup.sh lunch mysystem-trunk_staging-userdebug make -j32 # 编译完成后下载产物,释放服务器 ``` ### 产物 ``` out/target/product/mysystem/ ├── boot.img 启动镜像 ├── vendor_boot.img 供应商启动镜像 ├── init_boot.img init 启动镜像 ├── super.img 超级分区镜像(含所有动态分区) ├── system.img 系统镜像 ├── vendor.img 供应商镜像 ├── vbmeta.img AVB 验证元数据 ├── vbmeta_system.img system 链 AVB 数据 ├── misc_info.txt 分区元信息 └── *.img 其他分区镜像 ``` ### 烧写 ```bash # 全部烧写 fastboot flashall # 单独烧写 fastboot flash boot boot.img fastboot flash vendor_boot vendor_boot.img fastboot flash super super.img fastboot flash misc misc.img fastboot flash vbmeta vbmeta.img fastboot reboot ``` --- ## 已知待补充项 以下内容依赖具体硬件平台,需后续补充: | 项目 | 说明 | |------|------| | **Kernel defconfig** | 内核配置文件 `kernel/sugar/mysystem/arch/arm64/configs/mysystem_defconfig` | | **Kernel 源码** | GKI 内核树或 vendor kernel | | **HAL 实现 C++ 代码** | health/thermal/power/gralloc/hwcomposer 等的 `.cpp` 实现 | | **GPU 驱动** | 匹配具体 GPU 芯片的 OpenGL/Vulkan 驱动 | | **签名密钥** | 发布版本需替换 `external/avb/test/data/testkey_rsa4096.pem` | | **分区表生成工具** | GPT 分区表需平台 bootloader 工具创建 | --- --- ## Virtual A/B OTA ### 工作原理 ``` 用户使用中(Slot A) → 后台 COW 安装到 Slot B → 重启切换 → 合并/回退 ``` Virtual A/B 使用 COW(Copy-On-Write)快照机制,OTA 更新在后台写入非活跃槽,不中断用户操作。更新失败可自动回退。 ### 配置清单 **BoardConfig.mk — A/B 分区声明(15 个):** ```makefile AB_OTA_UPDATER := true AB_OTA_PARTITIONS += boot init_boot vendor_boot \ # 三个 boot 分区都需要 A/B system system_ext product vendor \ # 核心分区 system_dlkm vendor_dlkm odm odm_dlkm \ # 内核模块分区 vbmeta vbmeta_system vbmeta_system_dlkm vbmeta_vendor_dlkm # AVB 签名 ``` **mysystem.mk — VABC 压缩:** ```makefile $(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk) PRODUCT_VIRTUAL_AB_COMPRESSION_METHOD := lz4 # LZ4 压缩 PRODUCT_VIRTUAL_AB_COW_VERSION := 3 # COW v3 PRODUCT_VIRTUAL_AB_COMPRESSION_FACTOR := 65536 ``` **device.mk — 运行时组件:** ```makefile PRODUCT_PACKAGES += update_engine update_engine_client update_verifier snapshotctl AB_OTA_POSTINSTALL_CONFIG += snapshot_hook_post_resume snapshot_hook_pre_suspend ``` ### 哪些分区需要 A/B? | 需要 A/B(有 slotselect) | 不需要 A/B | |--------------------------|------------| | boot, init_boot, vendor_boot | **misc**(BCB 跨槽共享) | | system, vendor, product, system_ext, odm | **userdata**(用户数据) | | system_dlkm, vendor_dlkm, odm_dlkm | **metadata**(加密密钥) | | vbmeta, vbmeta_system, vbmeta_*_dlkm | **cache**(临时数据) | --- ## Android 16 特定配置 ### Soong 产品格式 Android 16 使用 `COMMON_LUNCH_CHOICES` 替代传统的 `vendorsetup.sh`: ```makefile # AndroidProducts.mk PRODUCT_MAKEFILES := mysystem:$(LOCAL_DIR)/mysystem.mk # Soong 格式(名称:路径) COMMON_LUNCH_CHOICES := mysystem-trunk_staging-userdebug \ # trunk_staging 是 AOSP 主干构建类型 mysystem-trunk_staging-user mysystem-trunk_staging-eng ``` lunch 时使用: ```bash lunch mysystem-trunk_staging-userdebug ``` ### TARGET_COPY_OUT 分区映射 Android 16 需要显式声明分区输出目录: ```makefile TARGET_COPY_OUT_VENDOR := vendor TARGET_COPY_OUT_PRODUCT := product TARGET_COPY_OUT_SYSTEM_EXT := system_ext TARGET_COPY_OUT_ODM := odm TARGET_COPY_OUT_VENDOR_DLKM := vendor_dlkm TARGET_COPY_OUT_SYSTEM_DLKM := system_dlkm TARGET_COPY_OUT_ODM_DLKM := odm_dlkm ``` ### 产品基类 Android 16 推荐使用模块化基类而非 `gsi_common`: ```makefile $(call inherit-product, $(SRC_TARGET_DIR)/product/generic_system.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/handheld_system_ext.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/telephony.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/virtual_ab_ota/vabc_features.mk) ``` ## 设计决策 | 决策 | 理由 | |------|------| | erofs 作为默认文件系统 | Android 13+ 推荐,只读压缩性能最优 | | AVB 使用独立 vbmeta_system_dlkm | Android 14+ 要求 system_dlkm 独立签名 | | misc 不参与 AVB 签名 | 运行时内容会变化,无法做哈希校验 | | 16K 页面对齐 | 未启用 `BOARD_KERNEL_PATH_16K`,待内核确认 | | Virtual A/B OTA | 启用 `PRODUCT_VIRTUAL_AB_OTA`,Android 11+ 标准 | | Boot header v4 | Android 12+ 标准格式 | | Soong PRODUCT_MAKEFILES | Android 16 新格式,名称:路径语法 | | COMMON_LUNCH_CHOICES | Android 16 替代 vendorsetup.sh | | trunk_staging 构建类型 | AOSP 主干开发构建类型 | | VABC (Virtual A/B Compression) | LZ4 压缩 COW 快照,减少 OTA 空间 | | COW v3 | Android 15+ 最新 COW 版本,支持 io_uring 加速 | | update_engine snapshot hooks | OTA 前后快照管理钩子 | | generic_system + handheld_system_ext | 替代 gsi_common,模块化基类 | | TARGET_COPY_OUT_* | Android 16 显式分区输出目录映射 | --- > 本文档由 Hermes Agent 于 2026-06-16 生成并随代码一起维护。