Android Tombstone生成时能否注册回调或获取通知替代轮询?
Android Tombstone生成时获取通知的方法
要替代盲轮询,在tombstone生成时触发读取操作,有两种可行方案,但都需要注意权限限制:
1. 使用FileObserver监听tombstone目录
Android系统级tombstone文件默认存储在/data/tombstones/目录下,你可以通过FileObserver监听该目录的文件创建事件:
- 实现自定义FileObserver,监听
CREATE事件:
public class TombstoneObserver extends FileObserver { private static final String TOMBSTONE_DIR = "/data/tombstones/"; public TombstoneObserver() { super(TOMBSTONE_DIR, FileObserver.CREATE); } @Override public void onEvent(int event, String path) { if (event == FileObserver.CREATE && path != null && path.startsWith("tombstone_")) { // Tombstone文件已生成,触发读取逻辑 readTombstoneFile(TOMBSTONE_DIR + path); } } private void readTombstoneFile(String filePath) { // 你的文件读取逻辑实现 } }
- 启动观察者:
TombstoneObserver observer = new TombstoneObserver(); observer.startWatching();
注意:该方法需要应用拥有访问/data/tombstones/目录的权限,通常要求设备root,或应用为系统签名应用。部分Android版本可能调整tombstone存储路径,需根据实际系统确认。
2. 监听Logcat中的tombstone生成日志
系统生成tombstone时,会在logcat的system缓冲区输出类似Writing tombstone to: /data/tombstones/tombstone_xx的日志,你可以监听logcat输出,匹配关键词触发读取:
- 通过
ProcessBuilder启动logcat进程并过滤日志:
new Thread(() -> { try { Process process = new ProcessBuilder() .command("logcat", "-b", "system", "-s", "DEBUG:V") .redirectErrorStream(true) .start(); BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); String line; while ((line = reader.readLine()) != null) { if (line.contains("Writing tombstone to:")) { // 提取tombstone文件路径 String filePath = line.split(": ")[1]; readTombstoneFile(filePath); } } } catch (IOException e) { e.printStackTrace(); } }).start();
注意:该方法需要应用拥有READ_LOGS权限,Android 11及以上版本中,该权限仅对系统应用或签名授权应用开放,普通应用无法获取。
权限说明
两种方案都依赖特殊权限:
- 普通应用无法直接访问tombstone文件或读取系统日志,必须是系统应用或设备已root才能正常工作。
- 若仅需监听自身应用崩溃,无需tombstone的话,可使用
Thread.UncaughtExceptionHandler捕获崩溃事件,无需特殊权限。
内容的提问来源于stack exchange,提问作者droid_dev
相关产品推荐
相关产品推荐

