Signature|privileged permissions not in privapp-permissions whitelist异常处理

1、问题背景及现象

背景说明:

软件系统:Android 10
需求处理:SystemUI添加截屏录屏功能
问题现象:添加完修改后无法开机

SystemUI/AndroidManifest.xml 部分修改如下:

     <!-- Screen Recording -->
     <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"/>
+    <uses-permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"/>

由于添加完修改后卡在bootanimaton无法开机,通过分析开机log发现如下打印:

System	:	java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist:	{com.android.systemui:android.permission.CAPTURE_AUDIO_OUTPUT}
System	:	at com.android.server.pm.permissionManagerService.SystemReady(PermissionManagerService.java:2997)
System	:	at com.android.server.pm.permissionManagerService.access$100(PermissionManagerService.java:127)
System	:	at com.android.server.pm.permissionManagerService.$PermissionServiceInternalImpl.systemReady(PermissionManagerService.java:3058)
System	:	at com.android.server.pm.PackageManagerService.SystemReady(PackageManagerService.java:21895)
System	:	at com.android.server.SystemServer.start0therService(SystemServer.java:2066)
System	:	at com.android.server.SystemServer.run(SystemServer.java:518)
System	:	at com.android.server.SystemServer.main(SystemServer.java:355)
...

2、问题分析

从log分析来看,因为SystemUI中的android.permission.CAPTURE_AUDIO_OUTPUT特许权限不在privapp-permissions 白名单中,从而导致了PermissionManagerService在权限检查时抛出java.lang.IllegalStateException异常。
那为什么android.permission.CAPTURE_AUDIO_OUTPUT权限会导致该报出,而android.permission.CAPTURE_VIDEO_OUTPUT不会呢?
原来从Android9.0开始,特权分区/system, /product 和/vendor下的应用就属于特权应用,而SystemUI.apk位于/system/product/priv-app/ 属于特权应用。
从Android8.0 开始,特权应用要使用系统的特许权限,则需要把该特许权限添加至白名单中,那系统有哪些特许权限?如何添加到白名单呢?
系统的特许权限定义在以下路径,并且等级为signature|privileged
frameworks\base\core\res\AndroidManifest.xml

<!-- 系统录音权限 -->
<permission android:name="android.permission.CAPTURE_AUDIO_OUTPUT"
        android:protectionLevel="signature|privileged" />
 
<!-- 系统录视频权限 -->  
<permission android:name="android.permission.CAPTURE_VIDEO_OUTPUT"
        android:protectionLevel="signature" />

由此可见系统android.permission.CAPTURE_AUDIO_OUTPUT与android.permission.CAPTURE_VIDEO_OUTPUT的protectionLevel是不同的。
android:protectionLevel具体定义位于:
frameworks\base\core\res\res\values\attrs_manifest.xml

<attr name="protectionLevel">
	<flag name="signature" value="2" />
	<flag name="privileged" value="0x10" />
	...
</attr>

系统特许权限白名单源码位于:
frameworks/base/data/etc/ (对应设备路径/product/etc/permissions、/system/etc/permissions、/vendor/etc/permissions)

frameworks/base/data/etc$ ls -al
Android.bp
car
com.android.carrierconfig.xml
com.android.contacts.xml
com.android.dialer.xml
com.android.documentsui.xml
com.android.emergency.xml
com.android.launcher3.xml
com.android.provision.xml
com.android.settings.intelligence.xml
com.android.settings.xml
com.android.storagemanager.xml
com.android.systemui.xml
com.android.timezone.updater.xml
framework-sysconfig.xml
guide-package-whitelist.xml
hiddenapi-package-whitelist.xml
OWNERS
packages_whitelist.txt
platform.xml
privapp-permissions-platform.xml

在privapp-permissions-platform.xml和com.android.systemui.xml中并未声明android.permission.CAPTURE_AUDIO_OUTPUT权限

3、问题解决

通过上述分析我们知道特权应用SystemUI使用特权权限录音android.permission.CAPTURE_AUDIO_OUTPUT,因此需要将该添加至白名单即可,修改如下:
frameworks/base/data/etc/com.android.systemui.xml


或者直接修改设备的配置文件
/product/etc/permissions/com.android.systemui.xml

+ <permission name="android.permission.CAPTURE_AUDIO_OUTPUT"/>

验证顺利开机,SystemUI录屏功能正常。

参考链接:Android系统开发的特权白名单

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值