minifyEnabled en la aplicación de Android interrumpe las llamadas de GoogleApi [duplicado]
TLDR: la aplicación de Android tiene problemas con la API de Google cuando minifyEnabled es verdadero.
Hay una aplicación de Android que utiliza la API de Google para crear eventos y reuniones de Google. Yo uso bastante estándar herramientas para trabajar con las API - GoogleAuthorizationCodeFlow
, com.google.api.services.calendar.Calendar
, com.google.api.services.calendar.model.Event
. Estoy usando la forma de autenticación de "aplicaciones de servidor web" en lugar de "Aplicaciones instaladas" sin una buena razón, pero el hecho de que ya hice que la primera funcionara. Todo funciona bien en mi modo de depuración, pero cuando voy al modo de lanzamiento, surgen problemas.
GoogleClientSecrets
se vuelve incapaz de procesar secrets.jsonconsole.developers.google.com
me dio. El mismo archivo funciona bien en modo de depuración, pero ahoraGoogleClientSecrets.getDetails
devuelve nulo. Dato curioso:GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString
muestra los datos del archivo, pero parece que faltan todas las comillas que tiene el archivo de configuración. Finalmente se solucionó (ahora estoy creando secretos directamente usando clientId / clientSecret, sin el archivo json), pero ¿por qué el problema aparece en primer lugar?- después de esa solución,
flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()
me da enhttps://accounts.google.com/o/oauth2/auth
lugar 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 mayor parte de la parte "relativa" se omite, aunque redirectUrl y clientId se leen y guardan correctamente, pero no hay rastro de ellos en la URL. Esto se solucionó agregando-keep class com.google.api.client.googleapis.auth.oauth2.*
a miproguard-rules.pro
. Lo que ya parece más una solución alternativa que una solución real, pero las cosas empeoran más tarde. - después de esa solución, cuando lo haga
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 perfectamente bueno que funciona bien sin minificación, entonces obtengo
c.f.b.a.b.c.b: 404 Not Found
{
"errors" : [ {
"domain" : "global",
"reason" : "notFound",
"message" : "Not Found"
} ],
"code" : 404,
"message" : "Not Found"
}
Esto se puede arreglar -keep class com.google.api.services.calendar.* { *; }
en miproguard-rules.pro
- después de esa solución, el mismo intento de insertar un evento me da
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)
Después de algunas pruebas, noté que todo lo anterior aparece solo cuando minifyEnabled es verdadero. Con minifyEnabled false, todo funciona a la perfección. Hasta ahora encontré 3 soluciones
minifyEnabled false
. Aunque me gustan mis archivos minimizados en la versióndontobfuscate
ydontshrink
enproguard-rules.pro
. Ayuda, pero reduce el efecto de minificación.keep class * { *; }
enproguard-rules.pro
. Ayuda, pero reduce el efecto de minificación.
No puedo creer que una opción estándar como minifyEnabled rompa algo así como a GoogleAuthorization
través de herramientas estándar de com.google.api.client.*
una escala tan grande. Sin embargo, puedo creer en mí cometiendo algunos errores obvios y estúpidos. Mi última gota, por ahora, va a "Instalar" desde "Aplicaciones de servidor web", pero no pongo grandes esperanzas aquí - si fuera la principal fuente de problemas, ¿por qué funcionaría sin minificación ...
¿Por qué puede ocurrir el comportamiento descrito? ¿Qué estoy haciendo mal?
Respuestas
No es una práctica infrecuente agregar excepciones de reglas a su proguard-rules.pro
archivo siempre que encuentre problemas de ofuscación en su versión de lanzamiento.
Trabajar con ProGuard por sí solo es un tema completo, pero no piense que agregar excepciones a la herramienta de ofuscación de su aplicación está socavando la seguridad de su aplicación o todo eso. Algunas API y patrones de codificación simplemente requieren algunas excepciones para funcionar correctamente; por ejemplo, clases / modelos de datos, y todo lo que provenga de la capa JNI siempre requiere ser desofuscado.
Aquí hay un artículo rápido sobre el tema si aún no está convencido.