签名权限没有申明导致机器起不来的问题

常见的一些signature|privileged permissions:
DELETE_PACKAGES
INSTALL_PACKAGES
MANAGE_USERS
UPDATE_APP_OPS_STATS
BATTERY_STATS
WRITE_SECURE_SETTINGS
WRITE_MEDIA_STORAGE
...
等等
这部分权限也需要在AndroidManifest文件中声明。
在AndroidManifest文件中声明后,需要在frameworks\base\data\etc\privapp-permissions-platform.xml中进行声明,格式如下:

<privapp-permissions package="com.android.packageinstaller">
    <permission name="android.permission.DELETE_PACKAGES"/>
    <permission name="android.permission.INSTALL_PACKAGES"/>
    <permission name="android.permission.USE_RESERVED_DISK"/>
    <permission name="android.permission.MANAGE_USERS"/>
    <permission name="android.permission.UPDATE_APP_OPS_STATS"/>
    <permission name="android.permission.SUBSTITUTE_NOTIFICATION_APP_NAME"/>
    <permission name="android.permission.PACKAGE_USAGE_STATS"/>
</privapp-permissions>

privapp-permissions-platform.xml的说明为:This XML file declares which signature|privileged permissions should be granted to privileged applications that come with the platform. 

另外,从Android 10开始,在frameworks\base\data\etc文件夹下新增了对应包名的xml文件来声明对应包名应用的签名/特权权限,如com.android.settings.xml,com.android.launcher3.xml,com.android.systemui.xml,com.android.dialer.xml等等。
这些文件最终被编译到系统的system/etc/permissions目录,在SystemConfig中被读取出来。

在SystemConfig中,这些文件中的权限信息即privapp-permissions标签内的内容,通过readPrivAppPermissions解读出来后存储在ArrayMap<String, ArraySet<String>> mPrivAppPermissions中。mPrivAppPermissions中保存的权限信息,通过getPrivAppPermissions来供别的类使用,主要在PermissionManagerService中被使用到。

如果在应用的AndroidManifest文件中声明了使用以上签名/特权权限,而又没有在privapp-permissions-platform.xml中进行声明,会出现以下报错并导致机器起不来:

04-24 06:11:41.367 11008 11008 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
04-24 06:11:41.367 11008 11008 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.android.dialer: android.permission.REAL_GET_TASKS}
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:2979)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:123)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.systemReady(PermissionManagerService.java:3040)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:21876)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.SystemServer.startOtherServices(SystemServer.java:2065)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.SystemServer.run(SystemServer.java:521)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.server.SystemServer.main(SystemServer.java:358)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
04-24 06:11:41.367 11008 11008 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:913)

两种修改方式:
1.临时修改(针对机器起不来):
(1)一般来说如果应用预置在system/app或是system/priv-app目录下,
则直接从机器pull出privapp-permissions-platform.xml文件然后看log缺少哪些权限,把相应的声明权限后再push进去,重启即可
adb pull /system/etc/permissions/privapp-permissions-platform.xml
adb push privapp-permissions-platform.xml /system/etc/permissions
重启即可
(2)如果应用预置在/system/product/app或是/system/product/priv-app目录下,则需要根据自己的包名,创建一个xxx.xxx.xxx.xml文件,然后看log缺少哪些权限,把相应的声明进去,再把这个xml文件push进去/system/product/etc/permissions目录,重启即可
如以com.xxx.systemupdate应用为例,先创建一个com.xxx.systemupdate.xml文件,里面权限声明如下:

<permissions>
    <privapp-permissions package="com.xxx.systemupdate">
        <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
        <permission name="android.permission.READ_PHONE_STATE"/>
    </privapp-permissions>
</permissions>

然后把这个com.xxx.systemupdate.xml文件push到/system/product/etc/permissions目录:
adb push com.xxx.systemupdate.xml /system/product/etc/permissions
重启即可

2.源码中修改(彻底改好)
(1)应用预置在system/app或是system/priv-app目录下,则可以直接在frameworks\base\data\etc\privapp-permissions-platform.xml中声明
(2)应用预置在/system/product/app或是/system/product/priv-app目录下,则需要创建自己的xxx.xxx.xxx.xml文件,如com.android.contacts.xml,里面声明自己的签名权限,然后在frameworks\base\data\etc\Android.bp文件中增加以下这段(仿照com.android.contacts即可):

prebuilt_etc {
    name: "privapp_whitelist_com.android.contacts", //改成自己的包名
    product_specific: true,
    sub_dir: "permissions",
    src: "com.android.contacts.xml", //改成自己的包名
    filename_from_src: true,
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值