У меня есть база данных 20 МБ, хранящаяся в активах apk, которые при первом запуске извлекаются для использования. Для этого я используюUnzip из активов не работает при использовании proguard
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);
}
Все отлично работает, когда я экспортировать из затмения (андроид 2,2 целевых) без использования ProGuard. Когда я экспортирую с proguard, unzip начинает работать в течение нескольких секунд (и несколько обновлений прогресса, до 8%), но затем сбой java.io.IOException в java.util.zip.InflaterInputStream.read (..)
Он работает на эмуляторе, но падает на устройства (многие устройства, но я думаю, что всегда работает на Android 4, сбой в Android 2.2). Мой proguard.cfg в основном по умолчанию. Ничего, что я пробовал изменить, кажется, помогает, любые идеи?
Почему вы не используете 'getResources(). GetAssets()', чтобы получить 'AssetManager', и использовать его для получения своих активов? – CommonsWare
Я считаю, что он ограничен файлами размером менее 1 Мбайт, по крайней мере, на Android 2, тогда как прямая распаковка работает (по крайней мере, без proguard). – wordy
'AssetManager' отлично работает для файлов с 1 + МБ. Тем не менее, они должны иметь расширение файла, которое предотвращает их сжатие. ['SQLiteAssetHelper'] (https://github.com/jgilfelt/android-sqlite-asset-helper), например, отлично работает с файлами 1 + МБ, благодаря простоте хранения их ZIP-архивов в' assets/'project. – CommonsWare