AndroidアプリのminifyEnabledは、GoogleApiの呼び出しを中断します[重複]

Dec 16 2020

TLDR-minifyEnabledがtrueの場合、AndroidアプリでGoogleAPIに問題が発生します。

イベントやGoogleミーティングを作成するためにGoogleAPIを使用するAndroidアプリがあります。-私は、これらのAPIを操作するためのかなりの標準ツールを使用してGoogleAuthorizationCodeFlowcom.google.api.services.calendar.Calendarcom.google.api.services.calendar.model.Event「インストールされたアプリケーション」の代わりに「Webサーバーアプリケーション」の認証方法を使用していますが、理由はありませんが、最初のアプリケーションはすでに機能しています。デバッグモードではすべて正常に動作しますが、リリースモードに移行すると、問題が発生します。

  • GoogleClientSecretssecrets.jsonconsole.developers.google.comが私にくれたものを処理できなくなります。同じファイルはデバッグモードでも正常に機能しますが、GoogleClientSecrets.getDetailsnullを返すようになりました。面白い事実-GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyStringファイルからデータを表示しますが、構成ファイルにあるすべての引用符が欠落しているようです。最終的には修正されました(現在、jsonファイルなしでclientId / clientSecretを使用して直接シークレットを作成しています)が、なぜ問題が最初に現れるのですか?
  • その修正後、の代わりに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の場合にのみ、上記のすべてが表示されることに気付きました。minifyEnabled falseを使用すると、すべてがチャームのように機能します。これまでに3つの解決策を見つけました

  • minifyEnabled false。私はリリースで縮小されたファイルが好きですが
  • dontobfuscatedontshrinkproguard-rules.pro。助けますが、縮小の効果を減らします。
  • keep class * { *; }proguard-rules.pro。助けますが、縮小の効果を減らします。

minifyEnabledのような標準オプションが、これほど大規模なGoogleAuthorization標準ツールのようなものを壊すとは信じられませんcom.google.api.client.*。しかし、私はいくつかの愚かで明白な間違いを犯していると信じることができます。私の最後のストローは、今のところ、「Webサーバーアプリケーション」から「インストール済み」の方法になりますが、ここでは大きな期待はしていません。それが問題の主な原因である場合、なぜ縮小せずに機能するのでしょうか...

説明されている動作が発生するのはなぜですか?私は何が間違っているのですか?

回答

IvanGarza Dec 16 2020 at 00:22

proguard-rules.proリリースビルドで難読化の問題が見つかった場合は常に、ファイルにルール例外を追加することは珍しいことではありません。

ProGuardを単独で使用することはトピック全体ですが、アプリの難読化ツールに例外を追加しても、アプリのセキュリティなどが損なわれるとは思わないでください。一部のAPIとコーディングパターンは、正しく機能するためにいくつかの例外を必要とするだけです。たとえば、データクラス/モデル、およびJNIレイヤーからのすべてのものは常に難読化を解除する必要があります。

ここだトピックに関する簡単な記事では、あなたはまだ納得していないなら。