在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,屬於第三方且沒有系統簽名是怎么做到的呢?期待大家交流!!!