空活动的 setContentView 上的 StrictMode 磁盘读取冲突

问题描述 投票:0回答:2
我最近尝试使用 StrictMode 但遇到了奇怪的违规,所以我尝试设置一个

new 'Empty Activity' 项目(在 Android Studio

 中)并添加了一个 Application 类,如下所示(如 
here 中所述) :

public class TestApplication extends Application { @Override public void onCreate() { setStrictMode(); super.onCreate(); } private void setStrictMode() { if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectAll() .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); } } }

我在这个空项目中遇到同样的问题:


StrictMode policy violation; ~duration=165 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=65599 violation=2



堆栈:

at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1440) at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:241) at java.io.File.isDirectory(File.java:837) at dalvik.system.DexPathList$Element.toString(DexPathList.java:634) at java.lang.String.valueOf(String.java:2827) at java.util.Arrays.toString(Arrays.java:4511) at dalvik.system.DexPathList.toString(DexPathList.java:194) at java.lang.String.valueOf(String.java:2827) at java.lang.StringBuilder.append(StringBuilder.java:132) at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:126) at java.lang.ClassLoader.loadClass(ClassLoader.java:379) at java.lang.ClassLoader.loadClass(ClassLoader.java:312) at android.view.LayoutInflater.createView(LayoutInflater.java:606) 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 android.view.LayoutInflater.inflate(LayoutInflater.java:374) at com.android.internal.policy.DecorView.onResourcesLoaded(DecorView.java:1933) at com.android.internal.policy.PhoneWindow.generateLayout(PhoneWindow.java:2586) at com.android.internal.policy.PhoneWindow.installDecor(PhoneWindow.java:2659) at com.android.internal.policy.PhoneWindow.getDecorView(PhoneWindow.java:2067) at android.support.v7.app.AppCompatDelegateImplV9.createSubDecor(AppCompatDelegateImplV9.java:374) at android.support.v7.app.AppCompatDelegateImplV9.ensureSubDecor(AppCompatDelegateImplV9.java:323) at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:284) at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139) at com.test.testapp.MainActivity.onCreate(MainActivity.java:11) at android.app.Activity.performCreate(Activity.java:7009) at android.app.Activity.performCreate(Activity.java:7000) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856) at android.app.ActivityThread.-wrap11(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

问题: 这是配置问题吗?
如果没有,我可以让 StrictMode 忽略特定的方法调用(它也发生在原始项目的
layoutInflater.inflate

 调用上)吗?


编辑(添加配置): Android Studio版本:3.1.3
minSdkVersion 21
targetSdkVersion 27
appcompat-v7:27.1.1
设备:Nexus 6p

编辑2(解决方案): 我意识到
CommonsWare 的解决方案有点隐藏在他下面的评论中,所以:是 即时运行启用 导致了我的问题。

android oncreate android-instant-run android-strictmode
2个回答
5
投票
这是配置问题吗?

可能不会,至少在配置方面

StrictMode

我尝试使用您的

TestApplication

 类和新的 
minSdkVersion 19
 项目重现您的案例,但我无法重现结果,在 Google Pixel 2 上进行测试。

崩溃的可能来源包括:

    您设备上的 Android 版本有所不同(例如,Pixel 2 缺乏的制造商调整)
  • 您的项目中
  • appcompat-v7
     的版本有些不同(我的项目最终是 
    28.0.0-alpha3
  • 您的项目还有其他不同之处(崩溃感觉像是支持 multidex 问题)
  • 更新 您的开发环境有些不同——在这种情况下,根据评论,Instant Run 似乎是罪魁祸首
我可以让 StrictMode 忽略特定的方法调用吗

不幸的是,没有。


0
投票
我分享了三星 WearOS 手表此问题的解决方案

请检查

https://medium.com/@tajuddin.khandaker.cse.ju/android-os-disk-read-violation-policy-a5fb888f8f1d

© www.soinside.com 2019 - 2024. All rights reserved.