Android严格模式

Android性能调优——严苛模式StrictMode 前情提要 由于在demo中涉及了在主线程的网络操作,当时在开发时仅简单搜索了相关异常的处理方法,于是书写了以下代码: StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy .Builder() .permitAll() .build(); StrictMode.setThreadPolicy(policy); 这段代码很好的解决了抛异常的问题,但当时 阅读详情

1.背景

为防止出现资源泄漏或者主线程发生的意外耗时网络操作或IO操作导致卡顿,Android2.3(API9)开始提供了监测接口StrictMode类,针对单个线程和虚拟机的所有对象定义了检查策略。监测到异常后日志能打印到具体的代码堆栈,便于立刻排查解决。

2.使用方式

应用启动处设置严苛模式,可在Application.onCreate()或Activity中启用监测,包含线程级别和进程级别两类监测接口

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        if (BuildConfig.DEBUG) {
            enableStrictMode();
        }
    }

    private void enableStrictMode() {
        // 监测当前线程(UI线程)上的网络、磁盘读写等耗时操作
        StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
             .detectDiskReads()  // 监测读磁盘
             .detectDiskWrites()  // 监测写磁盘
             .detectNetwork()      // 监测网络操作
             .detectCustomSlowCalls()  // 监测哪些方法执行慢
             .detectResourceMismatches()  // 监测资源不匹配
             .penaltyLog()   // 打印日志,也可设置为弹窗提示penaltyDialog()或者直接使进程死亡penaltyDeath()
             .penaltyDropBox()  //监测到将信息存到Dropbox文件夹 data/system/dropbox
             .build());

      // 监测VM虚拟机进程级别的Activity泄漏或者其它资源泄漏
     StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
             .detectActivityLeaks()  // 监测内存泄露情况
             .detectLeakedSqlLiteObjects()  // SqlLite资源未关闭,如cursor
             .detectLeakedClosableObjects()  // Closable资源未关闭,如文件流
             .detectCleartextNetwork()  // 监测明文网络
             .setClassInstanceLimit(MyClass.class, 1)  // 设置某个类的实例上限,可用于内存泄露提示
             .detectLeakedRegistrationObjects()  // 监测广播或者ServiceConnection是否有解注册
             .penaltyLog()
             .build());
    }
}

可按需建造需要监测的场景,也可使用Builder().detectAll()监测所有情况。
比如文件流未关闭,打印的日志提示如下,可根据堆栈找到导致问题的地方

2022-01-11 11:11:53.096 20010-20031/com.hello.myApp 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.
        at android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1987)
        at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:345)
        at java.io.FileInputStream.finalize(FileInputStream.java:503)
        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:930)
     Caused by: java.lang.Throwable: Explicit termination method 'close' not called
        at dalvik.system.CloseGuard.openWithCallSite(CloseGuard.java:295)
        at dalvik.system.CloseGuard.open(CloseGuard.java:263)
        at java.io.FileInputStream.<init>(FileInputStream.java:176)
        at java.io.FileInputStream.<init>(FileInputStream.java:115)
        ... 自己代码调用栈

ps: 开发人员选项里的严格模式跟这个有差别
开发者选项中开启严格模式,已提示应用在主线程上执行长时间操作时闪烁屏幕

3.try-with-resources语句关闭资源

一种自动关闭资源的方式能更优雅处理资源关闭,JDK7中一个新的异常处理机制,在处理必须关闭的资源时,使用try-with-resources语句替代try-finally语句。
try-finally语句使用


 

InputStream in = null;
try {
    in = new FileInputStream(file);
    int temp;
    while ((temp = in.read()) != -1) {
        System.out.write(temp);
    }
} catch (IOException e) {
    // todo
} finally {
    in.close();
}

替换为try-with-resources语法,即try后面加括号引入资源

try (InputStream in = new FileInputStream(file)) {
    in = new FileInputStream(file);
    int temp;
    while ((temp = in.read()) != -1) {
        System.out.write(temp);
    }
} catch (IOException e) {
    // todo
}

实现AutoCloseable或Closeable接口均可使用此操作,可将实现此接口的类定义为资源,自己定义的资源也可以实现此接口。
ps: try-with-resources只能在JDK7及以上使用,必选在括号内有变量声明,JDK9之后括号内直接使用外部定义的变量即可

4.原理

(1)通过在需要监控的代码中植入代码实现此功能,比如IO中通过在open,read,write,close时进行监控,从上面监听到异常打印的日志堆栈即可看出植入的代码

android.os.StrictMode$AndroidCloseGuardReporter.report(StrictMode.java:1987)
        at dalvik.system.CloseGuard.warnIfOpen(CloseGuard.java:345)
        at java.io.FileInputStream.finalize(FileInputStream.java:503)

Object finalize()方法当GC确定不存在对该对象的有更多引用时,对象的垃圾回收器就会调用这个方法,FileInputStream将被回收时判断资源还未关闭随即提示。
(2)再如监测Acitivity泄露时,performLaunchActivity、performDestroyActivity方法中启动和回收Activity时用HashMap<Class, Integer>计数。
(3)StrictMode是建立在BlockGuard和CloseGuard之上的机制,Guard表示守卫,Block表示阻塞,在进行一些耗时操作时,譬如磁盘读写、网络操作,有一个守卫在监测着,它就是BlockGuard,如果这些耗时的操作导致主线程阻塞,BlockGuard就会发出通知,Close对应可打开的文件,在文件被打开后,也有一个守卫在监测着,它就是CloseGuard,如果没有关闭文件,则CloseGuard就会发出通知。



 

Android严苛模式StrictMode使用与取消 StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。除了主线程,我们还可以在Handler,AsyncTask,AsyncQueryHandler,IntentService等API中使用StrictMode。 ———————————————— 版权声明:本文为优快云博主「终于找对路了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原. 阅读详情

相关推荐

详解Android StrictMode严格模式的使用方法

Android 2.3提供一个称为严苛模式StrictMode的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢?它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例policy violation,你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃crash,也可以仅将警告计入日志让你的应用继续执行。StrictMode是一个十分有用的类,它可以很方便地应用于检查Android应用程序的性能和存在的问题。当开启这个模式后,开发者能很好地检查应用中存在的潜在问题。 StrictMode分为以下两种策

OkHttp 出现 StrictMode policy violation: android.os.strictmode.LeakedClosableViolation 错误

OkHttp,android.os.strictmode.LeakedClosableViolation 错误

ceabie的专栏 3739

大模型-CLIP 详细介绍

最先进的计算机视觉系统通常被训练来预测一组预定义的对象类别。这种受限的监督形式限制了它们的通用性和可用性,因为要指定任何其他视觉概念,就需要额外的标注数据。比如,它们可以识别“猫”、“狗”、“汽车”等。但是,这种做法有一个明显的局限性:如果你想让系统识别一个新的类别,比如说“独角兽”,你就必须提供大量带有“独角兽”标签的图片来训练系统。这不仅耗时费力,而且限制了系统的灵活性和广泛适用性。直接从原始文本中学习关于图像的信息是一种很有前途的替代方案,因为它利用了更广泛的监督来源。

晓的博客 9721

StrictMode分析Activity泄漏-StrictMode原理(3)

StrictMode对于Activity的泄漏检测也是有的。泄漏的日志: StrictMode的activity泄漏检测,用的是引用计数法,大致思路分为三步:

怪蜀黍 1046

nRF52382低功耗蓝牙应用开发之入门教程-软件烧录

准备工作在上一篇文章讲过了,这里就讲讲nRFgo studio的使用 硬件准备: J-link:2线 供电:3.3V 如下图打开nRFgo studio界面介绍, 2、如果J-link正常,如下图 3、如果蓝牙芯片正常 4、烧录过程,如果蓝牙芯片之前有烧录过程序,需先点擦除,再点烧录 5、烧录代码路劲,例如 F:\nRF\SDK\nRF5_SDK_15.2.0_...

LinQiPing233的博客 1946

PCB作为智能小车底盘的设计方法与工程实践

PCB底盘是一种将机械结构与电子设计深度融合的嵌入式系统集成方案,其本质是利用印制电路板的高精度制造能力(±0.05mm孔位公差)和FR-4材料的结构强度(弯曲强度345MPa),替代传统亚克力或铝合金底盘。该方案通过封装库驱动的正向设计、机械层语义化定义及机电协同布局,实现安装基准统一、共地平面优化与RF天线集成等技术价值。广泛应用于教育机器人、AGV小车、模块化开发平台等对空间紧凑性、量产一致性与电磁兼容性有严苛要求的移动嵌入式场景,尤其适合具备EDA工具使用能力的电子工程师主导的跨学科开发流程。

weixin_36064575的博客 129

android selinux 模式 安卓selinux严格模式

该语法含义为:允许具有user_t类型的进程(主体)对具有user_home_t类型的、目标类是file的目标有create read write unlink的权限,或者为:允许domain为user_t的进程(主体)对type为user_home_t的、目标类为file的目标有create read write unlink的权限。然后,这个seinfo标签可以作为seapp_contexts文件中的一个键,为所有带有该seinfo标签的应用程序分配一个特定的标签。还存在其他类型的应用程序。

hnlgzb的专栏 966

【免费】最新区块链钱包和私钥的助记词碰撞器,bybit使用python开发

【免费】最新助记词钱包碰撞器,全链全网络,一周左右就有,稳定高效。

weixin_48529185的博客 1万+

android车载严格模式解除,Android严格模式

我已经使用AsyncTask在JSON解析上编写了一个简单的代码。我只是在TextView中显示响应。我不知道这是对还是错。它在GingerBread上工作并在果冻豆上显示NetworkOnMainThreadException。如果我使用StrictMode,它在JellyBean上工作,并在GingerBread上关闭。如何编写支持以上Android 3.0及以下Android 3.0的代码。...

weixin_42501270的博客 1518

QML 地图修改插件源码(三),Map在Plugin中设置加载地图类型

常用的地图种类分为交通图,地形图,卫星图等等,在QML的Map(以OSM地图为例)中提供activeMapType属性用于读取当前显示的地图类型(注意:该属性为只读属性,不能用于赋值),QML中地图的加载寻找根据瓦片的文件名进行查找,例如名为"osm_100-l-5-2-2-3.png"的瓦片,其中5代表了该地图的类型

zjgo007的专栏 3165

企业AI Agent的多模态学习在用户体验优化中的应用

本文旨在为企业技术团队提供关于多模态AI Agent在用户体验优化领域的全面技术指南。多模态学习如何突破传统单模态AI的局限性企业级AI Agent的系统架构设计原则多模态特征融合的工程实现细节用户体验度量的量化方法实际部署中的性能优化策略研究范围涵盖计算机视觉、自然语言处理、语音识别等多个AI子领域的技术融合,以及它们在电商、金融、医疗等行业的应用实践。首先介绍多模态学习的核心概念和技术原理然后深入分析关键算法和数学模型接着通过完整项目案例展示实际应用。

大模型应用工坊 706

【Android】StrictMode严格模式流程分析及入侵埋点处分析

一、使用严格模式 StrictMode严苛模式,是Android提供的一种运行时检测机制,一般用来检测在主线程做一些耗时动作,比如IO读写、数据库操作、Sp操作、Activity泄露、未关闭的Closable对象泄露等,以减少发生ANR等。严格模式主要有2个策略:一个是线程策略,即TreadPolicy是针对一个具体的线程,另一个是VM策略,即VmPolicy,是针对虚拟机的所有对象。 当然可以添加Penalty(惩罚),一般我们都是用来打印日志、绘制红框等。 二、严格模式中是如何去检测,在哪个地方有注入

sinat_36955332的博客 760

BLDC&PMSM电机控制器硬件设计工程(八)72V 10kW电机控制器原理图工程及库文件

电机控制器基本需求:接口类型;MCU平台;通信接口;供电;信号采集;信号输出;功率;EMC或者认证需求。

小幽余生不加糖 374

strictmode android,Android 应用性能优化-StrictMode(严格模式)

UI线程如果被阻塞5秒的话,那么应用程序此时就会弹出ANR的对话框,ANR对应用程序来说是一个很严重的问题。 如何防止应用程序出现ANR,怎么分析查看导致ANR问题的原因? 我们来介绍Android的严格模式。怎样开启严格模式有两种开启方式。开发者选项进入开发者选项,里面找到启用严格模式,打开。 当应用主线程执行长时间操作的话会闪锁屏幕。StrictMode API(代码调用)可以在Activit...

weixin_32821251的博客 373

lammps案例:热导率模拟案例讲解(NEMD方法)

lammps计算热导率大体可以分为三种方法:EMD、NEMD、rNEMD。 本文介绍非平衡模拟(NEMD)热导率的计算方法。 NEMD下热导率计算公式为: k=dQ*dZ/dt k:热导率 dQ:能量通量。 dT/dZ:温度梯度。 非平衡态下计算热导率的原理是在材料的两端或者中间设置热源和冷源。 在热源输入热量,在冷源抽取等量的热量,在这个过程中计算材料内部会有热量的传递,产生温度梯度。 在lammps模拟中得到能量通量和温度梯度,代入公式即可求得热导率。 热量的输入方式有多种,如fix langevin

lammps_jiayou的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android严格模式影响,Android严格模式

我使用AsyncTask编写了一个关于JSON解析的简单代码。我只是在TextView中显示回复。我不知道这是对还是错。它在GingerBread上工作并在JellyBean上显示NetworkOnMainThreadException。如果我使用StrictMode,它将在JellyBean上工作并在GingerBread上关闭力量。如何编写支持Android 3.0及以上Android 3.0...

weixin_39954569的博客 161

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android StrictMode严格模式

Android 严格模式: 严格模式的现象: 关闭严格模式的做法有两种:

ysh149216447的专栏 3196

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Android严格模式(StrictMode)

StrictMode作用: 是用来检测程序中违例情况的开发者工具。 小白主要用于监测内存泄漏 检查策略 两种:线程策略【ThreadPolicy】和虚拟策略【VmPolicy】 代码如下: 代码位置 严格模式的开启可以放在Application或者Activity以及其他组件的onCreate方法 StrictMode.setThreadPolicy(new StrictMode.Th...

qq_39626462的博客 2333

Android StrictMode严格模式的使用方法

Android 2.3提供一个称为严苛模式StrictMode的调试特性,Google称该特性已经使数百个Android上的Google应用程序受益。那它都做什么呢?它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例policy violation,你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。你可以强制用警告代替崩溃crash,也可以仅将警告计入日志让你的应用继续执行。

我的专栏 7675

android viewflipper中使用fragment,Fragment中使用ViewFlipper在严格模式下抛出android.app.IntentReceiverLeaked...

今天遇到一个bug:IntentReceiverLeaked, 是在严格模式下报的:12-20 01:04:17.503 E/StrictMode(14464): android.app.IntentReceiverLeaked: Activity com.video.test.DetailActivity has leaked IntentReceiver android.widget.View...

weixin_39543478的博客 455

Android StrictMode严格模式(四周会红框)

Android 严格模式:StrictMode意思为严格模式,是用来检测程序中违例情况的开发者工具。最常用的场景就是检测主线程中本地磁盘和网络读写等耗时的操作。 严格模式的现象:UI操作时整屏幕上闪现出红框 关闭严格模式的方法有两种: device-common.mk中persist.sys.strictmode.disable=true 注释掉文件frameworks\base\serv...

wq892373445的博客 764

android4.0里的某些apk激活了严格模式,如chrome

/frameworks/base/core/java/android/os/StrictMode.java StrictMode.java文件中  将 windowManager.showStrictModeViolation 两个调用的地方注释掉. 说明: 设置菜单中的严格模式是一个全局的选项, 但apk可以直接激活, 不受设置菜单的控制. chrom中激活了StrictMode

kira_123的专栏 1128

Android 应用性能优化-StrictMode(严格模式)

为什么80%的码农都做不了架构师?>>> ...

weixin_33901926的博客 613

Android4.2严格模式代码分析

问题现象:有时候手机屏幕会不时的闪出红色矩形边框,不管是进入应用,在应用界面操作还是退出等操作,都有出现。(8675关闭严格模式没用,仍闪红框) 原因分析:原因在于手机启用了严格模式,正常情况只要关闭该模式再重启即可解决,不排除有极少个别情况是手机硬件或ROM的问题。所谓“严格模式”是指应用在主线程上执行长时间操作时闪烁屏幕,就是说打开某个应用后,退出后该应用仍在进程中运行,长时间后屏幕就会闪烁

teliduxing1029的专栏 1266

【Android 安装包优化】开启资源压缩 ( 资源压缩配置 | 启用严格模式的资源引用检查 | 自定义保留/移除资源配置 | 资源压缩效果 )

一、开启资源压缩、 二、启用严格模式的资源引用检查、 三、自定义保留/移除资源配置、 四、资源压缩效果、 五、完整配置、 1、keep.xml 配置、 2、build.gradle 构建脚本、 六、参考资料、

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2718
上一篇: 关于Android获取Usb设备权限
下一篇: android里执行fopen失败
dodod2012
博客等级 码龄15年 244粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值