Frage ProGuard und Gson auf Android (ClassCastException)


Ich habe eine Menge Spaß mit Gson und ProGuard. Ich habe ein einfaches Objekt, und wenn ich tojson analysieren, in sqllite speichern und von der Datenbank zurücklesen, um die json zurück zu meinem Objekt zu laden, bekomme ich eine java.lang.classcastexception. Wenn ich nicht ProGuard benutze, funktioniert alles gut.

Ich habe überprüft, dass die JSON-Zeichenfolge, die an die Datenbank gesendet und von ihr abgerufen wird, dieselbe ist. Die Ausnahme wird nicht ausgelöst, wenn sie von json konvertiert wird, sondern wenn ich versuche, auf das Objekt zuzugreifen.

Hier ist mein einfaches Objekt:

public class ScanLog extends ArrayList<SingleFrame>
{
     private static final long serialVersionUID = 1L;

     public ScanLog()
     {

     }
}

public final class SingleFrame 
{
    public int Position;
    public int Time;
    public Map<Integer,String> MainDataMap;
    public Map<Integer,String> DataMap;

    public SingleFrame(int position, int time, 
                    Map<Integer,String> mainDataMap, Map<Integer,String> dataMap)
    {
        this.Position = position;
        this.Time = time;
        this.MainDataMap = mainDataMap;
        this.DataMap = dataMap;
    }

}

Alle anderen Aspekte meiner App sind in Ordnung, aber etwas mit Proguard verursacht dies. Ich habe alle möglichen Befehle in der proguard.cfg ausprobiert, aber ich bin mir nicht sicher, was ich tun soll.

BEARBEITEN - PROGUARD.CFG HINZUFÜGEN

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-dontshrink
-dontoptimize

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService

#keep all classes that might be used in XML layouts
-keep public class * extends android.view.View
-keep public class * extends android.app.Fragment
-keep public class * extends android.support.v4.Fragment

#keep all classes
-keep public class *{
public protected *;
}

#keep all public and protected methods that could be used by java reflection
-keepclassmembernames class * {
    public protected <methods>;
}


-keepclasseswithmembernames class * {
    native <methods>;
}

-keep public class org.scanner.scanlog.SingleFrame


-keepclassmembers class org.scanner.scanlog.ScanLog { 
        private <fields>; 
        public <fields>; 
}

-keepclassmembers class org.scanner.scanlog.SingleFrame { 
        private <fields>; 
        public <fields>; 
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-dontwarn **CompatHoneycomb
-dontwarn org.htmlcleaner.*
#-keep class android.support.v4.** { *; }

EDIT - Okay, ich habe ACRA erfolgreich in meiner App eingerichtet, ziemlich tolle Funktion! Hier ist der Stack-Trace:

java.lang.ClassCastException: java.lang.Object
    at org.scanner.activity.ReaderMainActivity.AdvanceScanLog(SourceFile:1499)
    at org.scanner.activity.r.onProgressChanged(SourceFile:271)
    at android.widget.SeekBar.onProgressRefresh(SeekBar.java:89)
    at android.widget.ProgressBar.doRefreshProgress(ProgressBar.java:507)
    at android.widget.ProgressBar.refreshProgress(ProgressBar.java:516)
    at android.widget.ProgressBar.setProgress(ProgressBar.java:565)
    at android.widget.AbsSeekBar.trackTouchEvent(AbsSeekBar.java:337)
    at android.widget.AbsSeekBar.onTouchEvent(AbsSeekBar.java:292)
    at android.view.View.dispatchTouchEvent(View.java:3932)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1784)
    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1157)
    at android.app.Activity.dispatchTouchEvent(Activity.java:2181)
    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1759)
    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2336)
    at android.view.ViewRoot.handleMessage(ViewRoot.java:1976)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:143)
    at android.app.ActivityThread.main(ActivityThread.java:4263)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
    at dalvik.system.NativeStart.main(Native Method)

31
2018-06-30 10:56


Ursprung


Antworten:


Die aktuellste Version der empfohlenen proguard configuraiton Datei finden Sie im gson mitgelieferten android proguard Beispiel unter: https://github.com/google/gson/blob/master/examples/android-proguard-example/proguard.cfg


68
2017-07-01 12:52



Diese Einstellungen in der Konfiguration funktionierten für mich in einer meiner Apps:

# Add the gson class
-keep public class com.google.gson

# Add any classes the interact with gson
-keep class com.someapp.android.models.ChatModel { *; }
-keep class com.someapp.android.models.FeedModel { *; }

# Add the path to the jar
-libraryjars /Users/someuser/Documents/workspace/someapp/lib/gson-1.7.1.jar

Hoffentlich hilft dir das weiter.


25
2017-08-18 18:35



Anwenden der Änderungen gefunden in der Android Beispiel in dem Gson-Projekt arbeitete für mich

Die benötigten Linien waren:

-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
# and keeping the classes that will be serialized/deserialized

14
2018-05-16 18:53



Ich weiß, dass die ursprüngliche Frage mit einem anderen Ansatz gelöst wurde, aber ich hatte ein sehr ähnliches Problem mit Flexjson und Proguard auf Android, und ich habe es gelöst, falls jemand selbst darauf eingeht.

Bei der Konvertierung von JSON in mein Wertobjekt, das einige ArrayLists enthielt, würde ich dieselbe ClassCastException erhalten. Ich habe es zum Laufen gebracht, indem ich im Grunde genommen die Verschleierung aktiviert habe, aber alle Teile der Verschleierung ausgeschaltet habe (-halte alles), halte die Klasse ein und -kete alles ein und arbeite dann rückwärts, indem ich die Dinge ein wenig nach dem anderen aktiviere.

Das Ergebnis; Behalten Sie die gesamte flexjson-Bibliothek:

-keep class flexjson**
--keepclassmembers class flexjson** {
   *;
}

und halten die Signatur und Anmerkung Attribut:

-keepattributes Signature, *Annotation*

Ich war in der Lage, die Flexjson-Bibliothek ohne Vorfall danach in einer progwarded, Release-Version meiner App zu verwenden.


6
2017-08-17 09:33



Ich bekam Fehler für Model Klassen mit Proguard Wenn Sie sich ansehen

GSON Proguard  Du wirst eine Linie finden

# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }

ersetzen com.google.gson.examples.android.model. mit Ihrem model Paket auch in meinem Fall ersetzte ich es mit -keep class com.consumer.myProject.model.** { *; }

Ruhe habe ich als solche kopiert


2
2018-06-22 14:14



Es sieht so aus, als ob Sie alles aus Ihrer Klasse behalten (Felder, Methoden und die Klasse selbst). Aber um sicherzustellen, dass Sie hinzufügen können -printseeds outputfile.txt in die Datei proguard.cfg, um zu überprüfen, ob proguard wirklich alles enthält, was Sie brauchen, sobald die Verschleierung durchgeführt wurde.

Übrigens könnten Sie darüber nachdenken etwas hinzuzufügen ACRA oder Android Remote Stacktrace Damit können Sie Stacktraces in einer erstellten App überprüfen.


1
2018-06-30 14:27



Also habe ich die Gson-Bibliothek aufgegeben und anstatt mein Objekt mit gson in json zu konvertieren, habe ich in meiner App eine benutzerdefinierte Klasse erstellt, um das Objekt zu serialisieren und zu deserialisieren und die Daten auf diese Weise zu speichern.

Ich bin insgesamt glücklicher, obwohl mich das über 12 Stunden gekostet hat. Anscheinend mögen sich PROGUARD und Gson nicht zu sehr?

Als HUGELY Zusatznutzen Um GSON nicht verwenden zu müssen, bemerkte ich, dass durch das Entfernen der GSON-Bibliothek meine App-Größe halbiert wurde. Meine App war 577kb und ist jetzt nur 260kb nach dem Entfernen der Gson-lib.


1
2017-07-01 21:41