5

Wir müssen den Inhalt speichern und abrufen, den Nutzer mit unserer App online generieren. Um dies zu erreichen, haben wir uns entschieden, die integrierte Google Cloud Endpoints-Vorlage von Android Studio zu verwenden, um schnell eine API zu erstellen (offizielles Anwendungsbeispiel here).Proguard-Konfiguration bei Verwendung der Google Cloud Endpoints-Vorlage von Android Studio

Es funktioniert gut im Debug, aber im Freigabemodus, mit Proguard aktiviert, schlägt es fehl. Schlimmer noch, ich habe keine Dokumentation oder Beispiele zur Verwendung von Proguard mit den Endpoint-Vorlagen von Android Studio gefunden.

Nach einer Stunde oder so um von Stossen und zu versuchen, es Arbeit zu bilden, die proguard-rules.pro sieht nun wie folgt aus:

-keep class com.google.api.** { public *; } 
-dontwarn com.google.api.** 
-keep class com.google.common.** { public *; } 
-dontwarn com.google.common.** 

# Not allowed to post company and app names, but this line is correct in the real file 
-keep class com.companyname.appname.application.backend.** { *; } 

Mit dieser Konfiguration, ich bin eine Klasse Besetzung bekommen Ausnahme in meinem ArrayAdapter:

java.lang.ClassCastException: com.google.api.client.util.ArrayMap cannot be cast to com.companyname.appname.application.backend.messageApi.model.Message 

Es scheint die Umwandlung von zurückgegebenen Daten nicht irgendwo und durchgeführt wird, statt ein List von Message Objekten, erhalte ich ein List von com.google.api.client.util.ArrayMap Objekte (sie enthalten übrigens gültige Daten).

Ich konnte überprüfen, ob die App im Freigabemodus ausgeführt wird und die Konvertierung manuell durchführen, aber es ist ein hacky Weg und ich würde es lieber richtig machen. Kann mir bitte jemand sagen, was mir in der Proguard-Konfigurationsdatei fehlt?

Antwort

17

Ich mache ähnliche Dinge mit Endpunkten in einer meiner Apps. Ich hatte auch Probleme mit Proguard (kann mich nicht genau erinnern).

Dieser Abschnitt meines Proguard Regeln scheint anwendbar:

# Needed by google-api-client to keep generic types and @Key annotations accessed via reflection 
-keepclassmembers class * { 
    @com.google.api.client.util.Key <fields>; 
} 
-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault 

Ich weiß nicht, ob es notwendig ist, aber ich habe auch diesen Abschnitt:

# Play Services 
-dontwarn com.google.android.gms.** 
-dontwarn com.google.common.cache.** 
-dontwarn com.google.common.primitives.** 
-keep class * extends java.util.ListResourceBundle { 
    protected Object[][] getContents(); 
} 
-keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { 
    public static final *** NULL; 
} 
-keepnames @com.google.android.gms.common.annotation.KeepName class * 
-keepclassmembernames class * { 
    @com.google.android.gms.common.annotation.KeepName *; 
} 

Hoffe, es hilft.

+5

Der erste Abschnitt von dem, was Sie gepostet haben, ist in der Tat die richtige Lösung. – Manvis

+2

Großartig, danke für die Rückmeldung. – myanimal

+0

Erster Abschnitt ist mein Leben gerettet !! Riesiges Danke! – KimKha

Verwandte Themen