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
android 监控应用进程的更多相关文章
- android 监控软键盘确定 搜索 按钮并赋予点击事件
在android的实践开发中,为了界面的美观,往往那些搜索框并没有带搜索按钮,而是调用了软键盘的搜索按钮,完成这次时间 1 2 好吧!直接上代码! <EditText android:id=&q ...
- Android 监控网络状态
public static boolean isNetworkAvailable(Context context) { ConnectivityManager connectivity = (Conn ...
- Android,监控ContentProvider的数据改变
有时候应用中需要监听ContentProvider的改变并提供响应,这时候就要利用ContentObserver类了 不管是ContentProvider中实现的,insert,delete,upda ...
- Android中判断网络连接是否可用及监控网络状态
Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android ...
- Android网络状态监控
Android 监控网络状态 在Android网络应用程序开发中,经常要判断网络连接是否可用,因此经常有必要监听网络状态的变化.android的网络状态监听可以用BroadcastReceiver来接 ...
- Android内存泄露调试
Android 内存泄漏调试 一.概述 如果我们编写的代码当中有太多的对内存使用不当的地方,难免会使得我们的设备运行缓慢,甚至是死机.为了能够使得 Android 应用程序安全且快速的运行, Andr ...
- Android网络连接判断与处理
博客分类: Android 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android ...
- 6、android 网络编程
1.基于socket的用法 服务器端: 先启动一个服务器端的socket ServerSocket svr = new ServerSocket(8989); 开始侦听请求 Socket s ...
- android 内存泄露调试
一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) ...
随机推荐
- ionic调用手机系统的拨打电话
android调用如下: 在config.xml中添加 <access origin="tel:*" launch-external="yes" /> ...
- hdoj4685
数据: /*999993 43 1 2 42 2 32 3 4*/ #include <iostream> #include <cstdio> #include <cma ...
- start-dfs.sh 启动成功 datanode未启动
在namenode中启动报错 test2: Exception in thread "main" java.net.UnknownHostException: unknown ho ...
- 『TensorFlow』slim模块常用API
辅助函数 slim.arg_scope() slim.arg_scope可以定义一些函数的默认参数值,在scope内,我们重复用到这些函数时可以不用把所有参数都写一遍,注意它没有tf.variable ...
- grpc(三)之grpc客户端使用连接池
本文使用commons-pool2来实现连接池应用 1.定义一个产生连接池的工厂,需要继承BasePooledObjectFactory,其用处是生产和销毁连接池中保存的对象.根据需求,现在池子里保存 ...
- icpc2018-焦作-D-几何模拟
https://nanti.jisuanke.com/t/34142 上午可能是供氧不足,推的式子死活不对,晚上莫名其妙又来了一次就过了. 分两种情况讨论,如果能够完全进入弯道答案就是固定的就是: s ...
- Shell 与正则表达式part1
1.什么是shell? shell代表两个层面的意思,一个是命令解释器,比如:BASH,另外一个是shell脚本(利用shell的功能所写的一个程序,这个程序是使用纯文本文件,将一些shell的语法与 ...
- apache配置,apache直接打开文件而不下载问题
apache什么用,如何下载的上面就不说了,apache的配置是一个非常复杂的工作,下面介绍最基本的apache配置吧,再介绍配置文件管理系统. 安装过后需修改配置: 修改httpd.conf配置文件 ...
- 初见《构建之法》orz……
作为一个大二的计科狗,还是对软件设计有些懵,尽管之前学习过软件工程,但并没有掌握,突如其来的软件设计实践,让我着实傻眼. 通过消息得知,要学习<构建之法>,就去搜了一下,它是以实践为基础的 ...
- JS类小功能
工作中,总是要处理一些前端的小功能.都是网上搜的JS脚本 <script> //防止页面后退 history.pushState(null, null, document.URL); wi ...