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

问题描述:

我有一个存储在apk资源中的20MB数据库,它在第一次运行时被提取使用。要做到这一点,我用我的时候不使用ProGuard从日食(Android 2.2的目标)出口使用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); 
} 

一切工作正常。当我用proguard导出时,解压缩开始工作几秒钟(并且一些进度更新,到8%),但是随后在java.util.zip.InflaterInputStream.read()中崩溃。 )

它适用于模拟器,但在设备上崩溃(很多设备,但我认为总是在Android 4中工作,在Android 2.2中崩溃)。我的proguard.cfg基本上是默认的。 没有我试过改变似乎有帮助,任何想法?

+0

为什么不使用'getResources()。getAssets()'获取'AssetManager',并使用它来获取您的资产? – CommonsWare 2012-03-24 13:05:27

+0

我相信只限于文件少于1MB,至少在Android 2上,而直接解压缩的作品(至少没有proguard)。 – wordy 2012-03-24 19:29:49

+0

'AssetManager'适用于1 MB文件。但是,他们必须有一个文件扩展名,以防止它们被压缩。例如,对于1 MB文件,['SQLiteAssetHelper'](https://github.com/jgilfelt/android-sqlite-asset-helper)可以很好地工作,通过简单的方法将它们存储在'资产/'项目文件夹。 – CommonsWare 2012-03-24 19:39:00

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

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

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

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

+0

据我所知,它是确定性的,线程是微不足道的。 谢谢,的确,它可能是Android中的一个错误。目前我认为CommonsWare的建议是最好的解决方案 - 如果他想作为答案张贴(尽管当然不是对原始问题的答案),我会接受作为答案。 – wordy 2012-03-25 09:27:48