minifyEnabled nell'app Android interrompe le chiamate GoogleApi [duplicato]
TLDR: l'app Android ha problemi con l'API di Google quando minifyEnabled è true.
Esiste un'app Android che utilizza l'API di Google per la creazione di eventi e riunioni Google. Io uso strumenti abbastanza standard per lavorare con queste API - GoogleAuthorizationCodeFlow, com.google.api.services.calendar.Calendar, com.google.api.services.calendar.model.Event. Sto usando la modalità di autenticazione "Applicazioni del server Web" invece di "Applicazioni installate" senza una buona ragione, ma il fatto che ho già fatto funzionare la prima. Tutto funziona bene nella mia modalità di debug, ma quando vado in modalità di rilascio, sorgono problemi.
GoogleClientSecretsdiventa incapace di elaborare secrets.jsonconsole.developers.google.commi ha dato. Lo stesso file funziona bene in modalità debug, ma oraGoogleClientSecrets.getDetailsrestituisce null. Fatto divertente:GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyStringmostra i dati dal file, ma sembra che manchino tutte le virgolette del file di configurazione. Alla fine è stato risolto (ora sto creando segreti direttamente usando clientId / clientSecret, senza file json), ma perché il problema appare al primo posto?- dopo quella correzione,
flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()mi dàhttps://accounts.google.com/o/oauth2/authinvece dihttps://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 maggior parte della parte "relativa" viene ignorata, sebbene redirectUrl e clientId vengano letti e salvati correttamente, ma non vi è traccia di essi in Url. Questo è stato risolto aggiungendo-keep class com.google.api.client.googleapis.auth.oauth2.*al mioproguard-rules.pro. Il che sembra già più una soluzione alternativa che una vera soluzione, ma le cose peggiorano in seguito. - dopo quella correzione, quando lo faccio
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();
con un evento perfettamente buono che funziona bene senza minimizzazione, poi ottengo
c.f.b.a.b.c.b: 404 Not Found
{
"errors" : [ {
"domain" : "global",
"reason" : "notFound",
"message" : "Not Found"
} ],
"code" : 404,
"message" : "Not Found"
}
Questo può essere risolto con -keep class com.google.api.services.calendar.* { *; }in myproguard-rules.pro
- dopo quella correzione, mi dà lo stesso tentativo di inserire l'evento
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)
Dopo alcuni test, ho notato che tutto quanto sopra appare solo quando minifyEnabled è vero. Con minifyEnabled false, tutto funziona come un fascino. Finora ho trovato 3 soluzioni
minifyEnabled false. Tuttavia, mi piacciono i miei file minimizzati durante il rilasciodontobfuscateedontshrinkinproguard-rules.pro. Aiuta, ma riduce l'effetto minificante.keep class * { *; }inproguard-rules.pro. Aiuta, ma riduce l'effetto minificante.
Non riesco a credere che un'opzione standard come minifyEnabled possa rompere qualcosa come GoogleAuthorizationstrumenti standard com.google.api.client.*su così vasta scala. Posso credere che io abbia commesso degli errori stupidi ed evidenti, però. La mia ultima goccia, per ora, sta per "Installato" da "Applicazioni server Web", ma non ho esattamente grandi speranze qui - se fosse la principale fonte di problemi, perché dovrebbe funzionare senza minimizzazione ...
Perché può verificarsi il comportamento descritto? Che cosa sto facendo di sbagliato?
Risposte
Non è una pratica insolita aggiungere eccezioni alle regole al proguard-rules.profile ogni volta che si riscontrano problemi di offuscamento nella build di rilascio.
Lavorare con ProGuard da solo è un argomento intero, ma non pensare che l'aggiunta di eccezioni allo strumento di offuscamento della tua app stia minando la sicurezza della tua app o altro. Alcune API e modelli di codifica richiedono semplicemente alcune eccezioni per funzionare correttamente; es. classi / modelli di dati e tutto ciò che proviene dal livello JNI richiede sempre di essere de-offuscato.
Ecco un breve articolo sull'argomento se non sei ancora convinto.