When I turn on the strict mode detect All, my App crashes super.onCreate() of application (i.e. before even I have any of my code doing anything).
My application onCreate turning on the strict mode as below
override fun onCreate() {
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath().build())
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath().build())
}
super.onCreate()
// Some other code
}
The error I got (which is on the line of super.onCreate()
)
D/StrictMode: StrictMode policy violation; ~duration=98 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=327711 violation=2
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1263)
at libcore.io.BlockGuardOs.open(BlockGuardOs.java:182)
at libcore.io.IoBridge.open(IoBridge.java:438)
at java.io.FileInputStream.<init>(FileInputStream.java:76)
at android.graphics.Typeface.getFullFlipFont(Typeface.java:584)
at android.graphics.Typeface.getFontPathFlipFont(Typeface.java:532)
at android.graphics.Typeface.SetFlipFonts(Typeface.java:719)
at android.graphics.Typeface.SetAppTypeFace(Typeface.java:846)
at android.app.Application.onCreate(Application.java:110)
at com.mypackage.MyApplication.onCreate(MyApplication.kt:40)
Is this an expected error we should ignore, or is this something that we should fix?
StrictMode is a developer tool which detects things you might be doing by accident and brings them to your attention so you can fix them. StrictMode is most commonly used to catch accidental disk or network access on the application's main thread, where UI operations are received and animations take place.
Go to Settings > Developer options. Tap Advanced > Strict mode enabled.
Apparently the error are device specific. It happens on Samsung S7, but not Nexus 6P. Hence it's not something I would be fixing. Hence the best way to suppress it.
The below is the example how I got it suppressed. You could wrap those functions into an Util Class.
override fun onCreate() {
turnOnStrictMode()
permitDiskReads{
super.onCreate()
}
// Some other code
}
fun turnOnStrictMode() {
if (BuildConfig.DEBUG) {
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath().build())
StrictMode.setVmPolicy(
StrictMode.VmPolicy.Builder()
.detectAll()
.penaltyLog()
.penaltyDeath().build())
}
}
fun permitDiskReads(func: () -> Any) : Any {
if (BuildConfig.DEBUG) {
val oldThreadPolicy = StrictMode.getThreadPolicy()
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder(oldThreadPolicy)
.permitDiskReads().build())
val anyValue = func()
StrictMode.setThreadPolicy(oldThreadPolicy)
return anyValue
} else {
return func()
}
}
Refers to this for more detail.
Move the statement 'super.onCreate()' before the StrictMode methods in fun onCreate(). Check this article for details. Walk through hell with Android StrictMode
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With