Android12系统源码分析:NativeTombstoneManager

作者:秋城

概述

Android12 新增的 system_server 进程(LocalService)本地服务,用于管理native tombstones。

该服务在开机 SystemServer 初始化流程启动,添加到 LocalService,然后启动一个 ServiceThread 线程用于(mHandler.post)处理本服务的业务。
NativeTombstoneManager 的功能主要是:

  • 监听/data/tombstones目录文件变动,解析为 TombstoneFile 对象保存,通知 dropbox
  • 特定 tombstones 文件删除
  • 特定 tombstones 文件检索

值得关注的是 AMS 对该服务的使用,也是 Android11 新增 API:ActivityManager.java#getHistoricalProcessExitReasons()
软件架构如图:

图:NativeTombstoneManager 类图

启动流程

图:NativeTombstoneManager 服务启动时序图

服务比较简单,和其他 SystemServer 启动的服务一样,

frameworks/base/services/core/java/com/android/server/os/NativeTombstoneManagerService.java

public class NativeTombstoneManagerService extends SystemService {
   
    private NativeTombstoneManager mManager;

    @Override
    public void onStart() {
   
        mManager = new NativeTombstoneManager(getContext());
        //仅添加本地服务,没有binder服务
        LocalServices.addService(NativeTombstoneManager.class, mManager);
    }

    @Override
    public void onBootPhase(int phase) {
   
        if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {
   
            mManager.onSystemReady();
        }
    }
}

本服务也是 SystemService 工具类的子类,通过重写 onStart、onBootPhase 获得代码流程

在 onStart 中初始化真正的服务实现 NativeTombstoneManager,实例化后添加到 LocalServices

frameworks/base/services/core/java/com/android/server/os/NativeTombstoneManager.java

public final class NativeTombstoneManager {
   
        NativeTombstoneManager(Context context) {
   
    //启动handler线程,用于后续处理本服务的业务
        final ServiceThread thread = new ServiceThread(TAG + ":tombstoneWatcher",
                THREAD_PRIORITY_BACKGROUND, true /* allowIo */);
        thread.start();
        mHandler = thread.getThreadHandler();
    //启动文件监听/data/tombstones
        mWatcher = new TombstoneWatcher();
        mWatcher.startWatching();
    }

    void onSystemReady() {
   
        registerForUserRemoval();
        registerForPackageRemoval();
        // 开机阶段先扫描一次/data/tombstones目录
        mHandler.post(() -> {
   
            final File[] tombstoneFiles = TOMBSTONE_DIR.listFiles();
            for (int i = 0; tombstoneFiles != null && i < tombstoneFiles.length; i++) {
   
                if (tombstoneFiles[i].isFile()) {
   
                    handleTombstone(tombstoneFiles[i]);

开机流程有三个动作

  • 启动 handler 线程,用于后续处理本服务的业务
  • TombstoneWatcher 启动文件监听 /data/tombstones
  • 开机阶段先扫描一次 /data/tombstones 目录

看一下 handleTombstone

frameworks/base/services/core/java/com/android/server/os/NativeTombstoneManager.java

    private void handleTombstone(File path) {
   
        final String filename = path.getName()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值