К сожалению, я не могу воспроизвести это со своей стороны, это просто передается через 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 не дает много информации, кроме «искаженного», в надежде, что кто-то здесь, возможно, уже сталкивался с этим раньше?