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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章