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

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

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

  1. public void registerProcessObserver(IProcessObserver observer) throws RemoteException {
  2. Parcel data = Parcel.obtain();
  3. Parcel reply = Parcel.obtain();
  4. data.writeInterfaceToken(IActivityManager.descriptor);
  5. data.writeStrongBinder(observer != null ? observer.asBinder() : null);
  6. mRemote.transact(REGISTER_PROCESS_OBSERVER_TRANSACTION, data, reply, 0);
  7. reply.readException();
  8. data.recycle();
  9. reply.recycle();
  10. }

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

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

该类中有三个方法:

  1. private IProcessObserver mProcessObserver = new IProcessObserver.Stub() {
  2.  
  3. @Override
  4. public void onForegroundActivitiesChanged(int pid, int uid, boolean foregroundActivities) {
  5. Log.i(TAG, "onForegroundActivitiesChanged: pid " + pid + " uid " + uid);
  6. }
  7.  
  8. @Override
  9. public void onProcessDied(int pid, int uid) {
  10. Log.i(TAG, "onProcessDied: pid " + pid + " uid " + uid);
  11. }
  12.  
  13. @Override
  14. public void onImportanceChanged(int pid, int uid, int importance)
  15. throws RemoteException {
  16.  
  17. }
  18. };

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

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

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

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

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

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

  1. public void moniterAppProcess() {
  2.  
  3. try {
  4.  
  5. Class<?> activityManagerNative = Class.forName("android.app.ActivityManagerNative");
  6. Method getDefaultMethod = activityManagerNative.getMethod("getDefault");
  7. Object iActivityManager = getDefaultMethod.invoke((Object[]) null, (Object[]) null);
  8. if (iActivityManager != null) {
  9.  
  10. Method registerMethod = activityManagerNative.getMethod("registerProcessObserver", new Class[]{IProcessObserver.class});
  11.  
  12. registerMethod.invoke(iActivityManager, mProcessObserver);
  13.  
  14. }
  15.  
  16. } catch (Exception e) {
  17. e.printStackTrace();
  18. }
  19. }

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

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

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

  1. <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. Openstack官网文档简介

    OpenStack documentation相关文档见 docs.openstack.org. 主要包含这些方面的文档: Installation Guides Deployment Guides ...

  2. pymysql的使用与参数简要

    pymysql.Connect()参数说明 host(str): MySQL服务器地址 port(int): MySQL服务器端口号 user(str): 用户名 passwd(str): 密码 db ...

  3. phpldapadmin操作指导

    1.在浏览器中打开http://IP/phpldapadmin 2. 点击[Login]按钮,输入管理员密码. 3.点击[创建新条目]. 4. 点击[Generic: Postfix Group]. ...

  4. mysql查询今天、昨天、上周

    mysql查询今天.昨天.上周 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE ...

  5. MongoDB AUTH结果验证

      创建超级管理员和普通用户 #创建超级管理员 super db.createUser( { user: "super", pwd: "super", role ...

  6. YAML基础语法

    正如YAML所表示的YAML Ain’t Markup Language,YAML 是一种简洁的非标记语言.YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读. 一边学习规则 ...

  7. STL 小白学习(2) string

    #include <iostream> using namespace std; #include <string> //初始化操作 void test01() { //初始化 ...

  8. 201621123075 week8-集合

    1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1. ArrayList代码分析 1.1 解释ArrayList的contains源代码 indexOf中对 ...

  9. windows下《Go Web编程》之Go命令

    Go命令: go build 用于编译代码,默认会编译当前目录下的所以go文件.若只需编译某个文件,go build后加上文件名,如go build a.go. go build会忽略目录下以“_”或 ...

  10. Django--filter(**kwargs)

    Django--filter(**kwargs)-exclude(**kwargs) filter() 说明: 数据的过滤 返回Queryset包含与给定查找参数匹配的新对象.这里需要特别注意的地方就 ...