赞
踩
展讯FAQ95979:
我们在进行Google GTS DefaultPermissionGrantPolicyTest测试时,有时会遇见类似如下的报错log:
failed: testDefaultGrants(com.google.android.xts.permissions.DefaultPermissionGrantPolicyTest)
Permission:android.permission.ACCESS_COARSE_LOCATION cannot be granted by default to package:com.android.camera2
I TestRunner:
Permission:android.permission.ACCESS_FINE_LOCATION cannot be granted by
default to package:com.android.camera2
下面就以上面的Camera应用的LOCATION_PERMISSIONS权限报错为例,分析如何解决GTS DefaultPermissionGrantPolicyTest报错问题。GTS DefaultPermissionGrantPolicyTest 出错的原因可以归纳为四类,您可以逐一排查解决。 1、跑GTS测试前已经手动授予了该权限 有时候在跑GTS测试前曾经打开过该应用,而该应用会有提示框问是否允许授予某个权限,当您同意之后再跑GTS测试时就会失败。 排查是该原因导致GTS测试失败的方法:请将手机恢复出厂设置,然后单测case DefaultPermissionGrantPolicyTest,请注意在这次跑GTS测试前,如果弹出了权限申请的对话框,一定要点拒绝,否则会导致GTS测试失败!如果测试成功,说明是该原因导致的,否则的话请进行下面的排查。 2、在DefaultPermissionGrantPolicy.java文件中修改了权限相关的代码 有时候您在源码/frameworks/base/services/core/java/com/android/server/pm/目录下的DefaultPermissionGrantPolicy.java中添加了权限相关的代码,给应用多授予了权限,如下所示: 原始版本代码: // Camera Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr( cameraIntent, userId); if (cameraPackage != null && doesPackageSupportRuntimePermissions(cameraPackage)) { grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId); grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId); grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId); } 修改后版本代码: // Camera Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr( cameraIntent, userId); if (cameraPackage != null && doesPackageSupportRuntimePermissions(cameraPackage)) { grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId); grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId); grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId); grantRuntimePermissionsLPw(cameraPackage, LOCATION_PERMISSIONS, userId);//新加的代码 } 如上所示,给Camera应用添加了授予LOCATION_PERMISSIONS权限的逻辑,会导致GTS 测试失败。 排查是该原因导致GTS测试失败的方法:直接打开DefaultPermissionGrantPolicy.java文件或者使用Beyond Compare、meld等对比工具比较新旧版本的差异,撤销所有对权限相关的代码修改。然后,在frameworks/base/services/目录下mm ,编译生成serivces.jar,将其push 至手机的system/framework/目录中,之后手机恢复出厂设置,然后单测case DefaultPermissionGrantPolicyTest,请注意在这次跑GTS测试前,如果弹出了权限申请的对话框,一定要点拒绝,否则会导致GTS测试失败!如果成功,说明是该原因导致的,否则的话请进行下面的排查。 3、版本编译出了sprd-app-perms.xml 请将手机连接电脑,然后使用命令 adb shell , ls system/etc ,看看system/etc目录下是否存在sprd-app-perms.xml文件,存在的话使用命令 busybox vi ls system/etc/sprd-app-perms.xml,会看到类似如下的代码:
如果出现类似以上的情形,应该是该手机版本在system/etc目录下编译出了sprd-app-perms.xml,正常情况下只有CMCC版本才会编译出该文件。
排查是该原因导致GTS测试失败的方法:打开源码/frameworks/base/services/core/java/com/android/server/pm/目录下的DefaultPermissionGrantPolicy.java,找到函数grantDefaultPermissions(int userId)的实现如下:
public void grantDefaultPermissions(int userId) {
grantPermissionsToSysComponentsAndPrivApps(userId);
grantDefaultSystemHandlerPermissions(userId);
grantSprdSystemPermissions(userId);//去掉这一行
}
去掉 grantSprdSystemPermissions(userId);这一行代码,即函数grantDefaultPermissions(int userId)的实现变成:
public void grantDefaultPermissions(int userId) { grantPermissionsToSysComponentsAndPrivApps(userId); grantDefaultSystemHandlerPermissions(userId); } 然后在frameworks/base/services/目录下mm ,编译生成serivces.jar,将其push 至手机的system/framework/目录中,之后手机恢复出厂设置,然后单测case DefaultPermissionGrantPolicyTest,请注意在这次跑GTS测试前,如果弹出了权限申请的对话框,一定要点拒绝,否则会导致GTS测试失败!如果测试成功,说明是该原因导致的,否则的话请进行下面的排查。 4、在手机里面预置了多个同种功能的应用 在6.0版本中,有时候您在编译版本时预置了多个同种功能的应用,例如预置了两个music应用,并且使用的GTS测试包是3.0_r2及以上的版本,再去跑GTS测试,有可能会fail。 排查是该原因导致GTS测试失败的方法:看看您的手机里面是否多预置以下的同种功能的应用:Music、 Camera 、 Email 、Browser、 Gallery 、Maps 、Calendar、Contacts、 Dialer、SMS 、SetupWizard、 Cell Broadcast Receiver、Carrier Provisioning Service、Device provisioning 、Downloads UI CertInstaller,可以删除多预置的应用,之后编译新的版本进行烧机,然后单测case DefaultPermissionGrantPolicyTest,如果成功,说明是该原因导致的。 如果您既想保留预置的多个同种功能的应用又想通过GTS测试,可以使用以下方案: 在6.0源码/frameworks/base/services/core/java/com/android/server/pm/目录下的DefaultPermissionGrantPolicy.java中,将函数getDefaultSystemHandlerActivityPackageLPr( Intent intent, int userId)的实现改为如下内容:
private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr(
Intent intent, int userId) {
ResolveInfo handler = mService.resolveIntent(intent,
intent.resolveType(mService.mContext.getContentResolver()),
PackageManager.GET_DISABLED_COMPONENTS, userId);
if (handler == null || handler.activityInfo == null) {
return null;
}
ActivityInfo activityInfo = handler.activityInfo;
if (activityInfo.packageName.equals(mService.mResolveActivity.packageName)
&& activityInfo.name.equals(mService.mResolveActivity.name)) {
return null;
}
return getSystemPackageLPr(handler.activityInfo.packageName);
}
修改后,在frameworks/base/services/目录下mm ,编译生成serivces.jar,将其push 至手机的system/framework/目录中,之后手机恢复出厂设置,然后单测case DefaultPermissionGrantPolicyTest,请注意在这次跑GTS测试前,如果弹出了权限申请的对话框,一定要点拒绝,否则会导致GTS测试失败!
如果经过以上四步排查,GTS DefaultPermissionGrantPolicyTest测试失败的问题依然还不能解决,您可以另提CQ,同时你可以向展讯FAE提供如下文件以更好地解决该问题,
(1)在GTS DefaultPermissionGrantPolicyTest 失败的手机上执行 adb shell dumpsys package com.android.XXX > dumppackage.txt,上传dumppackage.txt;
(2)将源码frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java文件上传;
(3)如果手机system/etc/目录下有sprd-app-perms.xml,请上传该文件。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。