使用proguard时,从资源解压缩不起作用

时间:2012-03-24 13:00:37

标签: android proguard

我有一个20MB的数据库存储在apk的资产中,在第一次运行时,它被提取出来供使用。为此,我使用

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.util.zip.InflaterInputStream.read(..)

中的java.io.IOException

它可以在模拟器上运行,但在设备上崩溃(许多设备,但我认为它总是在Android 4中运行,在Android 2.2中崩溃)。我的proguard.cfg基本上是默认的。 我尝试改变的任何东西似乎都没有帮助,任何想法?

1 个答案:

答案 0 :(得分:0)

ProGuard优化可能会发现处理代码中的错误。例如,优化可能会改变多线程代码的时序,如果未正确同步则会导致问题。你可以仔细检查你的代码。例如,myInput和myOutput字段是否在其他线程中被操纵?这个问题是确定性的吗?

ProGuard优化还可以发现虚拟机或运行时类中的错误。您可能遇到了最新版Android中已修复的错误。

由于已处理的代码适用于Android的最新版本,因此它可能不是ProGuard中的错误,但您可以检查最新版本是否有所不同(在撰写本文时版本为4.7)。

您可以在ProGuard的bug tracker上报告问题,并提供说明问题的示例(至少使用更完整的代码和完整的堆栈跟踪)。同时,你可以通过关闭优化来解决它。