minifyEnabled no aplicativo Android interrompe chamadas GoogleApi [duplicado]
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.
GoogleClientSecrets
torna-se incapaz de processar secrets.jsonconsole.developers.google.com
me deu. O mesmo arquivo funciona bem no modo de depuração, mas agoraGoogleClientSecrets.getDetails
retorna nulo. Fato engraçado -GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString
mostra 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 emhttps://accounts.google.com/o/oauth2/auth
vez 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
. 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 meuproguard-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çamentodontobfuscate
edontshrink
emproguard-rules.pro
. Ajuda, mas reduz o efeito de minimização.keep class * { *; }
noproguard-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 GoogleAuthorization
por 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
Não é uma prática incomum adicionar exceções de regra ao seu proguard-rules.pro
arquivo 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.