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 (三) ...
随机推荐
- 『TensorFlow』读书笔记_Inception_V3_下
极为庞大的网络结构,不过下一节的ResNet也不小 线性的组成,结构大体如下: 常规卷积部分->Inception模块组1->Inception模块组2->Inception模块组3 ...
- 『OpenCV3』滤波器实现及使用滤波器降噪
一.滤波器实现 我们实现这样一个基于拉普拉斯算子的滤波器核心,并使用它进行滤波,这可以做到锐化图像的效果, 0 -1 0 -1 5 -1 0 -1 0 首先我们完全手动的进行滤波,依赖指针操作, vo ...
- phpldapadmin操作指导
1.在浏览器中打开http://IP/phpldapadmin 2. 点击[Login]按钮,输入管理员密码. 3.点击[创建新条目]. 4. 点击[Generic: Postfix Group]. ...
- EF连接Sqlserver2014,使用DBGeography时提示无法加载sqlserverspatial.dll
(1)确认你要使用的SqlServer版本,如果是2014,就要在nuget中添加microsoft.sqlserver.types.dll,使用12.0.4100.1这个版本,它会自动添加sqlse ...
- Elasticsearch5.5安装部署
一 ES基础知识介绍 Near Reamtime(NRT) Elasticsearch 是一个实时的查询平台,从索引数据开始到索引数据结束几乎是1s的时间 Cluster 集群是一个或多个节点的集合, ...
- css 常用布局
「前端那些事儿」③ CSS 布局方案 我们在日常开发中经常遇到布局问题,下面罗列几种常用的css布局方案 话不多说,上代码! 居中布局 以下居中布局均以不定宽为前提,定宽情况包含其中 1.水平居中 a ...
- Daily record-September
September11. I feel much more reassured when I've been for a health check. 体检之后我感到放心多了.2. The diseas ...
- 架构之路:nginx与IIS服务器搭建集群实现负载均衡(二)
[前言] 在<架构之路:nginx与IIS服务器搭建集群实现负载均衡(一)>中小编简单的讲解了Nginx的原理!俗话说:光说不练假把式.接下来,小编就和大家一起来做个小Demo来体会一下N ...
- [Codeforces440D]Berland Federalization
Problem 给你一棵树,最少删掉哪些边,能使得余下的至少有1个大小刚好为k的残树. 1 ≤ k ≤ n ≤ 400 Solution 用f[i][j]表示以i为根有j个节点的最少删边数量 因为此题 ...
- <转载> 从算法上解读自动驾驶是如何实现的?
科技新闻小鹏汽车2016-03-28 10:42 [摘要]车辆路径规划问题中路网模型.路径规划算法和交通信息的智能预测为关键点. 由于驾驶员的驾驶工作繁重,同时随着汽车拥有量的增加,非职业驾驶员的数 ...