空活动的setContentView上的StrictMode磁盘读取违规

Mik*_*keL 8 android oncreate android-instant-run android-strictmode

我最近尝试使用StrictMode但有一个奇怪的侵犯,所以我尝试建立一个新的 "空活动"项目(在Android Studio),并添加如下(中记载的应用程序类在这里):

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());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这个空项目中遇到同样的问题:
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)
Run Code Online (Sandbox Code Playgroud)

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


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

Edit2(解决方案):
我意识到CommonsWare的解决方案在下面的评论中有些隐藏,所以:启用即时运行导致了我的问题.

Com*_*are 5

这是配置问题吗?

至少在配置方面可能不是StrictMode

我尝试使用您的TestApplication班级和一个新minSdkVersion 19项目重现您的案例,但无法重现结果,无法在Google Pixel 2上进行测试。

崩溃的可能来源包括:

  • 您设备上的Android版本有所不同(例如,制造商对Pixel 2缺乏的调整)
  • appcompat-v7您项目中的版本有所不同(我的总结为28.0.0-alpha3
  • 您的项目有一些其他不同(崩溃感觉就像是支持multidex的问题)
  • 更新与您的开发环境有所不同,在这种情况下,根据注释,即时运行似乎是罪魁祸首

我可以使StrictMode忽略特定的方法调用

很不幸的是,不行。

  • @MikeL:如果您运行的是Nexus 6P,那么除非您安装了自定义ROM,否则这不是设备问题。我只是重新配置了项目以匹配您的项目(加上“ compileSdkVersion 27”),启动了我的6P,但我无法重现该问题。尽管我始终禁用“即时运行”,但我使用的Studio是同一版本。如果启用了“即时运行”,则可以尝试禁用它并查看是否获得不同的结果。 (3认同)