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默認權限在該函數倒數第二行加上
- // 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 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" />
搜索關鍵字“cannot be granted by default to”,往上看發現
- invoke-virtual {v11, v15, v0}, Landroid/content/pm/PackageManager;->checkPermission(Ljava/lang/String;Ljava/lang/String;)I
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);
- }
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);
- }
- }