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所在代码
大概可以确定相关测试代码在 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信息,看是谁调用的
相关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);
}
}
代码很简单就不做过多解释了。
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);
}
}
代码很简单就不做过多解释了。
相关文章推荐
- com.google.android.permission.gts.DefaultPermissionGrantPolicyTest#testDefaultGrants
- gtx com.google.android.xts.permissions.DefaultPermissionGrantPolicyTest -- testDefaultGrants fail
- GTS DefaultPermissionGrantPolicyTest测试失败原因分析
- com.google.android.gts.backup.BackupHostTest#testGmsBackupTransportIsDefault
- com.google.android.gts.placement.CoreGmsAppsTest#testCoreGmsAppsPreloaded fail
- GTS fail: com.google.android.gts.afw.AfwRequiredAppsOverlaysTest - testDialerRequiredManagedDeviceOv
- com.google.android.xts.devicepolicy.DeviceOwnerTest#testFactoryResetProtection fail
- com.google.android.xts.devicepolicy.DeviceOwnerTest--testUserManagement fail
- com.google.android.gts.afw.AfwRequiredAppsOverlaysTest - testDialerRequiredManagedDeviceOverlay fail
- GTS:com.google.android.installpackageswhitelist.gts.GtsInstallPackagesWhitelistDeviceTest#testInstal
- android GTS-- com.google.android.xts.placement.UiPlacementTest fail
- com.google.android.afw.gts.AfwSupportTest#testManagedProfileSupported
- com.google.android.afwtest.nonsuwpoprovisioning.NonSuwPoProvisioningTest#testNonSuwPoProvisioning fa
- com.google.android.xts.location.LocationHostTest--testSetting fail
- com.android.cts.devicepolicy.ManagedProfileTest -- testAppLinks
- java.lang.SecurityException: Permission Denial: opening provider com.google.android.apps.photos.con
- GTS Fail修改集锦com.google.android.xts.afw.AfwRequiredAppsOverlaysTest
- Android排错:has leaked window com.android.internal.policy.impl.PhoneWindow$ that was originally added
- 解决:Failed to fetch URL https://dl-ssl.google.com/android/repository/addons_li ..
- Android - Failed to find provider info for com.google.settings in MapView Example