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

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
  1.  // xxx apk  
  2. PackageParser.Package xxxPackage = null;  
  3. xxxPackage= getSystemPackageLPr("com.xxx.yyy");  
  4. if (xxxPackage != null  
  5.         && doesPackageSupportRuntimePermissions(xxxPackage)) {  
  6.     grantRuntimePermissionsLPw(xxxPackage, CONTACTS_PERMISSIONS, userId);  
  7.     grantRuntimePermissionsLPw(xxxPackage, LOCATION_PERMISSIONS, userId);  
  8.     grantRuntimePermissionsLPw(xxxlPackage, PHONE_PERMISSIONS, userId);  
  9.     grantRuntimePermissionsLPw(xxxPackage, STORAGE_PERMISSIONS, userId);  
  10. }  
上述改法会引起GTS:com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrants过不了。
既要预设权限,又要保证GTS pass,下面介绍一种方法规避次问题:
1. 确认gts 工具(我的最新版本-gts-4.1_r2-3911033.zip)
2. 确认DefaultPermissionGrantPolicyTest所在代码

[plain]  view plain  copy
  1. android-gts$ grep -rn "Permission" testcases/  
  2. testcases/GtsPermissionTestCases.config:19:        <option name="test-file-name" value="GtsPermissionTestCases.apk" />  
  3. 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
  1. 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
  1. for (StackTraceElement i : Thread.currentThread().getStackTrace()){  
  2.     Log.i(TAG, "" + i);  
  3. }  
相关log就不贴出来了,自己也可以尝试。


ApplicationPackageManager类中有个上下文private final ContextImpl mContext;就知道是哪个app获取PackageManager的对象(getPackageManager)
mContext这个很关键,能区分gts测试apk调用的这个函数,还是其他正常调用这个函数,直接贴代码

[java]  view plain  copy
  1. @Override  
  2. public int checkPermission(String permName, String pkgName) {  
  3.     try {  
  4.         String taker = mContext.getPackageName();  
  5.         if ("com.google.android.permission.gts".equals(taker)) {  
  6.             String[] whiteLists = new String[] { "com.xxx.yyy"};  
  7.             for (String pkg : whiteLists) {  
  8.                 if (pkg.equals(pkgName)) {  
  9.                     return PERMISSION_DENIED;  
  10.                 }  
  11.             }  
  12.         }  
  13.         return mPM.checkPermission(permName, pkgName, mContext.getUserId());  
  14.     } catch (RemoteException e) {  
  15.         throw new RuntimeException("Package manager has died", e);  
  16.     }  
  17. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值