什么是特权应用

特权应用(Privileged Application 简称 priv-app)

直观的讲就是位于系统priv-app目录下的应用,比如/system/priv-app/、/system/product/priv-app/目录下的APP

Android系统的特许权限

Android系统的特许权限是指在framework AndroidManifestCar AndroidManifest 中定义,等级为privileged的权限

<permission android:name="android.permission.KEYPHRASE_ENROLLMENT_APPLICATION"
         android:protectionLevel="signature|privileged" />

特许权限白名单

简单的说就是priv-app有用到frameworks/base/core/res/AndroidManifest.xml里定义的特许权限,就必须要把这个权限加到白名单中,避免预置应用权限没通过系统审核。

白名单限制宏开关

在启动新设备时,可通过启用过渡日志模式来查找缺少的权限。

ro.control_privapp_permissions=log

违规行为会在日志文件中予以报告。

所有违规行为均必须通过将应用加入白名单来予以解决。如果未加入,这些应用将不会被授予缺少的权限,即使它们位于 priv-app 路径中也是如此。

Android P后,当设置ro.control_privapp_permissions=enforce时,若特权应用需要的特许权限没有在添加白名单,那么系统会一直卡在开关机动画,无法进入系统。

若需要检测应用是否会影响开机,可将build.prop文件里ro.control_privapp_permissions属性值设为enforce。

日志打印

priv-app使用了特许权限,没有加入白名单,导致无法开机,如下日志

09-04 11:10:41.320   927   927 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
09-04 11:10:41.320   927   927 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {*****: android.permission.READ_NETWORK_USAGE_HISTORY, *****: android.permission.CLEAR_APP_CACHE, *****: android.permission.ACCESS_NETWORK_CONDITIONS, *****: android.permission.WRITE_SECURE_SETTINGS, *****: android.permission.DELETE_CACHE_FILES, *****: android.permission.BLUETOOTH_PRIVILEGED, *****: android.permission.MANAGE_USERS, *****: android.permission.READ_LOGS}
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:3091)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:125)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.systemReady(PermissionManagerService.java:3152)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:22423)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.SystemServer.startOtherServices(SystemServer.java:2066)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.SystemServer.run(SystemServer.java:543)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.server.SystemServer.main(SystemServer.java:372)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at java.lang.reflect.Method.invoke(Native Method)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
09-04 11:10:41.320   927   927 E AndroidRuntime:         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:960)

添加白名单

创建文件:

vendor/micar/frameworks/base/data/etc/car/privapp-permissions-platform.xml

 <privapp-permissions package="com.android.systemui.xml">
     <permission name="android.permission.INTERACT_ACROSS_USERS"/>
     <permission name="android.permission.MANAGE_USERS"/>
     <permission name="android.permission.MODIFY_PHONE_STATE"/>
     <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
     <permission name="android.permission.RECEIVE_EMERGENCY_BROADCAST"/>
 </privapp-permissions>

vendor/micar/frameworks/base/data/etc/car/Android.bp 下声明app权限模块

prebuilt_etc {
    name: "privapp_whitelist_com.android.systemui",
    sub_dir: "permissions",
    src: "com.android.systemui.xml",
    filename_from_src: true,
    system_ext_specific: true,// 按需配置,是否要预装到system_ext目录下
}

bp 或 mk 文件引用

android_app {
    name: "CarSystemUI",
    required: ["privapp_whitelist_com.android.systemui"]
}

mk

include $(CLEAR_VARS)
LOCAL_MODULE := CarSystemUI
LOCAL_REQUIRED_MODULES := privapp_whitelist_com.android.systemui
include $(BUILD_PREBUILT)

解耦应用放在解耦的仓库:

vendor/micar/prebuilts/packages/data/etc/com.micar.xxx.xml

vendor/micar/prebuilts/packages/data/etc/Android.bp

QA

  1. 查询配置是否生效?

白名单添加必须遵循:特权应用在哪个分区,对应的白名单文件就放在哪个分区

  1. priv-app在system分区,白名单文件就必须放在/system/etc/permissions/目录
  2. priv-app在product分区,白名单文件就必须放在/product/etc/permissions/目录
  3. priv-app在vendor分区,白名单文件就必须放在/vendor/etc/permissions/目录

📥 抓取自飞书 wiki 空间 7541192071952990209(车机座舱知识库),obj_token: SlbEdN9GHou3eqxUVWecShKBnjd