web-dev-qa-db-ja.com

Android P(API 28)-StrictModeポリシー違反 "SmartSelectionEventTracker $ SelectionEvent;-> selectionAction"はどういう意味ですか?

SDK以外の使用法を見つけるためにStrictModeを使用しています。

if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
            .detectNonSdkApiUsage()
            .penaltyLog()
            .build());
}

現在、ポリシー違反が発生しています:

D/StrictMode: StrictMode policy violation: Android.os.strictmode.NonSdkApiUsedViolation: Landroid/view/textclassifier/logging/    SmartSelectionEventTracker$SelectionEvent;->selectionAction(IIILandroid/view/textclassifier/TextClassification;)Landroid/view/textclassifier/logging/    SmartSelectionEventTracker$SelectionEvent;
        at Android.os.StrictMode.lambda$static$1(StrictMode.Java:428)
        at Android.os.-$$Lambda$StrictMode$lu9ekkHJ2HMz0jd3F8K8MnhenxQ.accept(Unknown Source:2)
        at Java.lang.Class.getDeclaredMethodInternal(Native Method)
        at Java.lang.Class.getPublicMethodRecursive(Class.Java:2075)
        at Java.lang.Class.getMethod(Class.Java:2063)
        at Java.lang.Class.getMethod(Class.Java:1690)
        at bzi.a(SourceFile:11)
        at bzq.a(SourceFile:12)
        at org.chromium.content.browser.selection.SmartSelectionClient.<init>(SourceFile:5)
        at bzZ.a(Unknown Source:7)
        at org.chromium.Android_webview.AwContents.e(SourceFile:193)
        at org.chromium.Android_webview.AwContents.d(SourceFile:153)
        at org.chromium.Android_webview.AwContents.<init>(SourceFile:81)
        at uY.run(SourceFile:15)
        at ahv.a(SourceFile:13)
        at ahw.run(SourceFile:2)
        at org.chromium.base.ThreadUtils.b(SourceFile:31)
        at ahv.a(SourceFile:7)
        at com.Android.webview.chromium.WebViewChromiumFactoryProvider.b(SourceFile:6)
        at com.Android.webview.chromium.WebViewChromium.init(SourceFile:111)
        at Android.webkit.WebView.<init>(WebView.Java:678)
        at Android.webkit.WebView.<init>(WebView.Java:604)
        at Android.webkit.WebView.<init>(WebView.Java:587)
        at Android.webkit.WebView.<init>(WebView.Java:574)
        at Java.lang.reflect.Constructor.newInstance0(Native Method)
        at Java.lang.reflect.Constructor.newInstance(Constructor.Java:343)
        at Android.view.LayoutInflater.createView(LayoutInflater.Java:647)
        at com.Android.internal.policy.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.Java:58)
        at Android.view.LayoutInflater.onCreateView(LayoutInflater.Java:720)
        at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:788)
        at Android.view.LayoutInflater.createViewFromTag(LayoutInflater.Java:730)
        at Android.view.LayoutInflater.rInflate(LayoutInflater.Java:863)
        at Android.view.LayoutInflater.rInflateChildren(LayoutInflater.Java:824)
        at Android.view.LayoutInflater.inflate(LayoutInflater.Java:515)
        at Android.view.LayoutInflater.inflate(LayoutInflater.Java:423)
        at com.mine.ui.events.EventScreen.onCreateView(EventScreen.Java:70)
        at Android.support.v4.app.Fragment.performCreateView(Fragment.Java:2354)
        at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1419)
        at Android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.Java:1740)
        at Android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.Java:1809)
        at Android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.Java:799)
        at Android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.Java:2580)
        at Android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.Java:2367)
        at Android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.Java:2322)
        at Android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.Java:2229)
        at Android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.Java:781)
        (... shortened ...)

重要な行は次のとおりです。

at com.mine.ui.events.EventScreen.onCreateView(EventScreen.Java:70)

上記の行を調べる:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
// This is the important line:
ViewGroup content = (ViewGroup) inflater.inflate(R.layout.mine_event, container, false);
WebView webView = (WebView) content.findViewById(R.id.container);
webView.loadUrl(event.getWebViewUrl());
webView.getSettings().setJavaScriptEnabled(true);
(...)

だから、インフレが起こっている間に違反を受け取りますが、それはよくわかりません。

上記の行のすぐ後に見ることができるように、WebViewが作用します。 SmartSelectionEventTrackerhere のソースコードを見ましたが、Widgets like TextViews, WebViews, ...の汎用クラスのようです。 WebViewsMockViewsに関連しているTextViewsに関連しているようです。

しかし、その発見を除けば、違反がどのように/なぜ起こっているのか、そしてそれに対して何ができるのか理解できません。

誰かがこれを私に説明できますか?

13
hamena314

Android Pでは、プライベートAPI(つまり、パブリックSDKの一部ではなく、リフレクションを介してアクセスされるAPI)に制限が追加されました。参照してください 非SDKインターフェイスの制限

Android 9(APIレベル28)では、直接、リフレクション経由、またはJNI経由のいずれであっても、非SDKインターフェイスの使用に新しい制限が導入されています。これらの制限は、アプリが非SDKインターフェイスを参照するか、リフレクションまたはJNIを使​​用してハンドルを取得しようとするたびに適用されます。この決定の詳細については、非SDKインターフェイスの使用を減らすことによる安定性の向上を参照してください。

だからそれはあなたが見ているものです-それは何かが将来削除されるかもしれないプライベートAPIの1つにアクセスしているという警告です。ただし、スタックトレースは、前述したように、これがWebViewからのものであることを示しています。特に、 SmartSelectionClient の初期化中。暗黙的にアクセスしているネイティブライブラリを初期化します SmartSelectionEventTracker 、Javadocステートメントで_@hide_とマークされ、公開SDKの一部ではありません。

要するに、この特定の警告についてあなたができることはおそらくないので、私はそれについて心配しません。デバイスのChromium WebView実装で発生しているため、アプリケーションの制御外です。 AndroidとChromiumの両方がGoogleによって公開されているため、将来のリリースで正当な問題が発生した場合、問題が発生する前にWebView実装に更新が公開されます。

11
kcoppock