StrictMode,严格模式,算是比较简单的性能检测方法。简单介绍,技术小黑屋写的很详细。
StrictMode is a developer tool which detects things you might be doing by accident and brings them to your attention so you can fix them. StrictMode是一个开发者工具,检测你可能由于疏忽而犯的性能问题,并主动提示你修改它。
使用代码在application中开启: 通过配置可以在logcat中查看,也可以弹出dialog、闪烁屏幕等。当然也可以通过通过开发者模式开启。
if (BuildConfig.DEBUG) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectAll() //全都检测 .penaltyFlashScreen() // Flash the screen during a violation. .penaltyDialog() // Show an annoying dialog to the developer on detected violations .penaltyLog() //.detectDiskReads() //.detectDiskWrites() //.detectNetwork() //.detectCustomSlowCalls() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectAll() .penaltyLog() //.detectLeakedSqlLiteObjects() //.detectLeakedClosableObjects() //.detectActivityLeaks() //.penaltyDeath() //Crashes the whole PRocess on violation,一旦发现问题崩溃进程 .build()); } super.onCreate(); }当log太多是,则可通过adb命令: adb logcat | grep StrictMode 直接抓取特定log查看。
看了下源码,貌似主要是AndroidBlockGuardPolicy 类在做监控。 这个类毕竟是对整个App做全局监控,按照技术小黑屋的分析,在所有这些地方,都使用BlockGuard 进行回调,传给StrictMode去检测处理。这样设计也挺好,不需使用代理、反射等,也不错。
那么接下就是onWriteToDisk():
然后会走到handleViolationWithTimingAttempt()方法来,对
void handleViolationWithTimingAttempt(final ViolationInfo info) { //... //使用ThreadLocal<Handler>来插入Message, threadHandler.get().postAtFrontOfQueue(new Runnable() { public void run() { long loopFinishTime = SystemClock.uptimeMillis(); if (windowManager != null) { try { windowManager.showStrictModeViolation(false); } catch (RemoteException unused) { } } for (int n = 0; n < records.size(); ++n) { ViolationInfo v = records.get(n); v.violationNumThisLoop = n + 1; v.durationMillis = (int) (loopFinishTime - v.violationUptimeMillis); handleViolation(v); } records.clear(); } });}然后走到handleViolation()里
void handleViolation(final ViolationInfo info) { //主要是一些打印操作 }StrictMode比较容易学习,使用adb命令也能很轻易的排查到问题。功能强大,SDK提供的一个好工具,应该是一个初步的优化操作。
参考: 官方文档 Android性能调优利器StrictMode
新闻热点
疑难解答