您的位置:首页 > 移动开发 > Android开发

com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrants

2017-07-03 17:43 417 查看
gts-4.1_r2 GTS测试
com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrants
fail

分析和处理流程:
app默认权限管理的代码在DefaultPermissionGrantPolicy.Java文件、grantDefaultSystemHandlerPermissions函数

文件路径:frameworks/base/services/core/java/com/android/server/pm/

给某个apk默认权限在该函数倒数第二行加上

[java] view
plain copy

 // xxx apk  

PackageParser.Package xxxPackage = null;  

xxxPackage= getSystemPackageLPr("com.xxx.yyy");  

if (xxxPackage != null  

        && doesPackageSupportRuntimePermissions(xxxPackage)) {  

    grantRuntimePermissionsLPw(xxxPackage, CONTACTS_PERMISSIONS, userId);  

    grantRuntimePermissionsLPw(xxxPackage, LOCATION_PERMISSIONS, userId);  

    grantRuntimePermissionsLPw(xxxlPackage, PHONE_PERMISSIONS, userId);  

    grantRuntimePermissionsLPw(xxxPackage, STORAGE_PERMISSIONS, userId);  

}  

上述改法会引起GTS:com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrants过不了。

既要预设权限,又要保证GTS pass,下面介绍一种方法规避次问题:

1. 确认gts 工具(我的最新版本-gts-4.1_r2-3911033.zip)

2. 确认DefaultPermissionGrantPolicyTest所在代码

[plain] view
plain copy

android-gts$ grep -rn "Permission" testcases/  

testcases/GtsPermissionTestCases.config:19:        <option name="test-file-name" value="GtsPermissionTestCases.apk" />  

testcases/GtsPermissionTestCases.config:23:        <option name="config-filename" value="GtsPermissionTestCases" />  

 大概可以确定相关测试代码在 GtsPermissionTestCases.apk 中,反编译该apk,大体看下DefaultPermissionGrantPolicyTest.java或DefaultPermissionGrantPolicyTest.smail,路径:com/google/android/permission/gts

搜索关键字“cannot be granted by default to”,往上看发现

[plain] view
plain copy

invoke-virtual {v11, v15, v0}, Landroid/content/pm/PackageManager;->checkPermission(Ljava/lang/String;Ljava/lang/String;)I  

就是调用PackageManager类的checkPermission函数。

GTS该项不过,是因为apk的权限默认打开,所以只需将该函数checkPermission该apk时,返回PERMISSION_DENIED(没授权)即可。

PackageManager是个抽象类(public abstract class PackageManager {...),checkPermission具体实现在ApplicationPackageManager.java

中,调试时在checkPermission中添加log信息,看是谁调用的

[java] view
plain copy

for (StackTraceElement i : Thread.currentThread().getStackTrace()){  

    Log.i(TAG, "" + i);  

}  

相关log就不贴出来了,自己也可以尝试。

ApplicationPackageManager类中有个上下文private final ContextImpl mContext;就知道是哪个app获取PackageManager的对象(getPackageManager)

mContext这个很关键,能区分gts测试apk调用的这个函数,还是其他正常调用这个函数,直接贴代码

[java] view
plain copy

@Override  

public int checkPermission(String permName, String pkgName) {  

    try {  

        String taker = mContext.getPackageName();  

        if ("com.google.android.permission.gts".equals(taker)) {  

            String[] whiteLists = new String[] { "com.xxx.yyy"};  

            for (String pkg : whiteLists) {  

                if (pkg.equals(pkgName)) {  

                    return PERMISSION_DENIED;  

                }  

            }  

        }  

        return mPM.checkPermission(permName, pkgName, mContext.getUserId());  

    } catch (RemoteException e) {  

        throw new RuntimeException("Package manager has died", e);  

    }  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  com.google.android.p
相关文章推荐