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

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

2017-07-03 10:43 615 查看
Android M运行时权限,不了解的请看相关文章 http://blog.csdn.net/showdy/article/details/51883296
app默认权限管理的代码在DefaultPermissionGrantPolicy.java文件、grantDefaultSystemHandlerPermissions函数

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

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

// 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所在代码
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”,往上看发现
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信息,看是谁调用的
for (StackTraceElement i : Thread.currentThread().getStackTrace()){
Log.i(TAG, "" + i);
}

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

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

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

@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);
}
}
代码很简单就不做过多解释了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐