Android ANR 监测 SDK,通过异步线程心跳检测主线程卡顿,支持分级回调和日志记录。
- 主线程卡顿监测(心跳检测机制)
- 分级 ANR 回调:轻度(3s)/ 严重(4s),阈值可自定义
- 异步回调,不阻塞主线程
- 可选的 ANR 日志写入(文件名前缀、存储目录均可配置)
- ANR 日志文件查询,异步回调文件路径
在项目根目录 settings.gradle 中添加仓库:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url 'https://raw.githubusercontent.com/gg8883/AnrWatcher/main/maven-repo' }
}
}在 app/build.gradle 中添加依赖:
dependencies {
implementation 'com.anrwatcher:anrwatcher:1.0.2'
}Sync Gradle 即可使用。
- 前往 Releases 页面 下载最新版
anrwatcher.jar - 将
anrwatcher.jar复制到你项目的app/libs/目录下 - 在
app/build.gradle中添加依赖:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
}- Sync Gradle 即可使用
import com.anrwatcher.*;
// 1. 配置(lightThreshold 和 severeThreshold 不设置则默认 3秒/4秒)
AnrConfig config = new AnrConfig.Builder()
.lightThreshold(3000) // 可选,默认 3000ms(范围 1000~30000ms)
.severeThreshold(4000) // 可选,默认 4000ms(范围 1000~30000ms)
.enableLog(true) // 开启日志写入
.logFilePrefix("my_anr") // 日志文件名前缀
.logDir(new File(getExternalFilesDir(null), "anr_logs")) // 日志存储目录
.maxLogSize(100 * 1024 * 1024) // 可选,日志最大总大小,默认 100MB,超出自动清理旧文件
.build();
// 2. 启动监测
AnrWatcher.getInstance().start(config, new AnrCallback() {
@Override
public void onAnrDetected(AnrInfo anrInfo) {
// 异步线程回调,不在主线程
Log.e("ANR", "级别: " + anrInfo.getLevel()
+ " 阻塞: " + anrInfo.getBlockTimeMillis() + "ms");
// 获取主线程堆栈
Log.e("ANR", anrInfo.formatStackTrace());
}
@Override
public void onAnrLogFilesFound(String[] filePaths) {
// 查找日志文件的结果回调
for (String path : filePaths) {
Log.d("ANR", "日志文件: " + path);
}
}
});
// 3. 查找已有 ANR 日志(异步回调结果)
AnrWatcher.getInstance().findAnrLogFiles();
// 4. 停止监测
AnrWatcher.getInstance().stop();| 类 | 说明 |
|---|---|
AnrWatcher |
主入口,单例模式,调用 start() / stop() / findAnrLogFiles() |
AnrConfig.Builder |
配置构建器,设置阈值(默认3s/4s)、日志开关、文件名前缀、存储目录、最大日志大小(默认100MB) |
AnrCallback |
回调接口,onAnrDetected() 和 onAnrLogFilesFound() |
AnrInfo |
ANR 信息,包含级别、阻塞时长、主线程堆栈、线程状态 |
AnrLevel |
枚举:LIGHT(轻度)/ SEVERE(严重) |
MIT