标签: android-strictmode

为StrictMode定义DEVELOPER_MODE

我正焦急地等待StrictMode的开源版本继续我们的平台开发.Android博客条目中的示例建议使用StrictMode调用

if (DEVELOPER_MODE) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

对于SDK开发,我希望这个常量可以由每个应用程序在本地定义.但是,对于平台开发,是android.util.Config.DEBUG确定是否启用此功能的最佳方法?

android android-sdk-2.3 android-strictmode

11
推荐指数
1
解决办法
4131
查看次数

StrictMode:如何在 Android 中为 targetSdk >= 28 禁用“检测到未标记的套接字”

我正在尝试禁用 Android StrictMode 检查之一 - 未标记套接字的检测。

我有几个理由这样做:

  • 我们的应用程序中使用的一些库,例如 Crashlytics / Picasso 等在内部使用 OkHttp,StrictMode 检测到 OkHttp 代码中未标记的套接字问题(我无法访问第三方库的代码来解决此问题)

  • 我需要从严格模式未标记的套接字错误中清除我的日志,我无法修复这些错误以消除其他 StrictMode 问题检测的噪音

启用 VmPolicy 我们使用VmPolicy.Builder.detectAll()方法

通过查看 StrictMode 的来源,我发现了 VmPolicy.Builder.permitUntaggedSockets 方法,但它注释为@hidden并且不能用于 API = 28

我发现的这个问题的唯一解决方案是将detectAll()方法体复制到我的代码中并删除对的调用,detectUntaggedSockets()但在我看来,它容易出错且可维护性差。

可能有人可以对所描述的问题提出更好的解决方案吗?

任何有关“为什么permitUntaggedSockets()隐藏在 API 28 中”的信息都非常感谢。

Crashlytics:有关 StrictMode 问题的详细信息

OkHttp:关于未标记套接字问题的错误报告

android android-strictmode

10
推荐指数
1
解决办法
1472
查看次数

Android StrictMode报告误报

我一直在尝试在StrictMode中运行我的应用程序来检查可能已经潜入的任何隐藏问题.我遇到的一个问题是使用ContentResolver时泄漏的DatabaseConections似乎是误报.

经过一些实验后,问题简化为以下2行代码:

Cursor c = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, cols, null, null, MediaStore.Video.Media.DEFAULT_SORT_ORDER);

c.close()
Run Code Online (Sandbox Code Playgroud)

上面的2行生成以下StrictMode违规:

ERROR/StrictMode(26219): Releasing cursor in a finalizer. Please ensure that you explicitly call close() on your cursor: 

ERROR/StrictMode(26219): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here

ERROR/StrictMode(26219):
        at android.database.CursorWindow.<init>(CursorWindow.java:62)
        at android.content.ContentProviderProxy.query(ContentProviderNative.java:403)
        at android.content.ContentResolver.query(ContentResolver.java:302)
Run Code Online (Sandbox Code Playgroud)

我假设这是特定于Cursor由contentProvider返回的事实(因此它不是直接的SQLite游标).

有没有人有任何见解,如果这确实是一个误报或实际上是一个漏洞的光标.

android android-strictmode

9
推荐指数
1
解决办法
958
查看次数

尽管多次打开子活动会导致InstanceCountViolation被破坏

我正在开发一个具有较低级别活动的项目,RecordView用于显示记录详细信息,例如图像,拍摄日期和时间以及纬度/经度信息.我试图实现一个位置监听器来获取首次拍摄图像的位置(按下按钮),而不是试图操纵相机进行地理标记和访问exif数据.这种方法有效 - 我得到我的位置以正确显示和更新数据库中的记录(返回视图以后显示从头开始的位置).但是,如果我退出当前RecordView然后再输入两个(任何组合),程序将崩溃并显示错误InstanceCountViolation(下面重新打印完整错误).当我覆盖RecordView每个被调用时显示的生命周期方法时,我们发现它在被再次调用之前被销毁.也就是说,RecordView在任何给定时间似乎不存在多于一个.

所以我的问题归结为:这个错误来自何处以及如何解决?

有什么东西在撒谎?LocationListener是否位于某处并导致问题?是不是可能会提供虚假错误的东西?

此外,我应该做可怕的硬编码修复,只是RecordView允许的实例限制?或者继续寻找另一种方法(作为一个例子,我试图通过PendingIntent.getBroadcast(...)呼叫请求单次更新)?

作为参考,此错误已出现在3.1的仿真器和实际的平板电脑上(Xoom,3.1).注释掉监听器更新代码似乎可以避免崩溃(编辑2:我似乎错了).与侦听器相关的代码如下(可以updateLocationRecordView类中的公共方法中找到).

    // Listener for the update request
    LocationListener locListener = new LocationListener() {
        // Store the currentRecord so the listener can update it after return
        Record currentRecord = record;
        GeoDatabase database = data;
        @Override
        public void onLocationChanged(Location location) {
            if (location != null) {
                myLocation = location;
                Log.d(TAG, "Location pulled as " + myLocation); …
Run Code Online (Sandbox Code Playgroud)

android android-strictmode

8
推荐指数
1
解决办法
2483
查看次数

StrictMode抱怨InputStream未被关闭

我在Android中遇到StrictMode报告的以下违规行为.

02-05 04:07:41.190:ERROR/StrictMode(15093):在附加堆栈跟踪处获取资源但从未释放.有关避免资源泄漏的信息,请参阅java.io.Closeable.02-05 04:07:41.190:ERROR/StrictMode(15093):java.lang.Throwable:未调用显式终止方法'close'

关于不正确关闭流是很困难的.但是,不应该关闭in底层流?标记错误的原因是什么?

    private ArrayList<Uri> loadPath() {
        ArrayList<Uri> uris = new ArrayList<Uri>();
        if (mFile.exists()) {
            ObjectInputStream in = null;
            try {
                in = new ObjectInputStream(new BufferedInputStream(
                         new FileInputStream(mFile), STREAM_BUFFER_SIZE));
                ArrayList<String> strings = new ArrayList<String>();
                strings.addAll((ArrayList<String>) in.readObject());
                for (String string : strings) {
                    uris.add(Uri.parse(string));
                }
            } catch (Exception e) {
                mFile.delete();
            } finally {
                IOUtils.closeQuietly(in);
            }
        }
        return uris;
     }

    public static void closeQuietly(InputStream input) {
        try {
            if (input != null) {
                input.close();
            } …
Run Code Online (Sandbox Code Playgroud)

java android objectinputstream android-strictmode

8
推荐指数
2
解决办法
7341
查看次数

android.os.StrictMode$StrictModeDiskReadViolation:在 com.android.server.policy.sec.TspStateManager.updateTspState

当我在我的 Application 中打开 StrictMode 时onCreate(),一切都很好,并且问题已解决。

但是,我意识到根据此问题存在 StrictMode 的错误。所以我做了解决方法(使用Handler),并且确实出现了更多问题。我可以识别它们以抑制或修复它们。

但是下面的错误是我不知道的,因为堆栈跟踪似乎与我可能与之相关的任何代码段无关。

D/StrictMode: StrictMode policy violation; ~duration=38 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=4522015 violation=2
     at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1263)
     at libcore.io.BlockGuardOs.access(BlockGuardOs.java:67)
     at java.io.File.doAccess(File.java:281)
     at java.io.File.exists(File.java:362)
     at com.android.server.policy.sec.TspStateManager.updateTspState(TspStateManager.java:139)
     at com.android.server.policy.sec.TspStateManager.updateWindowPolicy(TspStateManager.java:103)
     at com.android.server.policy.PhoneWindowManager.focusChangedLw(PhoneWindowManager.java:8640)
     at com.android.server.wm.WindowManagerService.updateFocusedWindowLocked(WindowManagerService.java:18320)
     at com.android.server.wm.WindowManagerService.relayoutWindow(WindowManagerService.java:5768)
     at com.android.server.wm.Session.relayout(Session.java:208)
     at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:288)
     at com.android.server.wm.Session.onTransact(Session.java:139)
     at android.os.Binder.execTransact(Binder.java:453)
 # via Binder call with stack:
 android.os.StrictMode$LogStackTrace
     at android.os.StrictMode.readAndHandleBinderCallViolations(StrictMode.java:1911)
     at android.os.Parcel.readExceptionCode(Parcel.java:1601)
     at android.os.Parcel.readException(Parcel.java:1570)
     at android.view.IWindowSession$Stub$Proxy.relayout(IWindowSession.java:956)
     at android.view.ViewRootImpl.relayoutWindow(ViewRootImpl.java:6690)
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1994)
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1437)
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7403)
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
     at android.view.Choreographer.doCallbacks(Choreographer.java:695)
     at android.view.Choreographer.doFrame(Choreographer.java:631)
     at …
Run Code Online (Sandbox Code Playgroud)

android android-strictmode

8
推荐指数
0
解决办法
1858
查看次数

空活动的setContentView上的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) …
Run Code Online (Sandbox Code Playgroud)

android oncreate android-instant-run android-strictmode

8
推荐指数
1
解决办法
839
查看次数

严格模式+分析

我正在使用Google Analytics for Android,但在启用StrictMode后,我收到了很多这样的消息:

 StrictMode policy violation; ~duration=349 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
 at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:745)
 at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1345)
 at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1235)
 at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1189)
 at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1309)
 at com.google.android.apps.analytics.PersistentEventStore.peekEvents(Unknown Source)
 at com.google.android.apps.analytics.PersistentEventStore.peekEvents(Unknown Source)
 at com.google.android.apps.analytics.GoogleAnalyticsTracker.dispatch(Unknown Source)
 at com.google.android.apps.analytics.GoogleAnalyticsTracker$1.run(Unknown Source)
 at android.os.Handler.handleCallback(Handler.java:587)
 at android.os.Handler.dispatchMessage(Handler.java:92)
 at android.os.Looper.loop(Looper.java:123)
 at android.app.ActivityThread.main(ActivityThread.java:3647)
 at java.lang.reflect.Method.invokeNative(Native Method)
 at java.lang.reflect.Method.invoke(Method.java:507)
 at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
 at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
 at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)

我可以忽略吗?我还尝试将tracker.trackingPageView(...)放入AsyncTask - 相同的结果.

以下是我对StrictMode的设置:

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectDiskReads()
    .detectDiskWrites()
    .detectNetwork()
    .penaltyLog()
    .build());

    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
        .detectLeakedSqlLiteObjects()
    .penaltyLog()
    .penaltyDeath()
    .build());
Run Code Online (Sandbox Code Playgroud)

我真的很感激任何帮助 - 提前感谢!麦克风

android android-strictmode

7
推荐指数
1
解决办法
2292
查看次数

在启用Crashlytics时,会导致资源泄漏

Hiii,我已经为错误报告添加了crashlytics,当我启用严格模式时,我遇到资源泄漏.知道我哪里错了,

A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
java.lang.Throwable: Explicit termination method 'close' not called
    at dalvik.system.CloseGuard.open(CloseGuard.java:184)
    at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:271)
    at com.android.okhttp.Connection.upgradeToTls(Connection.java:197)
    at com.android.okhttp.Connection.connect(Connection.java:151)
    at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276)
    at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:373)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106)
    at com.android.okhttp.internal.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:208)
    at com.android.okhttp.internal.http.DelegatingHttpsURLConnection.getOutputStream(DelegatingHttpsURLConnection.java:218)
    at com.android.okhttp.internal.http.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:25)
    at io.fabric.sdk.android.services.network.HttpRequest.openOutput(HttpRequest.java:2449)
    at io.fabric.sdk.android.services.network.HttpRequest.startPart(HttpRequest.java:2462)
    at io.fabric.sdk.android.services.network.HttpRequest.part(HttpRequest.java:2654)
    at io.fabric.sdk.android.services.network.HttpRequest.part(HttpRequest.java:2616)
    at com.crashlytics.android.answers.SessionAnalyticsFilesSender.send(SessionAnalyticsFilesSender.java:45)
    at com.crashlytics.android.answers.AnswersRetryFilesSender.send(AnswersRetryFilesSender.java:49)
    at io.fabric.sdk.android.services.events.EnabledEventsStrategy.sendAndCleanUpIfSuccess(EnabledEventsStrategy.java:158)
    at io.fabric.sdk.android.services.events.EnabledEventsStrategy.sendEvents(EnabledEventsStrategy.java:67)
    at com.crashlytics.android.answers.AnswersEventsHandler$3.run(AnswersEventsHandler.java:114)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
    at java.util.concurrent.FutureTask.run(FutureTask.java:237)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
    at …
Run Code Online (Sandbox Code Playgroud)

android resource-leak crashlytics android-strictmode

7
推荐指数
0
解决办法
346
查看次数

StrictMode:在附加的堆栈跟踪中获取资源但从未释放

有时我会得到这个 StrictMode 异常:

2019-01-28 14:18:23.073 4597-4615/my.app.package E/StrictMode: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.
    java.lang.Throwable: Explicit termination method 'end' not called
        at dalvik.system.CloseGuard.open(CloseGuard.java:223)
        at java.util.zip.Inflater.<init>(Inflater.java:106)
        at okio.GzipSource.<init>(GzipSource.java:62)
        at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:103)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.logging.HttpLoggingInterceptor.intercept(HttpLoggingInterceptor.java:213)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at my.app.package.api.network.SetJsonContentTypeHeaderInterceptor.intercept(SetJsonContentTypeHeaderInterceptor.kt:15)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
        at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
        at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:147)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
Run Code Online (Sandbox Code Playgroud)

异常代码中提到的属于我的应用程序的唯一部分是SetJsonContentTypeHeaderInterceptor

import okhttp3.Interceptor

internal class …
Run Code Online (Sandbox Code Playgroud)

android okhttp retrofit2 android-strictmode

7
推荐指数
1
解决办法
993
查看次数