在android系统中,怎么监控应用的进程改变及消亡呢?

至于监控应用进程能做什么,这个就不多说了,你懂的。

在android系统中有这么一个类ActivityManagerNative,看名称就大概能猜到该类是做什么用的了,该类中有个方法“registerProcessObserver”

public void registerProcessObserver(IProcessObserver observer) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeStrongBinder(observer != null ? observer.asBinder() : null);
mRemote.transact(REGISTER_PROCESS_OBSERVER_TRANSACTION, data, reply, 0);
reply.readException();
data.recycle();
reply.recycle();
}

该方法就是注册 进程观察者方法,传入的对象为IProcessObserver 类型,而查看工程源码会发现,整个工程中都不能找到IProcessObserver .java;那这个类是怎么来的呢?

搜索源码你可以找到对应的IProcessObserver .aidl文件,对了,就是这个aidl文件编译后,会产生对应的类。

该类中有三个方法:

private IProcessObserver mProcessObserver = new IProcessObserver.Stub() {

        @Override
public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
Log.i(TAG, "onForegroundActivitiesChanged: pid " + pid + " uid " + uid);
} @Override
public void onProcessDied(int pid, int uid) {
Log.i(TAG, "onProcessDied: pid " + pid + " uid " + uid);
} @Override
public void onImportanceChanged(int pid, int uid, int importance)
throws RemoteException { }
};

我们可以利用这里面的方法监控应用进程。上面是监控进程的相关方法及类,这只是第一步。

  查看ActivityManagerNative源码可以看出,该类是非标准sdk类,无法正常实例化;

1 /** {@hide} */
2 public abstract class ActivityManagerNative extends Binder implements IActivityManager
3 {
4 ...
5 }

这怎么办呢?----反射

另外,IProcessObserver.aidl这个文件必须拿出来,建立与系统同样的包名,把该文件放在该包下面,然后编译就可以得到该类。

下面直接上代码,反射过程就不讲解;

public void moniterAppProcess() {

        try {

            Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative");
Method getDefaultMethod = activityManagerNative.getMethod("getDefault");
Object iActivityManager = getDefaultMethod.invoke((Object[]) null, (Object[]) null);
if (iActivityManager != null) { Method registerMethod = activityManagerNative.getMethod("registerProcessObserver", new Class[]{IProcessObserver.class}); registerMethod.invoke(iActivityManager, mProcessObserver); } } catch (Exception e) {
e.printStackTrace();
}
}

这样执行函数后,就可以实现监控了;什么?报错

W/System.err(12920): Caused by: java.lang.SecurityException: Permission Denial: registerProcessObserver() from pid=12920, uid=10207 requires android.permission.SET_ACTIVITY_WATCHER
W/System.err(12920): at android.os.Parcel.readException(Parcel.java:1465)
W/System.err(12920): at android.os.Parcel.readException(Parcel.java:1419)
W/System.err(12920): at android.app.ActivityManagerProxy.registerProcessObserver(ActivityManagerNative.java:4378)
W/System.err(12920): ... 18 more

好吧,看错误log就知道是权限问题,在AndroidManifest中添加权限

<uses-permission android:name="android.permission.SET_ACTIVITY_WATCHER" />

这样应该就OK了吧,什么???还不行,还是报这个错,好吧去网上搜索看看是什么原因了,为什么添加了权限还是报对应的错

http://stackoverflow.com/questions/20604709/android-permission-and-protectionlevel

http://hubingforever.blog.163.com/blog/static/171040579201301135541438/

原来该权限必须是系统应用且签名是系统签名才可以调用;想想也是,如果任意第三方都有这个权限,那android就出大漏洞了;所以你的应用必须是系统级的应用且是使用系统签名的才可以用该方法实现应用的监控。

转自 https://www.cnblogs.com/successjerry/p/4399817.html

android 监控应用进程的更多相关文章

  1. android 监控软键盘确定 搜索 按钮并赋予点击事件

    在android的实践开发中,为了界面的美观,往往那些搜索框并没有带搜索按钮,而是调用了软键盘的搜索按钮,完成这次时间 1 2 好吧!直接上代码! <EditText android:id=&q ...

  2. Android 监控网络状态

    public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...

  3. Android,监控ContentProvider的数据改变

    有时候应用中需要监听ContentProvider的改变并提供响应,这时候就要利用ContentObserver类了 不管是ContentProvider中实现的,insert,delete,upda ...

  4. Android中判断网络连接是否可用及监控网络状态

    Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...

  5. Android网络状态监控

    Android 监控网络状态 在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化.android的网络状态监听可以用BroadcastReceiver来接 ...

  6. Android内存泄露调试

    Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...

  7. Android网络连接判断与处理

    博客分类: Android 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android ...

  8. 6、android 网络编程

    1.基于socket的用法 服务器端: 先启动一个服务器端的socket     ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s  ...

  9. android 内存泄露调试

    一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) ...

随机推荐

  1. laravel进行单元测试的时候如何模拟数据库以及mockery的调用

    单元测试是独立的,所谓的独立是指有独立的运行容器,独立的数据库. 这样做有什么好处呢? (1). 不会跟正常的容器产生冲突,继而影响正常业务. (2). 数据库独立防止数据被修改影响单元测试结果. 这 ...

  2. flask配置文件的几种方法

    配置文件的参数 flask中的配置文件是一个flask.config.Config对象(继承字典),默认配置为: { 'DEBUG': get_debug_flag(default=False), 是 ...

  3. MQTT简介

    MQTT简介 MQTT是IBM开发的一个即时通讯协议,该协议支持所有的平台,几乎可以把所有联网的物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议 MQTT的特 ...

  4. 使用nginx作为webservice接口代理

    通常情况下,企业并不会直接开放系统接口给到外网,并且在企业内部同样有SOA或者ESB这样的接口统一管理的工具. 那么,大多数情况下,如果需要与外部系统,如云系统,或者其他企业的系统做接口时采取的方式如 ...

  5. tensorflow中命名空间、变量命名的问题

    1.简介 对比分析tf.Variable / tf.get_variable | tf.name_scope / tf.variable_scope的异同 2.说明 tf.Variable创建变量:t ...

  6. Python第一发:Hello world

     #!/usr/bin/python def main () : print 'hello world' main ()

  7. 关于规范NOIP试题管理办法的通知

    由CCF主办的NOIP赛事举行在即,保密起见,现将有关规定发给各省赛区组织单位. 1.NOI各省组织单位负责试题保密工作. 2.NOIP初赛试卷为纸质版,复赛试卷为电子版. 3.在初赛进行中,如有选手 ...

  8. sql 中取整,四舍五入取整,向下取整,向上取整。

    SELECT round(52.45, 0) AS round4, round(52.54, 0) AS round5, round(52.45, 1) AS round41, round(52.54 ...

  9. Django进阶之CSRF

    简介 django为用户实现防止跨站请求伪造的功能,通过中间件 django.middleware.csrf.CsrfViewMiddleware 来完成.而对于django中设置防跨站请求伪造功能有 ...

  10. Python测试框架之Unittest梳理

    1. 2.