minifyEnabled dans l'application Android interrompt les appels GoogleApi [dupliquer]
TLDR - L'application Android a des problèmes avec l'API Google lorsque minifyEnabled est vrai.
Il existe une application Android qui utilise l'API Google pour créer des événements et des réunions Google. J'utilise des outils assez standard pour travailler avec ces API - GoogleAuthorizationCodeFlow
, com.google.api.services.calendar.Calendar
, com.google.api.services.calendar.model.Event
. J'utilise le moyen d' authentification "Applications serveur Web" au lieu de "Applications installées" sans raison valable, mais le fait que j'ai déjà fait fonctionner le premier. Tout fonctionne bien dans mon mode de débogage, mais lorsque je passe en mode de libération, des problèmes surviennent.
GoogleClientSecrets
devient incapable de traiter les secrets.jsonconsole.developers.google.com
m'a donné. Le même fichier fonctionne correctement en mode débogage, maisGoogleClientSecrets.getDetails
renvoie désormais null. Fait drôle -GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString
affichez les données du fichier, mais il semble qu'il manque toutes les citations du fichier de configuration. Il a finalement été corrigé (maintenant je crée des secrets directement en utilisant clientId / clientSecret, sans fichier json), mais pourquoi le problème apparaît-il en premier lieu?- après ce correctif,
flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()
me donnehttps://accounts.google.com/o/oauth2/auth
au lieu dehttps://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
. La plupart des parties "relatives" sont ignorées, bien que redirectUrl et clientId soient lus et enregistrés correctement - mais il n'y en a aucune trace dans l'URL. Ce problème a été résolu en ajoutant-keep class com.google.api.client.googleapis.auth.oauth2.*
à mon fichierproguard-rules.pro
. Ce qui ressemble déjà plus à une solution de contournement qu'à une vraie solution, mais les choses empirent plus tard. - après ce correctif, quand je le fais
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();
avec un événement parfaitement bon qui fonctionne bien sans minification, alors j'obtiens
c.f.b.a.b.c.b: 404 Not Found
{
"errors" : [ {
"domain" : "global",
"reason" : "notFound",
"message" : "Not Found"
} ],
"code" : 404,
"message" : "Not Found"
}
Cela peut être corrigé avec -keep class com.google.api.services.calendar.* { *; }
dans monproguard-rules.pro
- après ce correctif, la même tentative d'insertion d'événement me donne
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)
Après quelques tests, j'ai remarqué que tout ce qui précède n'apparaît que lorsque minifyEnabled est vrai. Avec minifyEnabled false, tout fonctionne comme un charme. Jusqu'à présent, j'ai trouvé 3 solutions
minifyEnabled false
. J'aime un peu mes fichiers minifiés dans la versiondontobfuscate
etdontshrink
dansproguard-rules.pro
. Aide, mais réduit l'effet de la minification.keep class * { *; }
dansproguard-rules.pro
. Aide, mais réduit l'effet de la minification.
Je ne peux pas croire qu'une option standard comme minifyEnabled casserait quelque chose comme GoogleAuthorization
des outils standard com.google.api.client.*
à une si grande échelle. Je peux croire que je fais des erreurs stupides et évidentes, cependant. Ma dernière goutte, pour l'instant, va au chemin "Installé" à partir des "applications serveur Web", mais je ne mets pas vraiment de grands espoirs ici - si c'était la principale source de problèmes, pourquoi cela fonctionnerait-il sans minification ...
Pourquoi le comportement décrit peut-il se produire? Qu'est-ce que je fais mal?
Réponses
Il n'est pas rare d'ajouter des exceptions de règle à votre proguard-rules.pro
fichier chaque fois que vous rencontrez des problèmes d'obfuscation dans votre version de version.
Travailler avec ProGuard seul est un sujet entier, mais ne pensez pas que l'ajout d'exceptions à l'outil d'obscurcissement de votre application compromet la sécurité de votre application ou autre. Certaines API et modèles de codage nécessitent simplement quelques exceptions pour fonctionner correctement; par exemple, les classes / modèles de données et tout ce qui provient de la couche JNI doivent toujours être désobscurcis.
Voici un petit article sur le sujet si vous n'êtes toujours pas convaincu.