Uploaded image for project: 'Commons Compress'
  1. Commons Compress
  2. COMPRESS-455

Cannot open certain APK file (Unexpected record signature)

    XMLWordPrintableJSON

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 1.17
    • Fix Version/s: 1.18
    • Component/s: Archivers
    • Labels:
      None
    • Environment:

      Android 8.1.0

      Description

      I'm developing a file manager for Android and noticed that ZipArchiveInputStream throws an exception for certain APK files (but not all) I have at hand:

       

      06-12 23:01:03.043 26960-4050/me.zhanghai.android.materialfilemanager W/System.err: java.util.zip.ZipException: Unexpected record signature: 0X621
      06-12 23:01:03.044 26960-4050/me.zhanghai.android.materialfilemanager W/System.err: at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextZipEntry(ZipArchiveInputStream.java:258)
       at org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextEntry(ZipArchiveInputStream.java:406)
       at me.zhanghai.android.materialfilemanager.filesystem.Archive.readEntries(Archive.java:79)
       at me.zhanghai.android.materialfilemanager.filesystem.Archive.read(Archive.java:36)
       at me.zhanghai.android.materialfilemanager.filesystem.ArchiveFile.loadFileList(ArchiveFile.java:112)
       at me.zhanghai.android.materialfilemanager.filelist.FileLiveData$1.doInBackground(FileLiveData.java:32)
       at me.zhanghai.android.materialfilemanager.filelist.FileLiveData$1.doInBackground(FileLiveData.java:28)
       at android.os.AsyncTask$2.call(AsyncTask.java:333)
       at java.util.concurrent.FutureTask.run(FutureTask.java:266)
       at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
       at java.lang.Thread.run(Thread.java:764)

       

      However, these APKs installs fine, and can be viewed by the system Files app (by changing extension to zip) and some other opensource file managers built upon java.util.zip.

      Some links to APKs I found with this problem:

      1. https://github.com/paphonb/PixelLauncherModV5/releases/download/5.3_23/Pixel.2.Launcher.modded.5.3.build.23.apk 

      2. https://github.com/Yink/Amadeus/releases/download/0.9.6-alpha.5/amadeus.apk

      My code for reading the APK archive entries:

       

       

      private static void readEntries(InputStream inputStream, List<ArchiveEntry> entries)
              throws ArchiveException, IOException {
          try (ArchiveInputStream archiveInputStream = sArchiveStreamFactory.createArchiveInputStream(
      new BufferedInputStream(inputStream))) {
              while (true) {
                  ArchiveEntry entry = archiveInputStream.getNextEntry();
                  if (entry == null) {
                      break;
                  }
                  entries.add(entry);
              }
          }
      }
      

      Also note that if I catch the exception while keeping the list of already-read entries, it seems that (almost) all entries have been read.

      I wonder how this can be fixed, or if this is because those files have some kind of weird format, how can I possibly work around this?

       

        Attachments

          Issue Links

            Activity

              People

              • Assignee:
                Unassigned
                Reporter:
                dreamingincode Hai Zhang
              • Votes:
                0 Vote for this issue
                Watchers:
                2 Start watching this issue

                Dates

                • Created:
                  Updated:
                  Resolved: