Flutterのfirebase_crashlyticsでNonSdkApiUsedViolationが検知される問題の暫定回避策


半年ほど放置していたFlutterのアプリをメンテしていたらfirebase_crashlyticsで問題発生。Google Play Consoleのリリース前レポートでNonSdkApiUsedViolationが2件検知されてしまいました。

StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V

StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Lcom/android/org/conscrypt/ConscryptEngineSocket;->setUseSessionTickets(Z)V

バージョンは以下の通り。

  • Flutter 2.0.6
  • firebase_analytics: 8.0.2

調べてみるとGitHubにissueが上がっていました。

[firebase_crashlytics] `flutter build appbundle` builds app that uses private API’s · Issue #5850 · FirebaseExtended/flutterfire

起票されて半月経っているのに進展している様子がないですし解決策も載っていないんですが、marcqtanさんのコメント のStackTraceを見ると

StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation: Lcom/android/org/conscrypt/ConscryptEngineSocket;->setHostname(Ljava/lang/String;)V
	at android.os.StrictMode.lambda$static$1(StrictMode.java:416)
	(snip)
	at okhttp3.internal.platform.OptionalMethod.getPublicMethod(OptionalMethod.java:164)
	at okhttp3.internal.platform.OptionalMethod.getMethod(OptionalMethod.java:149)
	(snip)
	at okhttp3.RealCall.execute(RealCall.java:92)
	at com.google.firebase.crashlytics.internal.network.HttpRequest.execute(HttpRequest.java:129)
	at com.google.firebase.crashlytics.internal.settings.network.DefaultSettingsSpiCall.invoke(DefaultSettingsSpiCall.java:86)
	at com.google.firebase.crashlytics.internal.settings.SettingsController$1.then(SettingsController.java:200)
	at com.google.firebase.crashlytics.internal.settings.SettingsController$1.then(SettingsController.java:193)
	(snip)

となっていて、okhttp3が怪しいのでは?という手掛かりが得られます。

okhttp3のほうを確認してみると、それらしきissueが見つかりました。

Use SSLEngine.setApplicationProtocols() and SSLSocket.getApplicationProtocol() for Android Q · Issue #3980 · square/okhttp

どうやらokhttp側は対応済みのようです。

ということは、okhttpをバージョンアップしてしまえばよさそう。firebase_crashlyticsはokhttpの3.12系を使っているようなので、3.12系の最新版を使うことにします。

android\app\build.gradle

// Google Play Console で `StrictMode policy violation: android.os.strictmode.NonSdkApiUsedViolation` の警告が出る問題への workaround
implementation 'com.squareup.okhttp3:okhttp:3.12.13'

を追加して再度Google Play Consoleのリリース前レポートを実施したところ、無事にNonSdkApiUsedViolationが検知されなくなりました。

このやり方、firebase_crashlytics側で検証されていないバージョンのokhttpを使うことになるのであくまで暫定回避策です。個人的には大丈夫だろうと判断してアプリはそのままリリースしましたが、リスク取れないよー、という方はfirebase_crashlyticsが修正してくれるのを待つのが吉です。




関連(するかもしれない)記事


おススメ