Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

setContentView is using non-SDK interface

When I run my application in an emulator with the API 28, the console gives me the following warning:

W/oaristachimene: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection) W/oaristachimene: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)

I have been debugging it and I found out that it comes from the call: setContentView(R.layout.activity_main), so is there another way to set the layout of an activity or is this method going to be updated so that it doesn't throws that warning when running on a device with android API 28?.

like image 704
Iván Gómez Avatar asked Sep 16 '18 21:09

Iván Gómez


3 Answers

For the warnings in the question, computeFitSystemWindows and makeOptionalFitsSystemWindows are actually used by the support library or androidx library through reflection. You can verify it by simply searching those two methods in the AppCompatDelegateImpl.

Hopefully this can be fixed later.

Update 1

Recently when I test app in Firebase Test Lab, these 2 APIs and some other APIs are marked

One possible root cause for this warning is Google-owned library UI Toolkit. No action need be taken at this time.

Or

One possible root cause for this warning is Google-owned library Android WebView. No action need be taken at this time.

like image 128
Dewey Reed Avatar answered Oct 07 '22 13:10

Dewey Reed


Chances are good that the layout id you’re passing to setContentView() contains some view from a 3rd-party library that uses non-SDK interfaces. This warning is telling you that this is happening, but all you can do is

  • Wait for the 3rd party to fix their library
  • Remove those 3rd-party views from your layout

For now, this is only a warning; nothing bad will actually happen. But in future versions of Android, it might become a real problem. The system is just giving you time to figure it out.

like image 23
Ben P. Avatar answered Oct 07 '22 15:10

Ben P.


It's just a warning.

You should read the Restrictions on non-SDK interfaces documentation.

Android 9 (API level 28) introduces new restrictions on the use of non-SDK interfaces, whether directly, via reflection, or via JNI. These restrictions are applied whenever an app references a non-SDK interface or attempts to obtain its handle using reflection or JNI. For more information about this decision, see Improving Stability by Reducing Usage of non-SDK Interfaces.

In general, apps should only use the officially documented parts of the classes in the SDK. In particular, this means that you should not plan to access methods or fields that are not listed in the SDK when you interact with a class via semantics such as reflection.

like image 1
Skizo-ozᴉʞS Avatar answered Oct 07 '22 15:10

Skizo-ozᴉʞS