01 - 解耦 APK 集成机制

维度:MiCarSettings 主 APK 如何以 prebuilt 形式集成进整机 image 核心文件:vendor/micar/prebuilts/packages/Android.mkproducts_*.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_MODULEMiCarSettings模块名
LOCAL_SRC_FILESapps/MiCarSettings.apkapk 路径(sync 拉取目标)
LOCAL_PRIVILEGED_MODULEtrue特权 → 装到 priv-app
LOCAL_PRODUCT_MODULEtrueproduct 分区
LOCAL_CERTIFICATEplatformplatform 签名(系统应用)
LOCAL_OVERRIDES_PACKAGESSettings覆盖 AOSP 原生 Settings
LOCAL_REQUIRED_MODULESprivapp_whitelist_com.android.car.settings依赖权限白名单
LOCAL_DEX_PREOPTfalse不预优化(371MB apk)

最终分区路径:/product/priv-app/MiCarSettings/MiCarSettings.apk(priv-app + product,两个 flag 共同决定)。


三、Product Packages 注册

MiCarSettings 在三个 product mk 都注册(对应不同平台/分区):

文件行号适用注释要点
products_product.mk59XCD 通用 → product 分区YU7(suiren)走这条
products_system.mk66通用 system_ext保证 LOCAL_OVERRIDES_PACKAGES 生效
products_dcd.mk11DCD 老平台(_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_USERSMANAGE_DEVICE_ADMINSWRITE_SECURE_SETTINGSCAR_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_PREBUILTvendor/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 inheritdevice/micar/common/product/product_common.mk:33
privapp-whitelistvendor/micar/frameworks/base/data/etc/car/com.android.car.settings.xml
RROvendor/micar/packages/apps/MiCarSettingsRRO/Android.mk