我在下面创建了一个非常简化的版本。
严格模式通过以下策略设置:
StrictMode.setThreadPolicy(
StrictMode.ThreadPolicy.Builder()
.detectDiskReads()
.detectDiskWrites()
.detectNetwork() // or .detectAll() for all detectable problems
.penaltyLog()
.penaltyDeath()
.build()
)
Run Code Online (Sandbox Code Playgroud)
视图模型只有一个函数,该函数在调用时会使应用程序崩溃。该函数不执行任何操作(其主体为空)
class MyViewModel : ViewModel() {
fun foo() {
viewModelScope.launch(Dispatchers.IO){ }
}
}
Run Code Online (Sandbox Code Playgroud)
该活动通过以下跟踪viewModel.foo()在onCreate其中调用使应用程序崩溃。
--------- beginning of crash
2019-04-08 22:07:49.579 1471-1471/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.myapplication, PID: 1471
java.lang.RuntimeException: StrictMode ThreadPolicy violation
at android.os.StrictMode$AndroidBlockGuardPolicy.onThreadPolicyViolation(StrictMode.java:1705)
at android.os.StrictMode$AndroidBlockGuardPolicy.lambda$handleViolationWithTimingAttempt$0(StrictMode.java:1619)
at android.os.-$$Lambda$StrictMode$AndroidBlockGuardPolicy$9nBulCQKaMajrWr41SB7f7YRT1I.run(Unknown Source:6)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
Caused by: android.os.strictmode.DiskReadViolation …Run Code Online (Sandbox Code Playgroud) Android 开发新手并第一次在我的应用程序上尝试 StrictMode。我注意到以下内容,并想知道这是否是我的应用程序或库中的问题 - 我不太清楚。
谢谢!
D/StrictMode: StrictMode policy violation: android.os.strictmode.LeakedClosableViolation: A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks. Callsite: readFromParcel
at android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1929)
at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:305)
at android.view.SurfaceControl.finalize(SurfaceControl.java:1104)
at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:291)
at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:278)
at java.lang.Daemons$Daemon.run(Daemons.java:139)
at java.lang.Thread.run(Thread.java:923)
Run Code Online (Sandbox Code Playgroud) 我刚刚在 Android 应用程序的日志中看到一条非常奇怪的消息:
W/系统:资源无法调用关闭。
因此,我打开了严格模式的“detectLeakedClosableObjects”,但我得到了一个堆栈跟踪,但我无法真正了解它,因为它不包含有关我的应用程序的任何内容。见下文。
我想知道是否有任何方法可以获得更多关于为什么会发生这种情况的信息?它可能在我的应用程序之外吗?指针赞赏:
D/StrictMode:StrictMode 策略违规:android.os.strictmode.LeakedClosableViolation:在附加的堆栈跟踪中获取了资源,但从未释放。有关避免资源泄漏的信息,请参阅 java.io.Closeable。调用站点:在 android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1992) 处关闭,在 dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:347) 处,在 sun.nio.fs.UnixSecureDirectoryStream.finalize(UnixSecureDirectoryStream.java:第580章:139)在java.lang.Thread.run(Thread.java:920)
执行多个SQL语句而不将它们放入一个事务中是一个严重的瓶颈(参见例如http://www.sqlite.org/faq.html#q19).我还没有彻底检查过如何在Android上配置SQLite,但有趣的是,当我在更多地方使用交易时,我认为我的应用程序内的性能会有显着提升.
是否有可能检测到使用StrictMode忘记使用事务的实例?如果没有,是否可以考虑将来的StrictMode版本?检测可能有些棘手,但两种不同的策略可能是:1)事务外的非选择语句,或2)在短时间内执行的事务外的多个非选择语句.
在shell中运行adb logcat我看到这样的东西
StrictMode policy violation; ~duration=337 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
我正在寻找这些值的含义,但我找不到任何文档违反和政策列表,或者我可能以错误的方式解释了我的搜索结果,但我会很感激对此的一些解释
当Android的StrictMode检测到泄露的对象(例如活动)违规时,如果我能够在那个时刻捕获堆转储将会很有帮助.但是,没有明显的方法来配置它来执行此操作.有没有人知道可以用来实现它的一些技巧,例如说服系统在死刑被调用之前运行一段特定代码的方法?我不认为StrictMode会抛出异常,所以我不能使用这里描述的技巧:有没有办法让Android进程在OutOfMemoryError上产生堆转储?
我的 FragmentActivity 上有一个 Gridview,其中包含 Fragment 中的图像。
Gridview onItemClick 我调用 Activity
Intent intent = new Intent(getSherlockActivity(), ViewActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("PREVIEW_IMG_ID", imagesIDs.get(pos));
startActivity(intent);
Run Code Online (Sandbox Code Playgroud)
在第一次 ViewActivity 回压时,一切似乎正常,但第二次单击 Gridview onItemClick 时,当我设置严格模式时,ViewActivity 回压返回错误:
StrictMode ViewActivity; instances=2; limit=1 and app died.
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我可以防止错误或只是忽略吗?
查看活动
import android.app.Activity;
import android.os.Bundle;
import com.bugexplorer.wallpapers.R;
public class ViewActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view);
}
}
Run Code Online (Sandbox Code Playgroud) 我已经按照数据备份指南实现了BackupAgent。代码的行为符合预期,直到设置为检测泄漏的可关闭对象。执行备份并发生 GC 后,CloseGuard 报告泄漏并显示以下堆栈跟踪:StrictMode.VmPolicyParcelFileDescriptor
06-28 21:47:39.683 25072-25081/com.qbix.nub E/StrictMode\xef\xb9\x95 A resource was acquired at attached stack trace but never released. See java.io.Closeable for information on avoiding resource leaks.\n java.lang.Throwable: Explicit termination method \'close\' not called\n at dalvik.system.CloseGuard.open(CloseGuard.java:184)\n at android.os.ParcelFileDescriptor.<init>(ParcelFileDescriptor.java:179)\n at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:905)\n at android.os.ParcelFileDescriptor$1.createFromParcel(ParcelFileDescriptor.java:897)\n at android.app.IBackupAgent$Stub.onTransact(IBackupAgent.java:64)\n at android.os.Binder.execTransact(Binder.java:404)\n at dalvik.system.NativeStart.run(Native Method)\n06-28 21:47:39.683 25072-25081/com.qbix.nub W/System.err\xef\xb9\x95 StrictMode VmPolicy violation with POLICY_DEATH; shutting down.\n06-28 21:47:39.683 25072-25081/com.qbix.nub I/Process\xef\xb9\x95 Sending signal. PID: 25072 SIG: 9\nRun Code Online (Sandbox Code Playgroud)\n\n为了确认我没有泄漏ParcelFileDescriptor我的BackupAgent …
我正在尝试在我的应用程序中添加一些添加项。当我启用 StrictMode 时,我会收到一堆这样的策略违规(可能是其中的 6 或 7 个)。这是正常的吗?
18817-18817/com.xyz.xyz.xyz D/StrictMode: StrictMode policy violation; ~duration=67937 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=5439503 violation=2
at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1263)
at libcore.io.BlockGuardOs.fstat(BlockGuardOs.java:132)
at java.io.RandomAccessFile.length(RandomAccessFile.java:240)
at java.util.zip.ZipFile.readCentralDir(ZipFile.java:386)
at java.util.zip.ZipFile.<init>(ZipFile.java:175)
at java.util.zip.ZipFile.<init>(ZipFile.java:142)
at android.webkit.WebViewFactory.getLoadFromApkPath(WebViewFactory.java:357)
at android.webkit.WebViewFactory.getWebViewNativeLibraryPaths(WebViewFactory.java:407)
at android.webkit.WebViewFactory.loadNativeLibrary(WebViewFactory.java:511)
at android.webkit.WebViewFactory.getProviderClass(WebViewFactory.java:188)
at android.webkit.WebViewFactory.getProvider(WebViewFactory.java:158)
at android.webkit.WebSettings.getDefaultUserAgent(WebSettings.java:1239)
at com.google.android.gms.ads.internal.util.ai.a(:com.google.android.gms.DynamiteModulesA:414)
at com.google.android.gms.ads.internal.util.y.a(:com.google.android.gms.DynamiteModulesA:419)
at com.google.android.gms.ads.internal.state.h.a(:com.google.android.gms.DynamiteModulesA:349)
at com.google.android.gms.ads.internal.a.<init>(:com.google.android.gms.DynamiteModulesA:153)
at com.google.android.gms.ads.internal.c.<init>(:com.google.android.gms.DynamiteModulesA:104)
at com.google.android.gms.ads.internal.c.<init>(:com.google.android.gms.DynamiteModulesA:92)
at com.google.android.gms.ads.internal.g.<init>(:com.google.android.gms.DynamiteModulesA:55)
at com.google.android.gms.ads.internal.o.<init>(:com.google.android.gms.DynamiteModulesA:89)
at com.google.android.gms.ads.ChimeraAdManagerCreatorImpl.newAdManagerByType(:com.google.android.gms.DynamiteModulesA:66)
at com.google.android.gms.ads.internal.client.al.onTransact(:com.google.android.gms.DynamiteModulesA:91)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.ads.internal.client.am.newAdManagerByType(:com.google.android.gms:170)
at com.google.android.gms.ads.AdManagerCreatorImpl.newAdManagerByType(:com.google.android.gms:90)
at com.google.android.gms.ads.internal.client.al.onTransact(:com.google.android.gms:91)
at android.os.Binder.transact(Binder.java:387)
at com.google.android.gms.ads.internal.client.zzv$zza$zza.zza(Unknown Source)
at com.google.android.gms.ads.internal.client.zze.zza(Unknown Source)
at com.google.android.gms.ads.internal.client.zzl$1.zzim(Unknown Source) …Run Code Online (Sandbox Code Playgroud) 将StrictMode与AdMob结合使用时,出现以下异常:
java.lang.Throwable: Untagged socket detected; use TrafficStats.setThreadSocketTag() to track all network usage
at android.os.StrictMode.onUntaggedSocket(StrictMode.java:2012)
at com.android.server.NetworkManagementSocketTagger.tag(NetworkManagementSocketTagger.java:78)
at libcore.io.BlockGuardOs.tagSocket(BlockGuardOs.java:47)
at libcore.io.BlockGuardOs.socket(BlockGuardOs.java:310)
at libcore.io.IoBridge.socket(IoBridge.java:667)
at java.net.PlainSocketImpl.socketCreate(PlainSocketImpl.java:116)
at java.net.AbstractPlainSocketImpl.create(AbstractPlainSocketImpl.java:98)
at java.net.Socket.createImpl(Socket.java:484)
at java.net.Socket.getImpl(Socket.java:547)
at java.net.Socket.setSoTimeout(Socket.java:1175)
at com.android.okhttp.internal.io.RealConnection.connectSocket(RealConnection.java:139)
at com.android.okhttp.internal.io.RealConnection.connect(RealConnection.java:112)
at com.android.okhttp.internal.http.StreamAllocation.findConnection(StreamAllocation.java:184)
at com.android.okhttp.internal.http.StreamAllocation.findHealthyConnection(StreamAllocation.java:126)
at com.android.okhttp.internal.http.StreamAllocation.newStream(StreamAllocation.java:95)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:281)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:224)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:461)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:407)
at com.android.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:538)
at com.android.okhttp.internal.huc.DelegatingHttpsURLConnection.getResponseCode(DelegatingHttpsURLConnection.java:105)
at com.android.okhttp.internal.huc.HttpsURLConnectionImpl.getResponseCode(Unknown Source:0)
at com.google.android.gms.internal.zzabh.zza(Unknown Source:152)
at com.google.android.gms.internal.zzabh.zza(Unknown Source:788)
at com.google.android.gms.internal.zzabh.zzb(Unknown Source:4)
at com.google.android.gms.internal.zzabj.run(Unknown Source:5)
at com.google.android.gms.internal.zzagn.call(Unknown Source:2)
at com.google.android.gms.internal.zzago.run(Unknown Source:9)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at …Run Code Online (Sandbox Code Playgroud)