zoukankan      html  css  js  c++  java
  • android 监控应用进程

    在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 
     9         @Override
    10         public void onProcessDied(int pid, int uid) {
    11             Log.i(TAG, "onProcessDied: pid " + pid + " uid " + uid);
    12         }
    13 
    14         @Override
    15         public void onImportanceChanged(int pid, int uid, int importance)
    16                 throws RemoteException {
    17             
    18         }
    19     };

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

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

    1 /** {@hide} */
    2 public abstract class ActivityManagerNative extends Binder implements IActivityManager
    3 {
    4    ...
    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 }

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

    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就出大漏洞了;所以你的应用必须是系统级的应用且是使用系统签名的才可以用该方法实现应用的监控

    说了这么多,是不是感觉是废话了!!!!像某些app,属于第三方且没有系统签名是怎么做到的呢?期待大家交流!!!

    转载请注明出处
  • 相关阅读:
    Linux下Fortran多文件编译
    java用poi实现对word读取和修改操作
    SQL DATEDIFF语法及时间函数 Sql 查询当天、本周、本月记录
    深入Java集合学习系列:LinkedHashSet的实现原理
    Log4Net日志
    程序员创业如何才能成功?
    Asp.net 数据采集基类(远程抓取,分解,保存,匹配)
    response.setContentType()的String参数及对应类型
    深入Java集合学习系列:LinkedHashMap的实现原理
    深入Java集合学习系列:HashSet的实现原理
  • 原文地址:https://www.cnblogs.com/successjerry/p/4399817.html
Copyright © 2011-2022 走看看