minifyEnabled in der Android-App unterbricht GoogleApi-Anrufe [duplizieren]
TLDR - Android App hat Probleme mit der Google API, wenn minifyEnabled wahr ist.
Es gibt eine Android-App, die die Google-API zum Erstellen von Ereignissen und Google-Meetings verwendet. Ich benutze ziemlich Standard - Tools für mit diesem APIs arbeiten - GoogleAuthorizationCodeFlow
, com.google.api.services.calendar.Calendar
, com.google.api.services.calendar.model.Event
. Ich verwende die Authentifizierungsmethode "Webserveranwendungen" anstelle von "Installierte Anwendungen" ohne guten Grund, aber aufgrund der Tatsache, dass ich bereits die erste zum Laufen gebracht habe. In meinem Debug-Modus funktioniert alles einwandfrei, aber wenn ich in den Release-Modus wechsle, treten Probleme auf.
GoogleClientSecrets
wird unfähig, Geheimnisse zu verarbeiten. jsonconsole.developers.google.com
gab mir. Dieselbe Datei funktioniert im Debug-Modus einwandfrei, gibt jedoch jetztGoogleClientSecrets.getDetails
null zurück. Lustige Tatsache -GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString
zeige Daten aus der Datei, aber es scheint, dass alle Anführungszeichen der Konfigurationsdatei fehlen. Es wurde schließlich behoben (jetzt erstelle ich Geheimnisse direkt mit clientId / clientSecret ohne json-Datei), aber warum tritt das Problem an erster Stelle auf?- nach diesem Fix
flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()
gibt mirhttps://accounts.google.com/o/oauth2/auth
statthttps://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=<myClientId>&redirect_uri=<myRedirect>&response_type=code&scope=https://www.googleapis.com/auth/calendar
. Der größte Teil des "relativen" Teils wird übersprungen, obwohl redirectUrl und clientId korrekt gelesen und gespeichert werden - aber in der URL gibt es keine Spur davon. Dies wurde mit dem Hinzufügen-keep class com.google.api.client.googleapis.auth.oauth2.*
zu meinem behobenproguard-rules.pro
. Das sieht schon nach mehr Problemumgehung als nach einer echten Lösung aus, aber später wird es schlimmer. - nach diesem Fix, wenn ich es tue
Credential credential = getCredential(context);
Calendar service = new Calendar.Builder(HTTP_TRANSPORT,
JSON_FACTORY,
credential)
.setApplicationName(APPLICATION_NAME)
.build();
service.events().insert(calendarId, event)
.setConferenceDataVersion(1)
.setSupportsAttachments(true)
.execute();
mit einer vollkommen guten Veranstaltung, die ohne Minimierung gut funktioniert, dann bekomme ich
c.f.b.a.b.c.b: 404 Not Found
{
"errors" : [ {
"domain" : "global",
"reason" : "notFound",
"message" : "Not Found"
} ],
"code" : 404,
"message" : "Not Found"
}
Dies kann mit -keep class com.google.api.services.calendar.* { *; }
in meinem behoben werdenproguard-rules.pro
- Nach diesem Fix gibt mir der gleiche Versuch, ein Ereignis einzufügen
W/System.err: java.lang.IllegalArgumentException: key creator
at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:889)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:382)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:355)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
Nach einigen Tests habe ich festgestellt, dass alle oben genannten Punkte nur angezeigt werden, wenn minifyEnabled wahr ist. Mit minifyEnabled false funktioniert alles wie ein Zauber. Bisher habe ich 3 Lösungen gefunden
minifyEnabled false
. Ich mag es, wenn meine Dateien in der Version minimiert werdendontobfuscate
unddontshrink
inproguard-rules.pro
. Hilft, reduziert aber den Minimierungseffekt.keep class * { *; }
inproguard-rules.pro
. Hilft, reduziert aber den Minimierungseffekt.
Ich kann nicht glauben, dass eine Standardoption wie minifyEnabled so etwas wie GoogleAuthorization
Standardwerkzeuge von com.google.api.client.*
so großem Umfang durchbrechen würde . Ich kann jedoch glauben, dass ich einige dumme und offensichtliche Fehler mache. Mein letzter Strohhalm wird vorerst "Installiert" von "Webserver-Anwendungen" sein, aber ich setze hier nicht gerade große Hoffnungen - wenn es die Hauptursache für Probleme wäre, warum würde es ohne Minimierung funktionieren ...
Warum kann das beschriebene Verhalten auftreten? Was mache ich falsch?
Antworten
Es ist keine ungewöhnliche Praxis, Ihrer proguard-rules.pro
Datei Regelausnahmen hinzuzufügen, wenn Sie Probleme mit der Verschleierung in Ihrem Release-Build finden.
Die Arbeit mit ProGuard allein ist ein ganzes Thema, aber denken Sie nicht, dass das Hinzufügen von Ausnahmen zum Verschleierungstool Ihrer App die Sicherheit Ihrer App oder so weiter untergräbt. Einige APIs und Codierungsmuster erfordern lediglich einige Ausnahmen, um ordnungsgemäß zu funktionieren. zB Datenklassen / -modelle und alles, was von der JNI-Schicht kommt, muss immer verschleiert werden.
Hier ist ein kurzer Artikel zum Thema, wenn Sie immer noch nicht überzeugt sind.