01 - 解耦 APK 集成机制
维度:MiCarSettings 主 APK 如何以 prebuilt 形式集成进整机 image 核心文件:
vendor/micar/prebuilts/packages/Android.mk、products_*.mk
一、解耦的本质
MiCarSettings 在整机源码里没有源码、没有 apk,只有:
packages/apps/Car/MiCarSettingsExt(扩展库,android_library)packages/apps/Settings/MiCarSettingsExt(扩展库)vendor/micar/packages/apps/MiCarSettingsRRO(资源覆盖 Overlay)
主 apk 由 vendor/micar/prebuilts/packages/ 的 prebuilt 机制集成:编译时 sync_maven_apk.py 从 maven 拉到 apps/MiCarSettings.apk,Android.mk 把它 BUILD_PREBUILT 进 image。
二、Prebuilt 定义(Android.mk:1435-1450)
# MiCarSettings
include $(CLEAR_VARS)
LOCAL_MODULE := MiCarSettings
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_PRIVILEGED_MODULE := true # 特权应用 → priv-app
LOCAL_PRODUCT_MODULE := true # product 分区
LOCAL_OVERRIDES_PACKAGES += Settings # 覆盖原生 Settings
LOCAL_CERTIFICATE := platform # platform 签名
LOCAL_SRC_FILES := apps/MiCarSettings.apk # sync 拉下来的 apk
LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.car.settings
LOCAL_MODULE_TARGET_ARCH := $(my_src_arch)
LOCAL_DEX_PREOPT := false
LOCAL_ENFORCE_USES_LIBRARIES := false
include $(BUILD_PREBUILT)关键配置解析
| 配置 | 值 | 含义 |
|---|---|---|
LOCAL_MODULE | MiCarSettings | 模块名 |
LOCAL_SRC_FILES | apps/MiCarSettings.apk | apk 路径(sync 拉取目标) |
LOCAL_PRIVILEGED_MODULE | true | 特权 → 装到 priv-app |
LOCAL_PRODUCT_MODULE | true | product 分区 |
LOCAL_CERTIFICATE | platform | platform 签名(系统应用) |
LOCAL_OVERRIDES_PACKAGES | Settings | 覆盖 AOSP 原生 Settings |
LOCAL_REQUIRED_MODULES | privapp_whitelist_com.android.car.settings | 依赖权限白名单 |
LOCAL_DEX_PREOPT | false | 不预优化(371MB apk) |
最终分区路径:/product/priv-app/MiCarSettings/MiCarSettings.apk(priv-app + product,两个 flag 共同决定)。
三、Product Packages 注册
MiCarSettings 在三个 product mk 都注册(对应不同平台/分区):
| 文件 | 行号 | 适用 | 注释要点 |
|---|---|---|---|
products_product.mk | 59 | XCD 通用 → product 分区 | YU7(suiren)走这条 |
products_system.mk | 66 | 通用 system_ext | 保证 LOCAL_OVERRIDES_PACKAGES 生效 |
products_dcd.mk | 11 | DCD 老平台(_gvmq) | YU7 不用 |
products_product.mk:3-4注释明确:此处 PRODUCT_PACKAGES 实际装 product 分区,用途是保证编译时LOCAL_OVERRIDES_PACKAGES生效。
Device include 链路
device/xiaomi/suiren/product/native/miproduct_suiren_native.mk:11
-include device/micar/common/product/product_common.mk
:33 $(call inherit-product-if-exists, $(MICAR_VENDOR_ROOT)/prebuilts/packages/products_product.mk)
:59 PRODUCT_PACKAGES += MiCarSettings
四、权限白名单(privapp-whitelist)
文件:vendor/micar/frameworks/base/data/etc/car/com.android.car.settings.xml
Android.bp:vendor/micar/frameworks/base/data/etc/car/Android.bp
prebuilt_etc {
name: "privapp_whitelist_com.android.car.settings",
src: "com.android.car.settings.xml",
...
}赋予 com.android.car.settings 70+ 项系统级权限:MANAGE_USERS、MANAGE_DEVICE_ADMINS、WRITE_SECURE_SETTINGS、CAR_CONTROL_* 等。这是 MiCarSettings 作为 priv-app 能调用系统 API 的前提。
五、集成数据流
flowchart TD A["sync_maven_apk.py 拉取"] --> B["apps/MiCarSettings.apk"] B --> C["Android.mk:1435 BUILD_PREBUILT"] C --> D["LOCAL_MODULE=MiCarSettings<br/>LOCAL_CERTIFICATE=platform"] D --> E["products_product.mk:59<br/>PRODUCT_PACKAGES += MiCarSettings"] E --> F["product_common.mk:33<br/>inherit-product"] F --> G["miproduct_suiren_*.mk<br/>-include product_common.mk"] G --> H["整机 product.img<br/>/product/priv-app/MiCarSettings/"] I["com.android.car.settings.xml<br/>privapp-whitelist"] --> H style A fill:#e1f5e1 style H fill:#e1e1ff style I fill:#fff3e0
六、Ext / RRO 与主 apk 的关系
- MiCarSettingsExt(
packages/apps/Car/MiCarSettingsExt,android_library):编译期依赖库,被其他模块引用,不是独立 apk - MiCarSettingsRRO(
vendor/micar/packages/apps/MiCarSettingsRRO):Runtime Resource Overlay,运行时覆盖主 apk 资源,装到/product/overlay/,按车型选res/<车型>/(YU7 用res/suiren/) - 主 apk:从 maven 拉,是最终运行的应用
三者协作:主 apk(功能)+ Ext(编译期扩展)+ RRO(运行时资源覆盖)。
七、关键源码行号索引
| 内容 | 文件:行号(yu7 根下) |
|---|---|
| MiCarSettings BUILD_PREBUILT | vendor/micar/prebuilts/packages/Android.mk:1435-1450 |
| apk 源文件 | 同上 LOCAL_SRC_FILES := apps/MiCarSettings.apk |
| sync_maven_apk.py 调用 | vendor/micar/prebuilts/packages/Android.mk:46/64/72 |
| PRODUCT_PACKAGES(XCD) | vendor/micar/prebuilts/packages/products_product.mk:59 |
| PRODUCT_PACKAGES(DCD) | vendor/micar/prebuilts/packages/products_dcd.mk:11 |
| device inherit | device/micar/common/product/product_common.mk:33 |
| privapp-whitelist | vendor/micar/frameworks/base/data/etc/car/com.android.car.settings.xml |
| RRO | vendor/micar/packages/apps/MiCarSettingsRRO/Android.mk |