dotnet / maui

.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.
https://dot.net/maui
MIT License
21.84k stars 1.67k forks source link

Enabling Essentials VersionTracking blocks main thread on Android #23082

Open BioTurboNick opened 3 weeks ago

BioTurboNick commented 3 weeks ago

Description

When I enable VersionTracking, I encounter 2 (4 on first run) strict mode violations due to blocking disk reads each lasting ~600 ms (on the emulator) during application startup.

Steps to Reproduce

  1. Add version tracking to MauiAppBuilder:

    .ConfigureEssentials(essentials =>
    {
    essentials.UseVersionTracking();
    })
  2. Enable StrictMode on the main thread to detect main thread blocking operations in Android's MainApplication.OnCreate:

    Android.OS.StrictMode.SetThreadPolicy(new Android.OS.StrictMode.ThreadPolicy.Builder()
    .DetectAll()
    .PenaltyLog()
    .Build());
  3. Run the app on the emulator.

Link to public reproduction project repository

https://github.com/BioTurboNick/MAUIEssentialsThreadBlockingRepro

Version with bug

8.0.60 SR6

Is this a regression from previous behavior?

No, this is something new

Last version that worked well

Unknown/Other

Affected platforms

Android

Affected platform versions

Android 13

Did you find any workaround?

No response

Relevant log output

First run:

[StrictMode] StrictMode policy violation; ~duration=565 ms: android.os.strictmode.DiskReadViolation
[StrictMode]    at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658)
[StrictMode]    at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74)
[StrictMode]    at libcore.io.ForwardingOs.access(ForwardingOs.java:128)
[StrictMode]    at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:7749)
[StrictMode]    at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
[StrictMode]    at java.io.File.exists(File.java:813)
[StrictMode]    at android.app.ContextImpl.getDataDir(ContextImpl.java:2962)
[StrictMode]    at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:704)
[StrictMode]    at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931)
[StrictMode]    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553)
[StrictMode]    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.n_onCreate(Native Method)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.onCreate(MainApplication.java:25)
[StrictMode]    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1277)
[StrictMode]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
[StrictMode]    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
[StrictMode]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2133)
[StrictMode]    at android.os.Handler.dispatchMessage(Handler.java:106)
[StrictMode]    at android.os.Looper.loopOnce(Looper.java:201)
[StrictMode]    at android.os.Looper.loop(Looper.java:288)
[StrictMode]    at android.app.ActivityThread.main(ActivityThread.java:7872)
[StrictMode]    at java.lang.reflect.Method.invoke(Native Method)
[StrictMode]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[StrictMode]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
[StrictMode] StrictMode policy violation; ~duration=565 ms: android.os.strictmode.DiskReadViolation
[StrictMode]    at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658)
[StrictMode]    at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74)
[StrictMode]    at libcore.io.ForwardingOs.access(ForwardingOs.java:128)
[StrictMode]    at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:7749)
[StrictMode]    at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
[StrictMode]    at java.io.File.exists(File.java:813)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:759)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:750)
[StrictMode]    at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:706)
[StrictMode]    at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931)
[StrictMode]    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553)
[StrictMode]    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.n_onCreate(Native Method)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.onCreate(MainApplication.java:25)
[StrictMode]    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1277)
[StrictMode]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
[StrictMode]    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
[StrictMode]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2133)
[StrictMode]    at android.os.Handler.dispatchMessage(Handler.java:106)
[StrictMode]    at android.os.Looper.loopOnce(Looper.java:201)
[StrictMode]    at android.os.Looper.loop(Looper.java:288)
[StrictMode]    at android.app.ActivityThread.main(ActivityThread.java:7872)
[StrictMode]    at java.lang.reflect.Method.invoke(Native Method)
[StrictMode]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[StrictMode]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
[StrictMode] StrictMode policy violation; ~duration=565 ms: android.os.strictmode.DiskWriteViolation
[StrictMode]    at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:1614)
[StrictMode]    at libcore.io.BlockGuardOs.mkdir(BlockGuardOs.java:255)
[StrictMode]    at libcore.io.ForwardingOs.mkdir(ForwardingOs.java:491)
[StrictMode]    at android.system.Os.mkdir(Os.java:459)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:762)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:750)
[StrictMode]    at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:706)
[StrictMode]    at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931)
[StrictMode]    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553)
[StrictMode]    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.n_onCreate(Native Method)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.onCreate(MainApplication.java:25)
[StrictMode]    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1277)
[StrictMode]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
[StrictMode]    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
[StrictMode]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2133)
[StrictMode]    at android.os.Handler.dispatchMessage(Handler.java:106)
[StrictMode]    at android.os.Looper.loopOnce(Looper.java:201)
[StrictMode]    at android.os.Looper.loop(Looper.java:288)
[StrictMode]    at android.app.ActivityThread.main(ActivityThread.java:7872)
[StrictMode]    at java.lang.reflect.Method.invoke(Native Method)
[StrictMode]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[StrictMode]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
[StrictMode] StrictMode policy violation; ~duration=564 ms: android.os.strictmode.DiskWriteViolation
[StrictMode]    at android.os.StrictMode$AndroidBlockGuardPolicy.onWriteToDisk(StrictMode.java:1614)
[StrictMode]    at libcore.io.BlockGuardOs.chmod(BlockGuardOs.java:81)
[StrictMode]    at libcore.io.ForwardingOs.chmod(ForwardingOs.java:165)
[StrictMode]    at android.system.Os.chmod(Os.java:119)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:763)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:750)
[StrictMode]    at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:706)
[StrictMode]    at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931)
[StrictMode]    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553)
[StrictMode]    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.n_onCreate(Native Method)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.onCreate(MainApplication.java:25)
[StrictMode]    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1277)
[StrictMode]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
[StrictMode]    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
[StrictMode]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2133)
[StrictMode]    at android.os.Handler.dispatchMessage(Handler.java:106)
[StrictMode]    at android.os.Looper.loopOnce(Looper.java:201)
[StrictMode]    at android.os.Looper.loop(Looper.java:288)
[StrictMode]    at android.app.ActivityThread.main(ActivityThread.java:7872)
[StrictMode]    at java.lang.reflect.Method.invoke(Native Method)
[StrictMode]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[StrictMode]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)

Subsequent runs:

[StrictMode] StrictMode policy violation; ~duration=589 ms: android.os.strictmode.DiskReadViolation
[StrictMode]    at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658)
[StrictMode]    at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74)
[StrictMode]    at libcore.io.ForwardingOs.access(ForwardingOs.java:128)
[StrictMode]    at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:7749)
[StrictMode]    at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
[StrictMode]    at java.io.File.exists(File.java:813)
[StrictMode]    at android.app.ContextImpl.getDataDir(ContextImpl.java:2962)
[StrictMode]    at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:704)
[StrictMode]    at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931)
[StrictMode]    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553)
[StrictMode]    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.n_onCreate(Native Method)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.onCreate(MainApplication.java:25)
[StrictMode]    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1277)
[StrictMode]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
[StrictMode]    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
[StrictMode]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2133)
[StrictMode]    at android.os.Handler.dispatchMessage(Handler.java:106)
[StrictMode]    at android.os.Looper.loopOnce(Looper.java:201)
[StrictMode]    at android.os.Looper.loop(Looper.java:288)
[StrictMode]    at android.app.ActivityThread.main(ActivityThread.java:7872)
[StrictMode]    at java.lang.reflect.Method.invoke(Native Method)
[StrictMode]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[StrictMode]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
[StrictMode] StrictMode policy violation; ~duration=589 ms: android.os.strictmode.DiskReadViolation
[StrictMode]    at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1658)
[StrictMode]    at libcore.io.BlockGuardOs.access(BlockGuardOs.java:74)
[StrictMode]    at libcore.io.ForwardingOs.access(ForwardingOs.java:128)
[StrictMode]    at android.app.ActivityThread$AndroidOs.access(ActivityThread.java:7749)
[StrictMode]    at java.io.UnixFileSystem.checkAccess(UnixFileSystem.java:281)
[StrictMode]    at java.io.File.exists(File.java:813)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:759)
[StrictMode]    at android.app.ContextImpl.ensurePrivateDirExists(ContextImpl.java:750)
[StrictMode]    at android.app.ContextImpl.getPreferencesDir(ContextImpl.java:706)
[StrictMode]    at android.app.ContextImpl.getSharedPreferencesPath(ContextImpl.java:931)
[StrictMode]    at android.app.ContextImpl.getSharedPreferences(ContextImpl.java:553)
[StrictMode]    at android.content.ContextWrapper.getSharedPreferences(ContextWrapper.java:217)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.n_onCreate(Native Method)
[StrictMode]    at crc648fb9cbf0486d8864.MainApplication.onCreate(MainApplication.java:25)
[StrictMode]    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1277)
[StrictMode]    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6759)
[StrictMode]    at android.app.ActivityThread.-$$Nest$mhandleBindApplication(Unknown Source:0)
[StrictMode]    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2133)
[StrictMode]    at android.os.Handler.dispatchMessage(Handler.java:106)
[StrictMode]    at android.os.Looper.loopOnce(Looper.java:201)
[StrictMode]    at android.os.Looper.loop(Looper.java:288)
[StrictMode]    at android.app.ActivityThread.main(ActivityThread.java:7872)
[StrictMode]    at java.lang.reflect.Method.invoke(Native Method)
[StrictMode]    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
[StrictMode]    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
github-actions[bot] commented 3 weeks ago

Hi I'm an AI powered bot that finds similar issues based off the issue title.

Please view the issues below to see if they solve your problem, and if the issue describes your problem please consider closing this one and thumbs upping the other issue to help us prioritize it. Thank you!

Open similar issues:

Closed similar issues:

Note: You can give me feedback by thumbs upping or thumbs downing this comment.

BioTurboNick commented 3 weeks ago

Presumably the cause is that the feature saves to Android's shared preferences. Which was something I noted in closed #19415, but this issue is more focused on one specific problem with a minimal reproducer, and it's MAUI itself which is causing the issue.

Zhanglirong-Winnie commented 3 weeks ago

Verified this issue with Visual Studio 17.11.0 Preview 2.0 (8.0.60 & 8.0.40& 8.0.21&8.0.3). Can repro on Android platform with sample project.