Android 从资产中解压不';使用proguard时不工作

Android 从资产中解压不';使用proguard时不工作,android,proguard,Android,Proguard,我有一个20MB的数据库存储在apk的资产中,在第一次运行时提取出来供使用。要做到这一点,我使用 PackageManager pm = context.getPackageManager(); String apkFile = pm.getApplicationInfo(context.getPackageName(), 0).sourceDir; ZipFile zipFile = new ZipFile(apkFile); ZipEntry entry = zipFile.getEntr

我有一个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(Android2.2目标)导出而不使用proguard时,所有这些都可以正常工作。当我使用proguard导出时,解压开始工作几秒钟(以及一些进度更新,达到8%),但随后会崩溃 java.util.zip.InflaterInputStream.read(..)处的java.io.IOException

它在模拟器上工作,但在设备上崩溃(许多设备,但我认为总是在安卓4上工作,在安卓2.2上崩溃)。我的proguard.cfg基本上是默认的。
我尝试更改的内容似乎没有任何帮助,有什么想法吗?

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


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

由于处理后的代码在最新版本的Android上可以工作,所以它可能不是ProGuard中的一个bug,但您可以检查最新版本是否有影响(在编写本文时为4.7版)


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

为什么不使用
getResources().getAssets()
来获取
AssetManager
,并使用它来获取您的资产?我相信这仅限于小于1MB的文件,至少在Android 2上是如此,而直接解压缩可以工作(至少在没有proguard的情况下).
AssetManager
适用于1+MB的文件。但是,它们必须具有防止被压缩的文件扩展名,例如,通过在
assets/
项目文件夹中存储一个ZIP档案,可以很好地处理1+MB的文件。将压缩文件添加到assests似乎是一个不错的替代方法-它可以工作,谢谢。(虽然提取速度稍慢?)也遇到了同样的问题。在运行proguard之后,我的资产目录中的file.zip无效。据我所知,它是确定性的,线程是琐碎的。谢谢,这可能是安卓系统的一个bug。目前,我认为Commonware的建议是最好的解决方案——如果他愿意作为答案发布(当然不是对原始问题的答案),我将接受作为答案。