这个问题在这里已经有答案了:
android谷歌日历api发布时不工作(3个答案)
25天前关门了。
tldr-当minifyenabled为true时,android应用程序与google api存在问题。
有一个android应用程序使用googleapi创建事件和google会议。我使用相当标准的工具来处理这些API- GoogleAuthorizationCodeFlow
, com.google.api.services.calendar.Calendar
, com.google.api.services.calendar.model.Event
. 我使用“web服务器应用程序”身份验证方式,而不是“安装的应用程序”没有好的理由,但事实上我已经使第一个工作。在我的调试模式下一切正常,但是当我进入发布模式时,问题就出现了。 GoogleClientSecrets
无法处理secrets.json console.developers.google.com
给我的。同一个文件在调试模式下工作正常,但现在 GoogleClientSecrets.getDetails
返回null。有趣的事实- GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString
显示文件中的数据,但似乎缺少配置文件的所有引号。它最终修复了(现在我直接使用clientid/clientsecret创建秘密,没有json文件),但为什么问题首先出现呢?
修好之后, flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()
给了我 https://accounts.google.com/o/oauth2/auth
而不是 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
. 虽然redirecturl和clientid被正确读取和保存,但大多数“相对”部分被跳过了,但在url中并没有它们的踪迹。这是通过添加 -keep class com.google.api.client.googleapis.auth.oauth2.*
给我的 proguard-rules.pro
. 这看起来更像是解决问题的方法,而不是真正的解决方案,但事情会变得更糟。
在那次修理之后
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();
有一个完美的事件,没有缩小工作很好,然后我得到
c.f.b.a.b.c.b: 404 Not Found
{
"errors" : [ {
"domain" : "global",
"reason" : "notFound",
"message" : "Not Found"
} ],
"code" : 404,
"message" : "Not Found"
}
这可以通过 -keep class com.google.api.services.calendar.* { *; }
在我的 proguard-rules.pro
在修复之后,同样的尝试插入事件
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)
在一些测试之后,我注意到,只有minifyenabled为true时才会出现上述所有情况。如果minify为false,则所有操作都像一个符咒。到目前为止,我找到了3个解决方案 minifyEnabled false
. 我有点喜欢我的文件在发行版缩小 dontobfuscate
以及 dontshrink
在 proguard-rules.pro
. 帮助,但减少缩小效果。 keep class * { *; }
在 proguard-rules.pro
. 帮助,但减少缩小效果。
我不敢相信像minifyenabled这样的标准选项会破坏 GoogleAuthorization
通过标准工具 com.google.api.client.*
规模如此之大。不过,我相信我会犯一些愚蠢而明显的错误。目前,我的最后一根稻草将从“web服务器应用程序”中“安装”出来,但我并没有在这里寄予厚望——如果这是问题的主要根源,为什么不缩小它就可以工作。。。
为什么会发生所描述的行为?我做错什么了?
1条答案
按热度按时间wf82jlnq1#
将规则例外添加到
proguard-rules.pro
当您在发布版本中发现混淆问题时,请使用。单独使用proguard是一个完整的主题,但不要认为在应用程序的模糊处理工具中添加异常会破坏应用程序的安全性。一些api和编码模式只是需要一些异常才能正常工作;e、 数据类/模型,以及来自jni层的所有东西都需要去模糊处理。
如果你还不确定的话,这里有一篇关于这个主题的文章。