airsdk / Adobe-Runtime-Support

Report, track and discuss issues in Adobe AIR. Monitored by Adobe - and HARMAN - and maintained by the AIR community.
200 stars 11 forks source link

[Android 11+] IncorrectContextUseViolation IllegalAccessException with enabled StrictMode #1607

Closed itlancer closed 1 year ago

itlancer commented 2 years ago

Problem Description

Enabling StrictMode (via native extension) with Android 11+ cause IncorrectContextUseViolation IllegalAccessException from AIR. Seems AIR for Android not properly updated for Android 11+. We use StrictMode to debug performance/compatibility issues with complex applications for Android.

It has been tested with latest AIR 33.1.1.743 with multiple Android 11 and 12 devices. Same problem in all cases. Even with Android emulator.

Related links: https://github.com/AppsFlyerSDK/appsflyer-android-sdk/issues/17 https://github.com/google/ExoPlayer/issues/8246

Steps to Reproduce

Create Java native extension with code below in some function:

StrictMode.setThreadPolicy(new ThreadPolicy.Builder()
    .detectAll()
    .penaltyLog()
    .build());
StrictMode.setVmPolicy(new VmPolicy.Builder()
    .detectAll()
    .penaltyLog()
    .penaltyDeath()
    .build());

It will enable StrictMode to debug any Android performance/compatibility issues and warnings. Then launch AIR application that calling this function from native extension somewhere just after start. For example, just after Event.ADDED_TO_STAGE event fired.

Actual Result: Application crash (because of .penaltyDeath()) with ADB log:

2022-01-31 17:53:33.635 6504-6504/com.my.app D/StrictMode: StrictMode policy violation: android.os.strictmode.IncorrectContextUseViolation: WindowManager should be accessed from Activity or other visual Context. Use an Activity or a Context created with Context#createWindowContext(int, Bundle), which are adjusted to the configuration and visual bounds of an area on screen.
        at android.os.StrictMode.onIncorrectContextUsed(StrictMode.java:2261)
        at android.app.ContextImpl.getSystemService(ContextImpl.java:2060)
        at android.content.ContextWrapper.getSystemService(ContextWrapper.java:857)
        at com.adobe.air.SystemCapabilities.GetRealScreenHRes(SystemCapabilities.java:35)
        at com.adobe.air.Entrypoints.EntryMainWrapper(Native Method)
        at com.adobe.air.Entrypoints.EntryMain(Entrypoints.java:143)
        at com.adobe.air.AndroidActivityWrapper.LaunchApplication(AndroidActivityWrapper.java:1224)
        at com.adobe.air.AndroidActivityWrapper.launchApplication(AndroidActivityWrapper.java:1511)
        at com.adobe.air.AndroidActivityWrapper.onSurfaceInitialized(AndroidActivityWrapper.java:1497)
        at com.adobe.air.AIRWindowSurfaceView.surfaceChanged(AIRWindowSurfaceView.java:802)
        at android.view.SurfaceView.updateSurface(SurfaceView.java:1196)
        at android.view.SurfaceView.lambda$new$0$SurfaceView(SurfaceView.java:175)
        at android.view.SurfaceView$$ExternalSyntheticLambda2.onPreDraw(Unknown Source:2)
        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1093)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3297)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2126)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8649)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037)
        at android.view.Choreographer.doCallbacks(Choreographer.java:845)
        at android.view.Choreographer.doFrame(Choreographer.java:780)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022)
        at android.os.Handler.handleCallback(Handler.java:938)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loopOnce(Looper.java:201)
        at android.os.Looper.loop(Looper.java:288)
        at android.app.ActivityThread.main(ActivityThread.java:7842)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)
     Caused by: java.lang.IllegalAccessException: Tried to access visual service WindowManager from a non-visual Context:androidx.multidex.MultiDexApplication@9bccea5
        at android.app.ContextImpl.getSystemService(ContextImpl.java:2059)
        at android.content.ContextWrapper.getSystemService(ContextWrapper.java:857) 
        at com.adobe.air.SystemCapabilities.GetRealScreenHRes(SystemCapabilities.java:35) 
        at com.adobe.air.Entrypoints.EntryMainWrapper(Native Method) 
        at com.adobe.air.Entrypoints.EntryMain(Entrypoints.java:143) 
        at com.adobe.air.AndroidActivityWrapper.LaunchApplication(AndroidActivityWrapper.java:1224) 
        at com.adobe.air.AndroidActivityWrapper.launchApplication(AndroidActivityWrapper.java:1511) 
        at com.adobe.air.AndroidActivityWrapper.onSurfaceInitialized(AndroidActivityWrapper.java:1497) 
        at com.adobe.air.AIRWindowSurfaceView.surfaceChanged(AIRWindowSurfaceView.java:802) 
        at android.view.SurfaceView.updateSurface(SurfaceView.java:1196) 
        at android.view.SurfaceView.lambda$new$0$SurfaceView(SurfaceView.java:175) 
        at android.view.SurfaceView$$ExternalSyntheticLambda2.onPreDraw(Unknown Source:2) 
        at android.view.ViewTreeObserver.dispatchOnPreDraw(ViewTreeObserver.java:1093) 
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3297) 
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2126) 
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8649) 
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1037) 
        at android.view.Choreographer.doCallbacks(Choreographer.java:845) 
        at android.view.Choreographer.doFrame(Choreographer.java:780) 
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1022) 
        at android.os.Handler.handleCallback(Handler.java:938) 
        at android.os.Handler.dispatchMessage(Handler.java:99) 
        at android.os.Looper.loopOnce(Looper.java:201) 
        at android.os.Looper.loop(Looper.java:288) 
        at android.app.ActivityThread.main(ActivityThread.java:7842) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 
2022-01-31 17:53:33.636 6504-6504/com.my.app W/System.err: StrictMode VmPolicy violation with POLICY_DEATH; shutting down.
2022-01-31 17:53:33.636 6504-6504/com.my.app I/Process: Sending signal. PID: 6504 SIG: 9
2022-01-31 17:53:33.667 546-906/system_process I/ActivityManager: Process com.my.app (pid 6504) has died: fg  TOP 
2022-01-31 17:53:33.670 546-2358/system_process I/WindowManager: WIN DEATH: Window{4a70a1c u0 com.my.app/com.my.app.AIRAppEntry}
2022-01-31 17:53:33.671 546-2358/system_process W/InputManager-JNI: Input channel object '4a70a1c com.my.app/com.my.app.AIRAppEntry (client)' was disposed without first being removed with the input manager!

Expected Result: StrictMode will be enabled for Android and nothing more happens.

Known Workarounds

none

itlancer commented 1 year ago

Issue still exists with latest AIR 50.2.3.4:

D/StrictMode: StrictMode policy violation: android.os.strictmode.IncorrectContextUseViolation: WindowManager should be accessed from Activity or other visual Context. Use an Activity or a Context created with Context#createWindowContext(int, Bundle), which are adjusted to the configuration and visual bounds of an area on screen.
        at android.os.StrictMode.onIncorrectContextUsed(StrictMode.java:2260)
        at android.app.ContextImpl.getSystemService(ContextImpl.java:2116)
        at android.content.ContextWrapper.getSystemService(ContextWrapper.java:900)
        at com.adobe.air.SystemCapabilities.GetRealScreenHRes(SystemCapabilities.java:36)
     Caused by: java.lang.IllegalAccessException: Tried to access visual service WindowManager from a non-visual Context:androidx.multidex.MultiDexApplication@c3261e9
        at android.app.ContextImpl.getSystemService(ContextImpl.java:2115)
        at android.content.ContextWrapper.getSystemService(ContextWrapper.java:900) 
        at com.adobe.air.SystemCapabilities.GetRealScreenHRes(SystemCapabilities.java:36) 
ajwfrost commented 1 year ago

Thanks -> looks like we are picking up the application context rather than the activity, within these Capabilities calls. And a few other areas as well..

itlancer commented 1 year ago

Fixed with latest AIR 50.2.3.5. Thank you!