首页 > 系统相关 >AMS监控某进程是否挂掉的方法

AMS监控某进程是否挂掉的方法

时间:2023-03-02 15:58:49浏览次数:43  
标签:XXXX app pid 挂掉 TAG 监控 adr AMS RemoteException

File: ActivityManagerService.java
原生代码中会在每个应用进程启动时,创建一个AppDeathRecipient对象来监控其是否death,进程挂掉(包括走onDestroy的、或者crash)后,执行回调方法处理此应用的各组件资源的后续。

利用此点,我们定义一个自己的XXXXCallerDeathRecipient类,并在其回调中写我们要在进程挂掉时需要同时做的事。
需要写在AMS所在的包中,要从AMS的包内变量mPidsSelfLocked获取相关应用进程。
应用端通过调用 watchXXXXDeathforProcess 并传入应用pid即可。
代码例如:
apk端:
int pid = android.os.Process.myPid();
Log.v("XXXX",  "myPID: " + pid);
Method method = null;
try {
    method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);
    IBinder binder = (IBinder) method.invoke(null, Context.ACTIVITY_SERVICE);
    IActivityManager mIPm = IActivityManager.Stub.asInterface(binder);
    mIPm.watchXXXXDeathforProcess(pid);
} catch (NoSuchMethodException | ClassNotFoundException | InvocationTargetException | IllegalAccessException | RemoteException e) {
    Log.e("XXXX", "XXXX catch Exception: " + e);
    e.printStackTrace();
}
Framework端:
ActivityManagerService.XXXXCallerDeathRecipient adr;

private final class XXXXCallerDeathRecipient implements IBinder.DeathRecipient {
    final ProcessRecord mApp;
    final int mPid;
    final IApplicationThread mAppThread;

    XXXXCallerDeathRecipient(ProcessRecord app, int pid,
                      IApplicationThread thread) {
        if (DEBUG_ALL) Slog.v(
                TAG, "XXXX death recipient " + this
                        + " for thread " + thread.asBinder());
        mApp = app;
        mPid = pid;
        mAppThread = thread;
    }

    @Override
    public void binderDied() {
        Slog.v(TAG, "XXXX Death received in " + this + " for thread " + mAppThread.asBinder() + "  mPid is " + mPid);
        try {
            // your code
        } catch (RemoteException e) {
            Slog.e(TAG, "XXXX restoreAllDirOwner has RemoteException when binderDied: " + e);
        }
        mApp.getThread().asBinder().unlinkToDeath(adr, 0);
    }
}

public boolean watchXXXXDeathforProcess(int pid) {
    ProcessRecord app;
    if (pid != MY_PID && pid >= 0) {
        synchronized (mPidsSelfLocked) {
            app = mPidsSelfLocked.get(pid);
        }
        Slog.d(TAG, "XXXX watchDeathforProcess for: " + app.processName + "    pid: " + app.mPid);
        try {
            adr = new ActivityManagerService.XXXXCallerDeathRecipient(
                    app, pid, app.getThread());
            app.getThread().asBinder().linkToDeath(adr, 0);
            app.setDeathRecipient(adr);
            return true;
        } catch (RemoteException e) {
            Slog.e(TAG, "XXXX watchDeathforProcess has RemoteException: " + e);
        }
    }
    return false;
}

 


 

标签:XXXX,app,pid,挂掉,TAG,监控,adr,AMS,RemoteException
From: https://www.cnblogs.com/1118zjg/p/17172017.html

相关文章

  • 浅谈数据中心机房末端配电技术与产品监控选型
    陈盼安科瑞电气股份有限公司上海嘉定 201801摘要:数据中心机房末端配电的可靠性、稳定性和可维护性直接关系到IT设备的安全供电。数据中心的末端配电技术主要有两种,一种采......
  • prometheus 监控华为交换机
    一、环境交换机:huaweiS5735prometheus:使用docker镜像,监听9090端口granfana:使用docker镜像,监听3000端口(华为交换机使用11169模板)snmp-exporter:​​https://g......
  • 做好监控告警的关键技巧
    在《线上监控怎么做?》一文中我们探讨了做好监控的一些技巧和陷阱,本文则主要探讨做好告警的一些重要技巧。1.根据告警类型慎重选择告警渠道发送告警尽量不要用邮件告警,要......
  • 技术分享| 如何使用Prometheus实现系统监控报警邮件通知
    上一篇关于Prometheus的文章中说到了Prometheus是如何实现进程监控。在实际的线上环境中,当系统进程出现异常后需要实时通知到值班运维人员,去检查系统是否还正常运转。下面......
  • Prometheus+Grafana可视化监控服务器
    目录一、介绍二、安装Prometheus三、安装Grafana四、PronetheusGrafana相关联五、监控服务器状态一、介绍Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF......
  • 安防视频监控系统前端摄像机——DSP与SOC摄像机
       一、DSP摄像机  DSP(DigitalSignalProcessing)即数字信号处理,它是利用数字计算机或专用数字信号处理设备,以数值计算的方法对信号进行采集、变换、综合......
  • CamstarVP表格删除行报错
    前提:是从服务中拖出来的表格,带表达式的。但是点击删除按钮的时候,直接页面报错。原因是:VP上面没有指定服务。 ......
  • LiveNVR Onvif/RTSP流媒体软件接入监控摄像头后如何获取直播流地址进行大屏展示、播放
    1、LiveNVR介绍LiveNVR的安防监控的视频直播,可以按标准的Onvif/RTSP协议接入监控设备,也可以通过海康、大华、天地伟业等厂家私有SDK接入监控,实现web页面的播放和录像回放......
  • 4K HDMI输出固定广角拍监控摄摄像机法庭应用
    派尼珂Pnioke4K超高清专业摄像机NK-UHD300C采用1/1.8SONYCMOS专业4K图像传感器,890万像素,视频输出接口支持HDMI和USB输出,HDMI原始无压缩输出4K@30Fps视频,19201080,3840216......
  • zabbix自定义监控项
    zabbix通过snmp自定义监控项链接问题解决:1.提示“NoSuchInstancecurrentlyexistsatthisOID”**办法:**还有一个需要注意的点就是,我们添加了单个指标的监控......