2012-03-24 5 views
0

ich eine 20MB-Datenbank in der apk Vermögen gespeichert haben, die bei der ersten Ausführung ist für den Einsatz extrahiert. Um dies zu tun Ich benutzeDekomprimieren von Vermögenswerten funktioniert nicht, wenn proguard mit

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); 
} 

alles funktioniert gut, wenn ich von Eclipse (Android 2.2 Ziel) exportieren, ohne proguard zu verwenden. Als ich mit proguard exportieren, beginnt die unzip für einige Sekunden zu arbeiten (und ein paar Fortschritte Updates zu 8%), aber dann stürzt mit java.io.IOException bei java.util.zip.InflaterInputStream.read (..

)

Es funktioniert auf dem Emulator, sondern stürzt auf Geräten (viele Geräte, aber ich denke immer in Android arbeitet 4, Abstürze in Android 2.2). Mein proguard.cfg ist im Grunde der Standard. Nichts, was ich versucht habe zu ändern scheint zu helfen, irgendwelche Ideen?

+0

Warum bist du nicht mit 'GetResources(). GetAssets()' 'ein AssetManager', zu erhalten und dass bei Ihren Vermögen zu erhalten benutzen? – CommonsWare

+0

Ich glaube, das ist auf Dateien kleiner als 1MB beschränkt, zumindest auf Android 2, während direktes Entpacken funktioniert (zumindest ohne proguard). – wordy

+0

'AssetManager' funktioniert gut für 1 + MB-Dateien. Sie müssen jedoch eine Dateierweiterung haben, die verhindert, dass sie komprimiert werden. ['SQLiteAssetHelper'] (https://github.com/jgilfelt/android-sqlite-asset-helper), zum Beispiel, funktioniert sehr gut mit 1 + MB-Dateien, durch das einfache Mittel, sie ein ZIP-Archiv in der' Assets/'Projektordner. – CommonsWare

Antwort

0

ProGuard Optimierungen können Fehler im Code aufzudecken, die verarbeitet wird. Beispielsweise können Optimierungen das Timing von Multithread-Code möglicherweise ändern, was Probleme verursacht, wenn es nicht richtig synchronisiert wird. Sie können Ihren Code überprüfen. Sind zum Beispiel myInput- und myOutput-Felder, die in anderen Threads bearbeitet werden? Ist das Problem deterministisch?

ProGuard Optimierungen können auch Fehler in der virtuellen Maschine oder in Laufzeit-Klassen aufzudecken. Es ist möglich, dass Sie auf einen Fehler stoßen, der in den letzten Versionen von Android behoben wurde.

Da der verarbeitete Code mit den neuesten Versionen von Android funktioniert, handelt es sich wahrscheinlich nicht um einen Fehler in ProGuard, aber Sie könnten prüfen, ob die neueste Version einen Unterschied macht (Version 4.7 zu diesem Zeitpunkt).

Sie können das Problem auf ProGuard bug tracker melden, mit einem Beispiel, das das Problem veranschaulicht (zumindest mit vollständiger Code und eine vollständige Stack-Ablaufverfolgung). In der Zwischenzeit können Sie umgehen, indem Sie die Optimierung ausschalten.

+0

Soweit ich sagen kann, ist es deterministisch und das Threading ist trivial. Danke, in der Tat könnte es ein Fehler in Android sein. Für den Moment denke ich, dass CommonsWare's Vorschlag die beste Lösung ist - ich werde als Antwort akzeptieren, ob er als Antwort posten möchte (natürlich keine Antwort auf die ursprüngliche Frage). – wordy