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

    在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

  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/scarecrow-blog/p/10039353.html
Copyright © 2011-2022 走看看