Android P (API 28). Что означает нарушение политики StrictMode "SmartSelectionEventTracker$SelectionEvent;->selectionAction"?
Я использую StrictMode
чтобы найти не SDK использования:
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
вступает в игру. Я посмотрел на исходный код SmartSelectionEventTracker
здесь, и это похоже на общий класс для Widgets like TextViews, WebViews, ...
,WebViews
похоже, связаны с MockViews
которые связаны с TextViews
,
Но, помимо этого, я не понимаю, как и почему происходит нарушение, и что я могу сделать против него.
Кто-нибудь может мне это объяснить?
1 ответ
В Android P были добавлены ограничения для частных API (то есть API, которые не являются частью общедоступного SDK и доступны через отражение). См. Ограничения для интерфейсов не SDK:
Android 9 (уровень API 28) вводит новые ограничения на использование не SDK-интерфейсов, будь то напрямую, через отражение или через JNI. Эти ограничения применяются всякий раз, когда приложение ссылается на интерфейс не SDK или пытается получить его дескриптор, используя отражение или JNI. Дополнительные сведения об этом решении см. В разделе "Повышение стабильности за счет сокращения использования интерфейсов, отличных от SDK".
Это то, что вы видите - это предупреждение, что что-то получает доступ к одному из тех частных API, которые могут быть удалены в будущем. Однако трассировка стека показывает, как вы упомянули, что это исходит от WebView
, В частности, во время инициализации SmartSelectionClient
, Это инициализирует собственную библиотеку, которая неявно обращается к SmartSelectionEventTracker
, который отмечен @hide
в своем заявлении Javadoc, которое указывает, что оно не является частью общедоступного SDK.
Короче говоря, вы ничего не можете сделать с этим конкретным предупреждением, поэтому я не буду беспокоиться об этом. Это происходит в устройстве Chromium WebView
реализации, так что это вне контроля вашего приложения. Поскольку и Android, и Chromium публикуются Google, если в будущем будет обнаружена законная проблема, обновление будет опубликовано для WebView
реализация, прежде чем это станет проблемой.