什么是特权应用
特权应用(Privileged Application 简称 priv-app)
直观的讲就是位于系统priv-app目录下的应用,比如/system/priv-app/、/system/product/priv-app/目录下的APP
Android系统的特许权限
Android系统的特许权限是指在framework AndroidManifest 和 Car 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
- 查询配置是否生效?
白名单添加必须遵循:特权应用在哪个分区,对应的白名单文件就放在哪个分区
- priv-app在system分区,白名单文件就必须放在/system/etc/permissions/目录
- priv-app在product分区,白名单文件就必须放在/product/etc/permissions/目录
- priv-app在vendor分区,白名单文件就必须放在/vendor/etc/permissions/目录
📥 抓取自飞书 wiki 空间 7541192071952990209(车机座舱知识库),obj_token: SlbEdN9GHou3eqxUVWecShKBnjd