1. 程式人生 > >GTS DefaultPermissionGrantPolicyTest測試失敗原因分析

GTS DefaultPermissionGrantPolicyTest測試失敗原因分析

展訊FAQ95979:

我們在進行Google GTS DefaultPermissionGrantPolicyTest測試時,有時會遇見類似如下的報錯log:

failed: testDefaultGrants(com.google.android.xts.permissions.DefaultPermissionGrantPolicyTest)
Permission:android.permission.ACCESS_COARSE_LOCATION cannot be granted by default to package:com.android.camera2
I TestRunner:
Permission:android.permission.ACCESS_FINE_LOCATION cannot be granted by
default to package:com.android.camera2

 下面就以上面的Camera應用的LOCATION_PERMISSIONS許可權報錯為例,分析如何解決GTS DefaultPermissionGrantPolicyTest報錯問題。GTS DefaultPermissionGrantPolicyTest 出錯的原因可以歸納為四類,您可以逐一排查解決。



 1、跑GTS測試前已經手動授予了該許可權

有時候在跑GTS測試前曾經開啟過該應用,而該應用會有提示框問是否允許授予某個許可權,當您同意之後再跑GTS測試時就會失敗。

排查是該原因導致GTS測試失敗的方法:請將手機恢復出廠設定,然後單測case DefaultPermissionGrantPolicyTest,請注意在這次跑GTS測試前,如果彈出了許可權申請的對話方塊,一定要點拒絕,否則會導致GTS測試失敗!如果測試成功,說明是該原因導致的,否則的話請進行下面的排查。



2、在DefaultPermissionGrantPolicy.java檔案中修改了許可權相關的程式碼

有時候您在原始碼/frameworks/base/services/core/java/com/android/server/pm/目錄下的DefaultPermissionGrantPolicy.java中添加了許可權相關的程式碼,給應用多授予了許可權,如下所示:

原始版本程式碼:

        // Camera
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr(
                cameraIntent, userId);
        if (cameraPackage != null
                && doesPackageSupportRuntimePermissions(cameraPackage)) {
            grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId);
            grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId);
            grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId);
        }

修改後版本程式碼:

            // Camera
        Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        PackageParser.Package cameraPackage = getDefaultSystemHandlerActivityPackageLPr(
                cameraIntent, userId);
        if (cameraPackage != null
                && doesPackageSupportRuntimePermissions(cameraPackage)) {
            grantRuntimePermissionsLPw(cameraPackage, CAMERA_PERMISSIONS, userId);
            grantRuntimePermissionsLPw(cameraPackage, MICROPHONE_PERMISSIONS, userId);
            grantRuntimePermissionsLPw(cameraPackage, STORAGE_PERMISSIONS, userId);
            grantRuntimePermissionsLPw(cameraPackage, LOCATION_PERMISSIONS, userId);//新加的程式碼
        }

如上所示,給Camera應用添加了授予LOCATION_PERMISSIONS許可權的邏輯,會導致GTS 測試失敗。

排查是該原因導致GTS測試失敗的方法:直接開啟DefaultPermissionGrantPolicy.java檔案或者使用Beyond Compare、meld等對比工具比較新舊版本的差異,撤銷所有對許可權相關的程式碼修改。然後,在frameworks/base/services/目錄下mm ,編譯生成serivces.jar,將其push 至手機的system/framework/目錄中,之後手機恢復出廠設定,然後單測case DefaultPermissionGrantPolicyTest,請注意在這次跑GTS測試前,如果彈出了許可權申請的對話方塊,一定要點拒絕,否則會導致GTS測試失敗!如果成功,說明是該原因導致的,否則的話請進行下面的排查。



3、版本編譯出了sprd-app-perms.xml

請將手機連線電腦,然後使用命令 adb shell  , ls system/etc ,看看system/etc目錄下是否存在sprd-app-perms.xml檔案,存在的話使用命令 busybox vi ls system/etc/sprd-app-perms.xml,會看到類似如下的程式碼:   
如果出現類似以上的情形,應該是該手機版本在system/etc目錄下編譯出了sprd-app-perms.xml,正常情況下只有CMCC版本才會編譯出該檔案。

排查是該原因導致GTS測試失敗的方法:開啟原始碼/frameworks/base/services/core/java/com/android/server/pm/目錄下的DefaultPermissionGrantPolicy.java,找到函式grantDefaultPermissions(int userId)的實現如下:

public void grantDefaultPermissions(int userId) {
    grantPermissionsToSysComponentsAndPrivApps(userId);
    grantDefaultSystemHandlerPermissions(userId);
    grantSprdSystemPermissions(userId);//去掉這一行
}

去掉 grantSprdSystemPermissions(userId);這一行程式碼,即函式grantDefaultPermissions(int userId)的實現變成:

public void grantDefaultPermissions(int userId) {
    grantPermissionsToSysComponentsAndPrivApps(userId);
    grantDefaultSystemHandlerPermissions(userId);
}

然後在frameworks/base/services/目錄下mm ,編譯生成serivces.jar,將其push 至手機的system/framework/目錄中,之後手機恢復出廠設定,然後單測case DefaultPermissionGrantPolicyTest,請注意在這次跑GTS測試前,如果彈出了許可權申請的對話方塊,一定要點拒絕,否則會導致GTS測試失敗!如果測試成功,說明是該原因導致的,否則的話請進行下面的排查。



4、在手機裡面預置了多個同種功能的應用   

 在6.0版本中,有時候您在編譯版本時預置了多個同種功能的應用,例如預置了兩個music應用,並且使用的GTS測試包是3.0_r2及以上的版本,再去跑GTS測試,有可能會fail。

 排查是該原因導致GTS測試失敗的方法:看看您的手機裡面是否多預置以下的同種功能的應用:Music、 Camera 、 Email 、Browser、 Gallery 、Maps 、Calendar、Contacts、 Dialer、SMS 、SetupWizard、 Cell Broadcast Receiver、Carrier Provisioning Service、Device provisioning 、Downloads UI CertInstaller,可以刪除多預置的應用,之後編譯新的版本進行燒機,然後單測case DefaultPermissionGrantPolicyTest,如果成功,說明是該原因導致的。

如果您既想保留預置的多個同種功能的應用又想通過GTS測試,可以使用以下方案:

在6.0原始碼/frameworks/base/services/core/java/com/android/server/pm/目錄下的DefaultPermissionGrantPolicy.java中,將函式getDefaultSystemHandlerActivityPackageLPr( Intent intent, int userId)的實現改為如下內容:

private PackageParser.Package getDefaultSystemHandlerActivityPackageLPr(
Intent intent, int userId) {
ResolveInfo handler = mService.resolveIntent(intent,
intent.resolveType(mService.mContext.getContentResolver()),
PackageManager.GET_DISABLED_COMPONENTS, userId);
if (handler == null || handler.activityInfo == null) {
return null;
}
ActivityInfo activityInfo = handler.activityInfo;
if (activityInfo.packageName.equals(mService.mResolveActivity.packageName)
&& activityInfo.name.equals(mService.mResolveActivity.name)) {
return null;
}
return getSystemPackageLPr(handler.activityInfo.packageName);
}

修改後,在frameworks/base/services/目錄下mm ,編譯生成serivces.jar,將其push 至手機的system/framework/目錄中,之後手機恢復出廠設定,然後單測case DefaultPermissionGrantPolicyTest,請注意在這次跑GTS測試前,如果彈出了許可權申請的對話方塊,一定要點拒絕,否則會導致GTS測試失敗! 



如果經過以上四步排查,GTS  DefaultPermissionGrantPolicyTest測試失敗的問題依然還不能解決,您可以另提CQ,同時你可以向展訊FAE提供如下檔案以更好地解決該問題,

(1)在GTS DefaultPermissionGrantPolicyTest 失敗的手機上執行 adb shell dumpsys package com.android.XXX > dumppackage.txt,上傳dumppackage.txt;

(2)將原始碼frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy.java檔案上傳;
(3)如果手機system/etc/目錄下有sprd-app-perms.xml,請上傳該檔案。