Android Java ZipFile / ZipEntry в некоторых случаях "искажен"? - PullRequest
0 голосов
/ 10 июля 2020

К сожалению, я не могу воспроизвести это со своей стороны, это просто передается через cra sh analytics. Это кажется "редким" -i sh, но этого достаточно, чтобы привлечь внимание.

Код просто открывает ZIP-файл и просматривает файлы внутри:

try
{
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        zipFile = new ZipFile(tempZipFile, Charset.forName("ISO-8859-1")); // Fixed crash on later Android versions, when a file in the ZIP has a special character
    else
        zipFile = new ZipFile(tempZipFile);
}
catch (IOException e)
{...}

// Read entries in ZIP file.
Enumeration<? extends ZipEntry> entries = zipFile.entries();

while (entries.hasMoreElements() == true)
{
    ZipEntry entry = entries.nextElement(); // <--- Crash occurs here
    // ...
}

И cra sh:

Caused by java.lang.IllegalArgumentException: MALFORMED[1]
       at java.util.zip.ZipCoder.toString(ZipCoder.java:65)
       at java.util.zip.ZipCoder.toStringUTF8(ZipCoder.java:120)
       at java.util.zip.ZipFile.getZipEntry(ZipFile.java:592)
       at java.util.zip.ZipFile.-wrap2()
       at java.util.zip.ZipFile$ZipEntryIterator.next(ZipFile.java:552)
       at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:527)
       at java.util.zip.ZipFile$ZipEntryIterator.nextElement(ZipFile.java:526)
       at package.extractFromZIP(AndroidLauncher.java:1078)
   

Кажется, 64% сбоев - это Android 9, 28% Android 8, так что оператор «if» с определенной кодировкой не кажется проблема.

Если бы мне пришлось угадывать, я бы все равно сказал, что это кодировка / "странный" символ в именах файлов, вызывающих проблему. Есть ли какая-то кодировка для использования (например, выше я использую Charset.forName ("ISO-8859-1") для Android 9+), которая будет охватывать, в основном, любое имя файла. Приложение локализовано на множество языков во многих странах, от Японии до России и США, поэтому можно использовать любые символы.

Разве это не проблема? Проблема в том, что отчет cra sh не дает много информации, кроме «искаженного», в надежде, что кто-то здесь, возможно, уже сталкивался с этим раньше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...