minifyEnabled no aplicativo Android interrompe chamadas GoogleApi [duplicado]

Dec 16 2020

TLDR - o aplicativo Android tem problemas com a API do Google quando minifyEnabled é verdadeiro.

Existe um aplicativo Android que usa API do Google para a criação de eventos e reuniões do Google. Eu uso ferramentas bastante padrão para trabalhar com essas APIs - GoogleAuthorizationCodeFlow, com.google.api.services.calendar.Calendar, com.google.api.services.calendar.model.Event. Estou usando o modo de autenticação de "aplicativos de servidor Web" em vez de "Aplicativos instalados" sem nenhuma boa razão, mas o fato de que já fiz o primeiro funcionar. Tudo funciona bem no meu modo de depuração, mas quando vou para o modo de lançamento, surgem problemas.

  • GoogleClientSecretstorna-se incapaz de processar secrets.json console.developers.google.comme deu. O mesmo arquivo funciona bem no modo de depuração, mas agora GoogleClientSecrets.getDetailsretorna nulo. Fato engraçado - GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyStringmostra os dados do arquivo, mas parece que estão faltando todos os arquivos de configuração de cotações. Eventualmente foi corrigido (agora estou criando segredos diretamente usando clientId / clientSecret, sem o arquivo json), mas por que o problema aparece em primeiro lugar?
  • após essa correção, flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()dá-me em https://accounts.google.com/o/oauth2/authvez 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. A maior parte da parte "relativa" é ignorada, embora redirectUrl e clientId sejam lidos e salvos corretamente - mas não há nenhum vestígio deles no Url. Isso foi corrigido adicionando -keep class com.google.api.client.googleapis.auth.oauth2.*ao meu proguard-rules.pro. O que já parece mais uma solução alternativa do que uma solução real, mas as coisas pioram mais tarde.
  • depois dessa correção, quando eu faço
    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();

com um evento perfeitamente bom que funciona bem sem minificação, então recebo

c.f.b.a.b.c.b: 404 Not Found
{
   "errors" : [ {
     "domain" : "global",
     "reason" : "notFound",
     "message" : "Not Found"
   } ],
   "code" : 404,
   "message" : "Not Found"
}

Isso pode ser consertado -keep class com.google.api.services.calendar.* { *; }no meuproguard-rules.pro

  • após essa correção, a mesma tentativa de inserir evento me dá
    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)

Depois de alguns testes, percebi que todos os itens acima só aparecem quando minifyEnabled é verdadeiro. Com minifyEnabled false, tudo funciona perfeitamente. Até agora encontrei 3 soluções

  • minifyEnabled false. Eu meio que gosto de meus arquivos minimizados no lançamento
  • dontobfuscatee dontshrinkem proguard-rules.pro. Ajuda, mas reduz o efeito de minimização.
  • keep class * { *; }no proguard-rules.pro. Ajuda, mas reduz o efeito de minimização.

Eu não posso acreditar que uma opção padrão como minifyEnabled quebraria algo como GoogleAuthorizationpor meio de ferramentas padrão com.google.api.client.*em uma escala tão grande. Posso acreditar que cometi alguns erros estúpidos e óbvios, no entanto. Minha gota d'água, por enquanto, vai para o caminho "Instalado" de "aplicativos de servidor Web", mas eu não coloco exatamente grandes esperanças aqui - se fosse a principal fonte de problemas, por que funcionaria sem minificação ...

Por que o comportamento descrito pode acontecer? O que estou fazendo de errado?

Respostas

IvanGarza Dec 16 2020 at 00:22

Não é uma prática incomum adicionar exceções de regra ao seu proguard-rules.proarquivo sempre que você encontrar problemas com ofuscação em sua versão de lançamento.

Trabalhar com o ProGuard sozinho é um tópico inteiro, mas não pense que adicionar exceções à ferramenta de ofuscação do seu aplicativo está minando a segurança do seu aplicativo ou algo assim. Algumas APIs e padrões de codificação simplesmente exigem algumas exceções para funcionar corretamente; por exemplo, classes / modelos de dados e tudo que vem da camada JNI sempre precisam ser desofuscados.

Aqui está um artigo rápido sobre o assunto se você ainda não está convencido.