当前位置:   article > 正文

GTS DefaultPermissionGrantPolicyTest测试失败原因分析_android gts cannot be granted by default to packag

android gts cannot be granted by default to package

展讯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,会看到类似如下的代码:   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52





如果出现类似以上的情形,应该是该手机版本在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);//去掉这一行
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

去掉 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)的实现改为如下内容:
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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
  • 2
  • 3
  • 4
  • 5

(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,请上传该文件。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/261325
推荐阅读
相关标签
  

闽ICP备14008679号