我正焦急地等待StrictMode的开源版本继续我们的平台开发.Android博客条目中的示例建议使用StrictMode调用
if (DEVELOPER_MODE) {
...
}
Run Code Online (Sandbox Code Playgroud)
对于SDK开发,我希望这个常量可以由每个应用程序在本地定义.但是,对于平台开发,是android.util.Config.DEBUG确定是否启用此功能的最佳方法?
我正在尝试禁用 Android StrictMode 检查之一 - 未标记套接字的检测。
我有几个理由这样做:
我们的应用程序中使用的一些库,例如 Crashlytics / Picasso 等在内部使用 OkHttp,StrictMode 检测到 OkHttp 代码中未标记的套接字问题(我无法访问第三方库的代码来解决此问题)
我需要从严格模式未标记的套接字错误中清除我的日志,我无法修复这些错误以消除其他 StrictMode 问题检测的噪音
启用 VmPolicy 我们使用VmPolicy.Builder.detectAll()方法
通过查看 StrictMode 的来源,我发现了 VmPolicy.Builder.permitUntaggedSockets 方法,但它注释为@hidden并且不能用于 API = 28
我发现的这个问题的唯一解决方案是将detectAll()方法体复制到我的代码中并删除对的调用,detectUntaggedSockets()但在我看来,它容易出错且可维护性差。
可能有人可以对所描述的问题提出更好的解决方案吗?
任何有关“为什么permitUntaggedSockets()隐藏在 API 28 中”的信息都非常感谢。
我一直在尝试在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游标).
有没有人有任何见解,如果这确实是一个误报或实际上是一个漏洞的光标.
我正在开发一个具有较低级别活动的项目,RecordView用于显示记录详细信息,例如图像,拍摄日期和时间以及纬度/经度信息.我试图实现一个位置监听器来获取首次拍摄图像的位置(按下按钮),而不是试图操纵相机进行地理标记和访问exif数据.这种方法有效 - 我得到我的位置以正确显示和更新数据库中的记录(返回视图以后显示从头开始的位置).但是,如果我退出当前RecordView然后再输入两个(任何组合),程序将崩溃并显示错误InstanceCountViolation(下面重新打印完整错误).当我覆盖RecordView每个被调用时显示的生命周期方法时,我们发现它在被再次调用之前被销毁.也就是说,RecordView在任何给定时间似乎不存在多于一个.
所以我的问题归结为:这个错误来自何处以及如何解决?
有什么东西在撒谎?LocationListener是否位于某处并导致问题?是不是可能会提供虚假错误的东西?
此外,我应该做可怕的硬编码修复,只是RecordView允许的实例限制?或者继续寻找另一种方法(作为一个例子,我试图通过PendingIntent.getBroadcast(...)呼叫请求单次更新)?
作为参考,此错误已出现在3.1的仿真器和实际的平板电脑上(Xoom,3.1).注释掉监听器更新代码似乎可以避免崩溃(编辑2:我似乎错了).与侦听器相关的代码如下(可以updateLocation在RecordView类中的公共方法中找到).
// 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中遇到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) 当我在我的 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) 我最近尝试使用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) 我正在使用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)
我真的很感激任何帮助 - 提前感谢!麦克风
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) 有时我会得到这个 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)