在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. English trip EM2-PE-5A Plan a dinner party Teacher:Lamb

    课上内容(Lesson) # Appetizer   ['æpə'taɪzɚ]  n. 开胃物,开胃食品 spinach salad  菠菜沙拉  # "p" 发b音 gazpac ...

  2. Docker Image管理学习笔记,ZT

    Docker Image管理学习笔记 http://blog.csdn.net/junjun16818/article/details/38423391

  3. javascript高级程序设计第3版——第二章使用javascript

  4. nio 序列化

    1.序列化 public class SerializeUtils<T extends Serializable> { public byte[] serialize(T t) { byt ...

  5. Vue(二) 计算属性

    模板内的表达式常用于简单的运算,当过长或逻辑复杂时,难以维护,计算属性就是解决该问题的 什么是计算属性 表达式如果过长,或逻辑更为复杂,就会变得臃肿甚至难以维护,比如: <div> {{ ...

  6. exadata cellcli

    cellcli [port_number] [-n] [-m] [-xml] [-v | -vv | -vvv] [-x] [-e command] The following table lists ...

  7. Ubuntu 12.04安装教程详细步骤(图解)

    1.选择你所想要的语言,如图. 2.选择安装Ubuntu(I). 3.进入Ubuntu安装等待 4.设置处理器信息 5.同意选择的语言 6.配置键盘信息 7.键盘布局选择汉语 8.配置键盘选择汉语 9 ...

  8. 2019-04-10-day029-粘包处理

    内容回顾 osi五层协议 不是真实存在的,只是抽象出来的模型 应用层 传输层 TCP/UDP TCP :全双工,可靠的,面向连接的,速度慢,对数据大小没有限制 建立连接 :三次握手 SYN ACK 断 ...

  9. Linux安装软件出现 “Unable to locate package xxx”错误

    使用新购入的阿里云服务器ECS,预装的Ubuntu,然后想要利用 xrdp 进行远程登陆,但是在输入命令: apt-get install xrdp 出现了 E;Unable to locate pa ...

  10. 【转】SpringBoot——web项目下读取classpath下的文件心得

    在读取springBoot+gradle构建的项目时,如果使用传统的FileInputStream读取文件流或者ResourceUtils工具类的方式,都会失败,下面解释原因: 一.读取文件的三种方式 ...