怎么给预置应用默认赋予动态权限?
[ANSWER]
请注意,我们给出的方案会导致google GTS权限相关的case测试失败!如果需要过GTS测试的话请不要使用该方案。
Android6.0上新加了runtime权限机制。Android对于normal型的权限在安装应用时会默认授予权限,而对于一些重要的dangerous权限如STORAGE、LOCATION等,除非在framework层中默认赋予了权限,如果要使用这些权限的话需要在应用运行时弹出提示框让用户确认授予这些权限。
dangerous权限分为9个组:
CALENDAR 组:
READ_CALENDAR
WRITE_CALENDAR
CAMERA组:
CAMERA
CONTACTS组:
READ_CONTACTS
WRITE_CONTACTS
GET_ACCOUNTS
LOCATION组:
ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATION
MICROPHONE组:
RECORD_AUDIO
PHONE组:
READ_PHONE_STATE
CALL_PHONE
READ_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS
SENSORS组:
BODY_SENSORS
SMS组:
SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_WAP_PUSH
RECEIVE_MMS
STORAGE组:
READ_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGE
请注意,本方案要求应用必须是预置在版本中的,对用户后面自己安装的应用不适用。
在使用本方案时,请先确定您的pac包版本是否是CMCC版本,确定方法:手机连上电脑,adb shell , cd system/etc/ ,查看当前目录下有没有sprd-app-perms.xml文件,有的话说明是CMCC版本,否则不是。
1、针对CMCC版本,可以在源码的sprd-app-perms.xml文件中做配置然后整体编译即可。 sprd-app-perms.xml文件的位置在源码下的vendor/sprd/operator/cmcc/permission/ 目录下,该文件中的作用是给指定的应用赋予指定的runtime动态权限。sprd-app-perms.xml的内容如下:
<?xml version='1.0' encoding='utf-8' ?>
<perms>
<package name="com.android.launcher3">
<use-perm name="android.permission.READ_PHONE_STATE" />
<use-perm name="android.permission.READ_SMS" />
</package>
</perms>
可以参照上面的launcher3的格式做修改如下所示
<?xml version='1.0' encoding='utf-8' ?>
<perms>
<package name="com.android.launcher3">
<use-perm name="android.permission.READ_PHONE_STATE" />
<use-perm name="android.permission.READ_SMS" />
</package>
<package name="com.android.XXX">
<use-perm name="android.permission.XXX" />
<use-perm name="android.permission.XXX" />
</package>
</perms>
其中package name项com.android.XXX改为APK的包名,use-perm name项 android.permission.XXX中改为该APK需要使用的runtime权限的名称(只需要配置上面9个group中的权限,其余的非动态权限会被自动授权所以不用考虑)。
配置好后可以便可以整体编译,烧pac包至手机中,开机后可以打开 设置-->应用-->该应用-->权限,查看配置的权限开关是否已经打开。如果出现应用的权限部分出现灰显状态(跟Setting应用的逻辑有关,该应用配置了shareduserId),,可以使用命令 adb shell dumpsys package 该应用的包名> dumpsys.txt ,打开dumpsys.txt文件,看看"runtime permissions" 那一行下面如果出现类似 "android.permission.READ_EXTERNAL_STORAGE: granted=true "这样的内容即说明该权限已经被默认授权。
2、针对非CMCC版本
解决方案分为以下三个步骤:
(1)在sprd-app-perms.xml文件中配置需要赋予动态权限的应用的包名。
类似地,在源码下的vendor/sprd/operator/cmcc/permission/ sprd-app-perms.xml文件中参照launcher3的格式做修改。请注意,把从<package name="com.android.launcher3"> 到 </package>间的原来的内容删除!
即sprd-app-perms.xml文件最后的内容为:
<?xml version='1.0' encoding='utf-8' ?>
<perms>
<package name="com.android.XXX">
<use-perm name="android.permission.XXX" />
<use-perm name="android.permission.XXX" />
</package>
</perms>
其中package name项com.android.XXX改为APK的包名,use-perm name项android.permission.XXX中改为该APK需要使用的runtime权限的名称(只需要配置上面9个group中的权限,其余的非动态权限会被自动授权所以不用考虑)。
(2)您需要在源码的device/sprd/scx35l/common目录下打开所有的.mk文件,找到包含PRODUCT_COPY_FILES的那几个,由于我们不清楚您那边的目录结构,所以需要您下面的代码加到其中的一个.mk文件的结尾中(可以先试device.mk),
DEFAULT_RUNTIME_PERMISSION_FILES := vendor/sprd/operator/cmcc/permission/sprd-app-perms.xml
ifneq ($(wildcard $(DEFAULT_RUNTIME_PERMISSION_FILES)),)
PRODUCT_COPY_FILES += \
$(DEFAULT_RUNTIME_PERMISSION_FILES):system/etc/sprd-app-perms.xml
endif
整体编译后看源码out目录的system/etc目录下是否生成sprd-app-perms.xml,生成的话说明修改生效走下一步,否则请在另外的.mk文件中修改,再做同样的操作;
(3)配置好后可以便可以整体编译,烧pac包至手机中,开机后可以打开 设置-->应用-->该应用-->权限,查看配置的权限开关是否已经打开。如果出现应用的权限部分出现灰显状态(跟Setting应用的逻辑有关,该应用配置了shareduserId),可以使用命令 adb shell dumpsys package 该应用的包名> dumpsys.txt ,打开dumpsys.txt文件,看看"runtime permissions" 那一行下面如果出现类似 "android.permission.READ_EXTERNAL_STORAGE: granted=true "这样的内容即说明该权限已经被默认授权。
以上就是给预置应用默认赋予动态权限方案的完整内容。
请注意,我们给出的方案会导致google GTS权限相关的case测试失败!如果需要过GTS测试的话请不要使用该方案。