Uploaded image for project: 'Qt'
  1. Qt
  2. QTBUG-107627

AndroidAssetsFileEngineHandler is broken

    XMLWordPrintable

Details

    • Android
    • 89f89cedc0 (qt/qtbase/dev) 89f89cedc0 (qt/tqtc-qtbase/dev) a9b036eb84 (qt/tqtc-qtbase/6.2) 875e90d249 (qt/qtbase/6.4) 875e90d249 (qt/tqtc-qtbase/6.4), 4ceee3911 (dev), 085138bc2 (6.4), e4dddcfcd (tqtc/lts-6.2), aa7b2436b (tqtc/lts-5.15), 3144bebbb (6.5.2)
    • 2022wk42FOQtforAndroid, 2022wk44FOQtforAndroid, 2022wk46FOQtforAndroid, 2022wk48FOQtforAndroid, 2022wk50FOQtforAndroid, 2022wk52FOQtforAndroid

    Description

      Descriptions:

      It is not possible to list directories android assets files that are located subdirectory of directory with no files.

      Preconditions

      Assume that your android assets dir has following layout

      assets
      |- dir1
      |--- dir2
      |------ file1.qml
      |--- dir3
      |------ file2.qml
      |- dir4
      |--- dir5
      |------ file3.qml
      |--- main.qml

      And following piece of code:

      auto flags =  QDir::Dirs | QDir::NoDotAndDotDot | QDir::Files;
      const QDir dir1("assets:/dir1");
      const QStringList dir1DirNames = dir1.entryList(flags);
      const QDir dir4("assets:/dir4"); 
      const QStringList dir4DirNames = dir4.entryList(flags);
      qDebug() << "Dir1" << dir1DirNames << "Dir4" << dir4DirNames;

       Actual Result:

      Dir1 QList() Dir2 QList("dir5")
      

       Expected Result:

      Dir1 QList("dir2", "dir3") Dir2 QList("dir5")
      

      Analysis:
      The issue was introduced by this commit:
      https://code.qt.io/cgit/qt/qtbase.git/commit/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp?id=edd983071e0a90ee8665d2f45916fb575fc25857

      and in more detail this line is faulty:
      https://code.qt.io/cgit/qt/qtbase.git/tree/src/plugins/platforms/android/qandroidassetsfileenginehandler.cpp?id=edd983071e0a90ee8665d2f45916fb575fc25857#n352

      If you'll take a look on the implementation of `AAssetDir_getNextFileName` it explicitly cuts off the directories from the iteration:
      https://android.googlesource.com/platform/frameworks/base.git/+/1cadc07dd1e3711fb1e57548038e3026682c5ef8/native/android/asset_manager.cpp#135

      causing that in such case all directories will be treated as  `AssetItem::Type::Invalid`

       

       

      Attachments

        Issue Links

          For Gerrit Dashboard: QTBUG-107627
          # Subject Branch Project Status CR V

          Activity

            People

              bartlomiejmoskal Bartlomiej Moskal
              pnogaj Przemysław Nogaj
              Votes:
              3 Vote for this issue
              Watchers:
              7 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: