J'utilise le StrictMode
afin de trouver des utilisations non SDK:
if (BuildConfig.DEBUG && Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
.detectNonSdkApiUsage()
.penaltyLog()
.build());
}
Maintenant, je reçois une violation de politique:
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 ...)
La ligne importante est:
at com.mine.ui.events.EventScreen.onCreateView(EventScreen.Java:70)
Examen de la ligne mentionnée:
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);
(...)
Je reçois donc la violation pendant que l'inflation se produit, ce que je ne comprends pas très bien.
Comme vous pouvez le voir peu de temps après la ligne mentionnée, un WebView
entre en jeu. J'ai regardé le code source du SmartSelectionEventTracker
ici et il semble être une classe générique pour Widgets like TextViews, WebViews, ...
. WebViews
semble être lié à MockViews
qui est lié à TextViews
.
Mais en dehors de cette constatation, je ne comprends pas comment/pourquoi la violation se produit et ce que je peux faire contre elle.
Quelqu'un peut-il m'expliquer cela?
Dans Android P, des restrictions ont été ajoutées aux API privées (c'est-à-dire aux API qui ne font pas partie du SDK public et sont accessibles via la réflexion). Voir Restrictions sur les non-SDK interfaces :
Android 9 (API niveau 28) introduit de nouvelles restrictions sur l'utilisation des interfaces non SDK, que ce soit directement, via la réflexion ou via JNI. Ces restrictions sont appliquées chaque fois qu'une application fait référence à une interface non SDK ou tente d'obtenir son handle à l'aide de la réflexion ou de JNI. Pour plus d'informations sur cette décision, voir Amélioration de la stabilité en réduisant l'utilisation d'interfaces non SDK.
C'est donc ce que vous voyez - c'est un avertissement que quelque chose accède à l'une de ces API privées qui pourraient être supprimées à l'avenir. Cependant, la trace de la pile montre, comme vous l'avez mentionné, que cela vient du WebView
. En particulier, lors de l'initialisation de SmartSelectionClient
. Cela initialise une bibliothèque native qui accède implicitement à SmartSelectionEventTracker
, qui est marquée par @hide
dans sa déclaration Javadoc, qui indique qu'il ne fait pas partie du SDK public.
En bref, vous ne pouvez probablement rien faire contre cet avertissement particulier, donc je ne m'en inquiéterais pas. Cela se produit dans l'implémentation Chromium WebView
de l'appareil, donc c'est hors du contrôle de votre application. Comme les deux Android et Chromium sont publiés par Google, s'il y a un problème légitime dans une future version, une mise à jour sera publiée dans l'implémentation WebView
avant qu'elle ne devienne un problème.