Распаковка из ресурсов не работает при использовании proguard - PullRequest
0 голосов
/ 24 марта 2012

В базе данных apk хранится база данных объемом 20 МБ, которая при первом запуске извлекается для использования.Для этого я использую

PackageManager pm = context.getPackageManager();
String apkFile = pm.getApplicationInfo(context.getPackageName(), 0).sourceDir;
ZipFile zipFile = new ZipFile(apkFile); 
ZipEntry entry = zipFile.getEntry("assets/FILENAME");
myInput = zipFile.getInputStream(entry);
myOutput = new FileOutputStream(file);
    byte[] buffer = new byte[1024*4];
int length;
int total = 0;
int counter = 1;
while ((length = myInput.read(buffer)) > 0) {
    total += length;
    counter++;
    if (counter % 32 == 0) {
        publishProgress(total);
    }
        myOutput.write(buffer, 0, length);
}

Все отлично работает, когда я экспортирую из eclipse (цель Android 2.2) без использования Proguard.Когда я экспортирую с помощью proguard, распаковка начинает работать на несколько секунд (и несколько обновлений прогресса, до 8%), но затем падает с java.io.IOException в java.util.zip.InflaterInputStream.read (..)

Работает на эмуляторе, но вылетает на устройствах (многие устройства, но я думаю, что всегда работает в Android 4, вылетает в Android 2.2).Мой proguard.cfg в основном по умолчанию.Ничто из того, что я пробовал изменить, похоже, не поможет, есть идеи?

1 Ответ

0 голосов
/ 25 марта 2012

Оптимизация ProGuard может выявить ошибки в обрабатываемом коде. Например, оптимизации могут потенциально изменить время многопоточного кода, вызывая проблемы, если он не синхронизирован должным образом. Вы могли бы дважды проверить свой код. Например, поля myInput и myOutput, которыми манипулируют в других потоках? Является ли проблема детерминированной?

Оптимизация ProGuard может также обнаружить ошибки в виртуальной машине или в классах времени выполнения. Возможно, вы столкнулись с ошибкой, которая была исправлена ​​в последних версиях Android.

Поскольку обработанный код работает на последних версиях Android, это, вероятно, не ошибка в ProGuard, но вы можете проверить, имеет ли значение последняя версия (версия 4.7 на момент написания этой статьи).

Вы можете сообщить о проблеме на трекере ошибок ProGuard с примером, иллюстрирующим проблему (по крайней мере, с более полным кодом и полной трассировкой стека). Тем временем вы можете обойти это, отключив оптимизацию.

...