[ https://issues.apache.org/jira/browse/COMPRESS-455?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16509784#comment-16509784 ]
Stefan Bodewig commented on COMPRESS-455: ----------------------------------------- The signature consisting of only two bytes looks strange (I'd expect the usual "PK" bytes if this simply was some kind of unsupported feature inside of a regular archive. Have you tried using {{ZipFile}} rather than {{ZipArchiveInputStream}}? This has the benefit of being able to read the central directory and doesn't have to scan the archive sequentially performing pattern matching on suspect header signatures. > Cannot open certain APK file (Unexpected record signature) > ---------------------------------------------------------- > > Key: COMPRESS-455 > URL: https://issues.apache.org/jira/browse/COMPRESS-455 > Project: Commons Compress > Issue Type: Bug > Components: Archivers > Affects Versions: 1.17 > Environment: Android 8.1.0 > Reporter: Hai Zhang > Priority: Major > > 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: > > {noformat} > 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){noformat} > > 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: > > > {code:java} > 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); > } > } > } > {code} > 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? > -- This message was sent by Atlassian JIRA (v7.6.3#76005)