minifyEnabled en la aplicación de Android interrumpe las llamadas de GoogleApi [duplicado]

Dec 16 2020

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.

  • GoogleClientSecretsse vuelve incapaz de procesar secrets.json console.developers.google.comme dio. El mismo archivo funciona bien en modo de depuración, pero ahora GoogleClientSecrets.getDetailsdevuelve nulo. Dato curioso: GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyStringmuestra 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 en https://accounts.google.com/o/oauth2/authlugar de https://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 mi proguard-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ón
  • dontobfuscatey dontshrinken proguard-rules.pro. Ayuda, pero reduce el efecto de minificación.
  • keep class * { *; }en proguard-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 GoogleAuthorizationtravé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

IvanGarza Dec 16 2020 at 00:22

No es una práctica infrecuente agregar excepciones de reglas a su proguard-rules.proarchivo 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.