StrictMode卡顿与泄漏检测-StrictMode原理(2)

本文详细解析了Android中的StrictMode关闭检测原理,包括CloseGuard如何进行IO关闭检测,防止资源泄漏。同时,探讨了BlockGuardOS如何检测IO卡顿,并介绍了SqliteCursor的泄漏检测机制,帮助开发者提升应用性能和稳定性。

2. StrictMode关闭检测原理

StrictMode的关闭检测其实是比较简单的,基本上就是在开启的时候埋桩,释放的时候检测桩子是否有关闭,没有关闭则检测为泄漏。

2.1 CloseGuard

这里有一个预备知识,那就是CloseGuard,它是一个StrictMode专门为了处理此类事情的类,主要包括三个函数:

  • open 开始埋桩
  • close 拆桩
  • warnIfOpen 爆炸
SystemApi(client = MODULE_LIBRARIES)
@libcore.api.IntraCoreApi
public final class CloseGuard {
   
   

    private static volatile boolean stackAndTrackingEnabled = true;

    private static volatile Reporter reporter = new DefaultReporter();

    private static volatile Tracker currentTracker = null; // Disabled by default.

    @UnsupportedAppUsage
    @SystemApi(client = MODULE_LIBRARIES)
    public static void setEnabled(boolean enabled) {
   
   
        CloseGuard.stackAndTrackingEnabled = enabled;
    }


    public static boolean isEnabled() {
   
   
        return stackAndTrackingEnabled;
    }


    @UnsupportedAppUsage(trackingBug=111170242)
    @SystemApi(client = MODULE_LIBRARIES)
    @libcore.api.IntraCoreApi
    public void open(String closer) {
   
   
        openWithCallSite(closer, null /* callsite */);
    }

		//关闭之前,
    @UnsupportedAppUsage
    @SystemApi(client = MODULE_LIBRARIES)
    @libcore.api.IntraCoreApi
    public void close() {
   
   
        Tracker tracker = currentTracker;
        if (tracker != null && closerNameOrAllocationInfo instanceof Throwable) {
   
   
            // Invoke tracker on close only if we invoked it on open. Tracker may have changed.
            tracker.close((Throwable
### SQLite 数据库连接原理 SQLite 是一种嵌入式的轻量级关系型数据库管理系统,其设计目标是简单易用并适合资源受限环境下的应用开发。由于 SQLite 不依赖于独立的服务器进程,而是直接通过文件系统访问数据存储文件,因此它的连接机制其他传统数据库有所不同。 #### 连接过程概述 当应用程序请求打开一个 SQLite 数据库时,SQLite 驱动程序会执行一系列初始化操作来建立数据库文件之间的逻辑链接[^2]。这些操作通常包括以下几个方面: 1. **验证路径有效性**: 应用程序提供指向数据库文件的具体路径名(可以是实际存在的文件或者新创建的一个)。如果指定位置不存在,则根据模式决定是否自动新建该文件作为新的数据库实例。 2. **加载页缓存管理器 (Page Cache Manager)**: SQLite 使用内存中的页面缓冲区来提高读写效率。每次启动一个新的事务之前都会先分配一定数量的缓存空间用来暂存磁盘上的记录副本以便后续修改或查询使用[^3]。 3. **设置锁机制(Locking Mechanism)**: 为了防止多个线程/进程同时更新相同的数据而导致冲突问题发生,在任何更改尝试前都需要获取相应的锁定状态。SQLite 支持多种类型的加锁方式如共享锁(Shared Lock), 排他锁(Exclusive Lock) 等以满足不同的并发需求场景[^1]. 4. **准备虚拟机(Virtual Machine Preparation)**: 如果存在未提交的事物残留情况(SQLite支持跨断电保护功能),那么此时还需要额外步骤去恢复之前的中间结果集直到达到一致性的最终版本为止。之后才正式进入可正常运行SQL语句的状态下工作。 以下是简单的 Python 示例展示如何利用 sqlite3 模块实现基本的数据库交互: ```python import sqlite3 def create_connection(db_file): """ 创建到 SQLite 数据库的连接 """ conn = None try: conn = sqlite3.connect(db_file) print(f'Successfully connected to {db_file}') except Error as e: print(e) return conn if __name__ == '__main__': db_path = 'example.db' connection = create_connection(db_path) if connection is not None: cursor = connection.cursor() # 执行 SQL 查询命令 query = '''SELECT * FROM users''' result = cursor.execute(query).fetchall() for row in result: print(row) connection.close() # 关闭连接释放资源 ``` 此脚本定义了一个 `create_connection` 函数用于构建通往特定 SQLite 文件的通道;并通过标准游标对象执行预编译好的 SELECT 文字串检索所有用户表内的条目最后记得调用 close 方法结束整个生命周期以免造成不必要的泄漏现象出现。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值