解决CTS测试 CtsOsTestCases

平台C6490,android13

测试项:

Test Result Details
android.os.storage.cts.StorageManagerCrossProfileUSBTest#testGetStorageVolumeUSBWorkProfile fail
The USB storage volume: C608-180E mounted on the main user is not present in /storage/emulated/111

fail 项的log:

10-09 03:47:31.187 13860 14521 I Fitness : (REDACTED) FitCleanupIntentOperation received Intent %s
10-09 03:47:31.187 13722 13894 E StorageManager: Failed to set extended attributes for /storage/emulated/13/Android to set project id.: Permission denied
10-09 03:47:31.187 16132 16235 D CompatibilityChangeReporter: Compat change id reported: 160794467; UID 1310180; state: ENABLED
10-09 03:47:31.187 13722 13894 W MediaProvider: Failed to update quota type for /storage/emulated/13/Android
10-09 03:47:31.187 13722 13894 W MediaProvider: java.io.IOException: Failed to update quota type for /storage/emulated/13/Android
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at android.os.storage.StorageManager.updateExternalStorageFileQuotaType(StorageManager.java:2618)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at com.android.providers.media.MediaProvider.updateQuotaTypeForFileInternal(MediaProvider.java:716)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at com.android.providers.media.MediaProvider.updateQuotaTypeForUri(MediaProvider.java:690)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at com.android.providers.media.MediaProvider.-$$Nest$mupdateQuotaTypeForUri(Unknown Source:0)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at com.android.providers.media.MediaProvider$4.lambda$onInsert$0(MediaProvider.java:743)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at com.android.providers.media.MediaProvider$4.$r8$lambda$DnIEye5Sx8fODP4Bt_qvKpm3U-Q(Unknown Source:0)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at com.android.providers.media.MediaProvider$4$$ExternalSyntheticLambda0.run(Unknown Source:6)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at android.os.Handler.handleCallback(Handler.java:942)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at android.os.Looper.loopOnce(Looper.java:201)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at android.os.Looper.loop(Looper.java:288)
10-09 03:47:31.187 13722 13894 W MediaProvider: >---at android.os.HandlerThread.run(HandlerThread.java:67)
10-09 03:47:31.190 2309 2309 D CarrierSvcBindHelper: onPackageModified: com.google.android.contacts

 一开始以为是 cts case创建虚拟分区时的权限问题。后面检查代码发现是下面这个修改导致了这个问题。u盘自动挂载功能,如果去掉这个修改是能测试PASS的。

===================================================================
--- LINUX/android/device/qcom/lahaina/default/fstab.qcom    (revision 2539)
+++ LINUX/android/device/qcom/lahaina/default/fstab.qcom    (revision 2540)
@@ -51,3 +51,5 @@
 /dev/block/bootdevice/by-name/dsp                       /vendor/dsp            ext4    ro,nosuid,nodev,barrier=1                            wait,slotselect
 /dev/block/bootdevice/by-name/bluetooth                 /vendor/bt_firmware    vfat    ro,shortname=lower,uid=1002,gid=3002,dmask=227,fmask=337,context=u:object_r:bt_firmware_file:s0 wait,slotselect
 /dev/block/bootdevice/by-name/qmcs                      /mnt/vendor/qmcs       vfat    noatime,nosuid,nodev,context=u:object_r:vendor_qmcs_file:s0   wait,check,formattable
+/devices/platform/*usb*   auto auto defaults      voldmanaged=usb:auto
+/devices/platform/fe320000.dwmmc/mmc_host*        auto  auto    defaults        voldmanaged=sdcard1:auto

Index: QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/android/server/StorageManagerService.java
===================================================================
--- QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/android/server/StorageManagerService.java    (revision 2781)
+++ QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/android/server/StorageManagerService.java    (revision 2782)
@@ -1617,9 +1617,9 @@

             // Adoptable public disks are visible to apps, since they meet
             // public API requirement of being in a stable location.
-            if (vol.disk.isAdoptable()) {
+            // if (vol.disk.isAdoptable()) {
                 vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_WRITE;
-            }
+            // }

 

查看这条case的代码。发现这条case是测试创建虚拟盘符的。是挂载后路径不匹配导致测试失败,不是权限问题。

public static String createDiskAndGetVolumeName(boolean visible) throws Exception {
        //remove any existing volume that was mounted before
        removeVirtualDisk();
        String existingPublicVolume = getPublicVolumeExcluding(null);
        executeShellCommand("sm set-force-adoptable " + (visible ? "on" : "off"));
        executeShellCommand("sm set-virtual-disk true");
        Thread.sleep(10000);
        pollForCondition(StorageManagerHelper::partitionDisks,
                "Could not create public volume in time");
        return getPublicVolumeExcluding(existingPublicVolume);
    }

 

这条case创建的 set-force-adoptable 为 off的,是not visible, 但是上面的修改直接在mount的时候加了visible的flag,导致后面检测路径不匹配导致失败。
case具体逻辑请查看 android/cts/tests/tests/os/src/android/os/storage/cts/StorageManagerHelper.java?fi=createUSBVirtualDisk#53

如果需要保留修改需要在 android/frameworks/base/cmds/sm/src/com/android/commands/sm/Sm.java#166
runSetForceAdoptable()中添加额外的flag,然后在以下位置添加判断条件, 具体修改如下:

 

 

diff --git a/QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/android/server/StorageManagerService.java b/QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/andro
id/server/StorageManagerService.java
index 0e4ea057aea..0f2d04b3344 100755
--- a/QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/android/server/StorageManagerService.java
+++ b/QCM6490_apps_qssi13/LINUX/android/frameworks/base/services/core/java/com/android/server/StorageManagerService.java
@ -1615,11 +1615,19 @ class StorageManagerService extends IStorageManager.Stub
vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_WRITE;
}

+ String value = SystemProperties.get(StorageManager.PROP_ADOPTABLE);
+ boolean isForceOff = "force_off".equals(value);
// Adoptable public disks are visible to apps, since they meet
// public API requirement of being in a stable location.
+ if (isForceOff) {
+ if (vol.disk.isAdoptable()) {
+ vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_WRITE;
+ }
+ } else {
// if (vol.disk.isAdoptable()) {
vol.mountFlags |= VolumeInfo.MOUNT_FLAG_VISIBLE_FOR_WRITE;
// }
+ }

 

修改后这条case可以pass

 

posted @ 2025-01-17 10:30  simple雨  阅读(126)  评论(0)    收藏  举报