Ich habe meine Klasse ClassMultiPoint
mit Unterklassen.
public class ClassMultiPoints
{
public String message;
public List<ClassPoints> data;
public class ClassPoints
{
public String id;
public List<ClassPoint> points;
public class ClassPoint
{
public String speed;
public String bearing;
}
}
}
Ich werde den Wert des Objekts oPoints
aus der Analyse erhalten GSON
:
oPoints = gson.fromJson( jsonString, ClassMultiPoints.class);
Ich versuche es zu benutzen oPoints.message
.
Wenn ich meine Anwendung ohne proguard
Erfolg bei der App-Ausführung ausführe. Wenn ich meine App mit proguard
meinem App-Absturz starte.
Ich denke, das Problem ist: proguard
benenne das Attribut 'oPoints.message'
meiner Klasse in kurz um 'a'
.
Ich versuche, die Namen der Methoden und Attribute konstant zu halten, proguard
benenne sie aber um:
proguard.cfg:
-injars bin/classes
-injars libs
-outjars bin/classes-processed.jar
-dontpreverify
-repackageclasses ''
-allowaccessmodification
-optimizations !code/simplification/arithmetic
-keepattributes *Annotation*
-dontskipnonpubliclibraryclasses
-optimizationpasses 5
-printmapping map.txt
-flattenpackagehierarchy
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.MapActivity
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-libraryjars libs/commons-io-2.2.jar
-libraryjars libs/ftp4j-1.7.1.jar
-libraryjars libs/gson-2.2.2.jar
-keep public class org.apache.commons.io.**
-keep public class it.sauronsoftware.ftp4j.**
-keep public class com.google.gson.**
-keep public class com.mypackagename.ActivityMonitor$*
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.content.Context {
public void *(android.view.View);
public void *(android.view.MenuItem);
}
-keepclassmembers class * implements android.os.Parcelable {
static android.os.Parcelable$Creator CREATOR;
}
-keepclassmembers class **.R$* {
public static <fields>;
}
Was ist der richtige Weg, um Namen der Methoden und Attribute der my one (statischen) Klasse beizubehalten?
quelle
@SerializedName
Anmerkungen zusätzlich zu Ihren Klassenmitgliedern? Wenn Sie dies tun, müssen Sie die Verschleierung benutzerdefinierter Klassen in der Proguard-Konfiguration nicht umgehen, wie Sie es tuncom.google.gson.examples.android.model.** { *; }
.Danke Waqas!
Ich finde eine Lösung für meinen Fall:
-optimizationpasses 5 -dump class_files.txt -printseeds seeds.txt -printusage unused.txt -printmapping mapping.txt -optimizations !code/simplification/arithmetic,!field/*,!class/merging*/ -allowaccessmodification -repackageclasses '' -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.MapActivity -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -libraryjars libs/commons-io-2.2.jar -libraryjars libs/gson-2.2.2.jar -keep public class org.apache.commons.io.** -keep public class com.google.gson.** -keep public class com.google.gson.** {public private protected *;} ##---------------Begin: proguard configuration for Gson ---------- -keepattributes *Annotation*,Signature -keep class com.mypackage.ActivityMonitor.ClassMultiPoints.** { *; } -keep public class com.mypackage.ActivityMonitor$ClassMultiPoints { public protected *; } -keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints { public protected *; } -keep public class com.mypackage.ActivityMonitor$ClassMultiPoints$ClassPoints$ClassPoint { public protected *; } # To support Enum type of class members -keepclassmembers enum * { *; } ##---------------End: proguard configuration for Gson ----------
Auch ich benutze nicht
@SerializedName("message")
in meiner Klasse, obige Konfiguration funktioniert gut ohne Serialisierung.quelle
Ich habe auch festgestellt, dass ich dies
-keepclassmembers
tun muss, wenn ich die Optimierungsoption von Dexguard verwende. Ohne dies konnten einige meiner Modellobjekte nicht deserialisiert werden##---------------Begin: proguard configuration for Gson ---------- # Gson uses generic type information stored in a class file when working with fields. Proguard # removes such information by default, so configure it to keep all of it. -keepattributes Signature # For using GSON @Expose annotation -keepattributes *Annotation* # Application classes that will be serialized/deserialized over Gson, keepclassmembers -keep class com.myapp.model.** { *; } -keepclassmembers class com.myapp.model.** { *; }
quelle
-keepclassmembers class com.myapp.model.** { *; }
. Obwohl ich Jackson Lib anstelle von Gson verwende, hat mir diese Zeile geholfen! Vielen Dank.Wenn Sie die
@Expose
Anmerkung wie ich verwenden, können Sie ProGuard anweisen, jedes Feld mit Anmerkungen zu versehen:# keep anything annotated with @Expose -keepclassmembers public class * { @com.google.gson.annotations.Expose *; } # Also keep classes that @Expose everything -keep @com.google.gson.annotations.Expose public class *
quelle
Es gibt eine integrierte
@Keep
Anmerkung, die Sie verwenden. Bitte beziehen Sie sich auf diesen Linkquelle
Um Ihre Klasse von der Verschleierung auszuschließen, behalten Sie die Attribute von InnerClasses bei, behalten Sie Ihre Klasse bei und behalten Sie die Klassenmitglieder der Klasse, z.
-keepattributes InnerClasses -keep class com.yourproject.YourClass** -keepclassmembers class com.yourproject.YourClass** { *; }
Weitere Informationen finden Sie unter http://proguard.sourceforge.net/manual/examples.html
quelle
Proguard 6.1 kann keine Schnittstellen mit Generika in einer Bibliothek verarbeiten. Den Fehlerbericht finden Sie hier: https://sourceforge.net/p/proguard/bugs/765/
quelle
Sie können die Verschleierung in allen Anforderungsartenklassen überspringen
open class Request data class Example(val name: String) : Request()
proguard-rules.pro
-keepclassmembers class * extends <your-package-name>.util.ws.Request { *; }
GL
quelle
Dieser Thread hat bereits erstaunliche Antworten, aber vergessen Sie nicht, hinzuzufügen
-keep public class * extends java.lang.Exception
Andernfalls werden alle Abstürze verschleiert, wenn Sie sie auf der Feuerbasis sehen.
Die offiziellen Dokumente finden Sie hier: https://firebase.google.com/docs/crashlytics/get-deobfuscated-reports?platform=android
quelle