ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)

来源:互联网 发布:kcf跟踪算法 编辑:程序博客网 时间:2024/04/26 19:55

原址:http://blog.csdn.net/kc58236582/article/details/50394905

由于ActivityManagerService没有使用aidl机制,因此就直接用了代码实现看上去复杂了一些,下面我们来理下ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系。

1.ActivityManagerNative

先来看ActivityManagerNative:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public abstract class ActivityManagerNative extends Binder implements IActivityManager  
  2. {  
  3.     /** 
  4.      * Cast a Binder object into an activity manager interface, generating 
  5.      * a proxy if needed. 
  6.      */  
  7.     static public IActivityManager asInterface(IBinder obj) {  
  8.         if (obj == null) {  
  9.             return null;  
  10.         }  
  11.         IActivityManager in =  
  12.             (IActivityManager)obj.queryLocalInterface(descriptor);  
  13.         if (in != null) {  
  14.             return in;  
  15.         }  
  16.   
  17.         return new ActivityManagerProxy(obj);  
  18.     }  
  19.   
  20.     /** 
  21.      * Retrieve the system's default/global activity manager. 
  22.      */  
  23.     static public IActivityManager getDefault() {  
  24.         return gDefault.get();  
  25.     }  

其实这个类是一个Binder通信类,相当于IPowerManager.Java就是实现了IPowerManager.aidl,我们再来看看getDefault这个函数

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {  
  2.     protected IActivityManager create() {  
  3.         IBinder b = ServiceManager.getService("activity");  
  4.         if (false) {  
  5.             Log.v("ActivityManager""default service binder = " + b);  
  6.         }  
  7.         IActivityManager am = asInterface(b);  
  8.         if (false) {  
  9.             Log.v("ActivityManager""default service = " + am);  
  10.         }  
  11.         return am;  
  12.     }  
  13. };  

而gDefault.get()返回的就是IActivityManager,如果实在客户端调用就是返回的ActivityManagerProxy。

而当远程调用过来后,ActivityManagerNative会在onTransact中处理:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1.   @Override  
  2.   public boolean onTransact(int code, Parcel data, Parcel reply, int flags)  
  3.           throws RemoteException {  
  4.       switch (code) {  
  5.       case START_ACTIVITY_TRANSACTION:  
  6.       {  
  7.           data.enforceInterface(IActivityManager.descriptor);  
  8.           IBinder b = data.readStrongBinder();  
  9.           IApplicationThread app = ApplicationThreadNative.asInterface(b);  
  10.           String callingPackage = data.readString();  
  11.           Intent intent = Intent.CREATOR.createFromParcel(data);  
  12.           String resolvedType = data.readString();  
  13.           IBinder resultTo = data.readStrongBinder();  
  14.           String resultWho = data.readString();  
  15.           int requestCode = data.readInt();  
  16.           int startFlags = data.readInt();  
  17.           ProfilerInfo profilerInfo = data.readInt() != 0  
  18.                   ? ProfilerInfo.CREATOR.createFromParcel(data) : null;  
  19.           Bundle options = data.readInt() != 0  
  20.                   ? Bundle.CREATOR.createFromParcel(data) : null;  
  21.           int result = startActivity(app, callingPackage, intent, resolvedType,  
  22.                   resultTo, resultWho, requestCode, startFlags, profilerInfo, options);  
  23.           reply.writeNoException();  
  24.           reply.writeInt(result);  
  25.           return true;  
  26.       }  
  27.   
  28.   
  29. ............  

2. ActivityManager

下面我们再来看看ActivityManager类:

比如我们看下强制stop应用的接口:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public void forceStopPackageAsUser(String packageName, int userId) {  
  2.     try {  
  3.         ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);  
  4.     } catch (RemoteException e) {  
  5.     }  
  6. }  

在里面调用了ActivityManagerNative.getDefault().forceStopPackage,而前面说过在客户端调用ActivityManagerNative.getDefault()返回的是ActivityManagerProxy。


3. ActivityManagerProxy

因此我们再看看ActivityManagerProxy这个类。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. class ActivityManagerProxy implements IActivityManager  
  2. {  
  3.     public ActivityManagerProxy(IBinder remote)  
  4.     {  
  5.         mRemote = remote;//这个就是从ServiceManger获取的IBinder  
  6.     }  
  7.   
  8.     public IBinder asBinder()  
  9.     {  
  10.         return mRemote;  
  11.     }  
  12.       
  13.     ......  
  14.       
  15.     public void forceStopPackage(String packageName, int userId) throws RemoteException {  
  16.         Parcel data = Parcel.obtain();  
  17.         Parcel reply = Parcel.obtain();  
  18.         data.writeInterfaceToken(IActivityManager.descriptor);  
  19.         data.writeString(packageName);  
  20.         data.writeInt(userId);  
  21.         mRemote.transact(FORCE_STOP_PACKAGE_TRANSACTION, data, reply, 0);//远程调用,然后就到ActivityManagerNative的onTranct函数中处理了。  
  22.         reply.readException();  
  23.         data.recycle();  
  24.         reply.recycle();  
  25.     }  
  26.     .....  
  27. }  


4. IActivityManager

下面我们看下FORCE_STOP_PACKAGE_TRANSACTION这个变量如何来的

在IActivityManager中不但定义了接口,也定义了FORCE_STOP_PACKAGE_TRANSACTION这类值。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public interface IActivityManager extends IInterface {  
  2.     public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,  
  3.             String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,  
  4.             ProfilerInfo profilerInfo, Bundle options) throws RemoteException;  
  5.     public int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent,  
  6.             String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,  
  7.               
  8.             ..........  
  9.               
  10.               
  11.     int HANDLE_APPLICATION_CRASH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;  
  12.     int START_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;  
  13.     int UNHANDLED_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;  
  14.     int OPEN_CONTENT_URI_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;  
  15.   
  16.     // Remaining non-native transaction codes.  
  17.     int FINISH_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+10;  
  18.     int REGISTER_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+11;  
  19.     int UNREGISTER_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+12;  
  20.     int BROADCAST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+13;  
  21.     int UNBROADCAST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+14;  
  22.     int FINISH_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+15;  
  23.     int ATTACH_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+16;  
  24.     int ACTIVITY_IDLE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+17;  
  25.     int ACTIVITY_PAUSED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+18;  
  26.     int ACTIVITY_STOPPED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+19;  
  27.     int GET_CALLING_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+20;  
  28.     int GET_CALLING_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+21;  
  29.     int GET_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+22;  
  30.     int MOVE_TASK_TO_FRONT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+23;  
  31.     int MOVE_TASK_TO_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+24;  
  32.     int MOVE_TASK_BACKWARDS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+25;  
  33.     int GET_TASK_FOR_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+26;  
  34. ..........  
  35. }  

我们仔细观察其实这个类和普通的aidl文件实现后几乎一样。


5. ActivityManagerService

最后来看看ActivityManagerService的实现:

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. public final class ActivityManagerService extends ActivityManagerNative..... {  
  2. .....  
  3.   
  4.   
  5.     @Override  
  6.     public void forceStopPackage(final String packageName, int userId) {  
  7.         if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)  
  8.                 != PackageManager.PERMISSION_GRANTED) {  
  9.             String msg = "Permission Denial: forceStopPackage() from pid="  
  10.                     + Binder.getCallingPid()  
  11.                     + ", uid=" + Binder.getCallingUid()  
  12.                     + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;  
  13.             Slog.w(TAG, msg);  
  14.             throw new SecurityException(msg);  
  15.         }  
  16.         final int callingPid = Binder.getCallingPid();  
  17.         userId = handleIncomingUser(callingPid, Binder.getCallingUid(),  
  18.                 userId, true, ALLOW_FULL_ONLY, "forceStopPackage"null);  
  19.         long callingId = Binder.clearCallingIdentity();  
  20.         try {  
  21.             IPackageManager pm = AppGlobals.getPackageManager();  
  22.             synchronized(this) {  
  23.                 int[] users = userId == UserHandle.USER_ALL  
  24.                         ? getUsersLocked() : new int[] { userId };  
  25.                 for (int user : users) {  
  26.                     int pkgUid = -1;  
  27.                     try {  
  28.                         pkgUid = pm.getPackageUid(packageName, user);  
  29.                     } catch (RemoteException e) {  
  30.                     }  
  31.                     if (pkgUid == -1) {  
  32.                         Slog.w(TAG, "Invalid packageName: " + packageName);  
  33.                         continue;  
  34.                     }  
  35.                     try {  
  36.                         pm.setPackageStoppedState(packageName, true, user);  
  37.                     } catch (RemoteException e) {  
  38.                     } catch (IllegalArgumentException e) {  
  39.                         Slog.w(TAG, "Failed trying to unstop package "  
  40.                                 + packageName + ": " + e);  
  41.                     }  
  42.                     if (isUserRunningLocked(user, false)) {  
  43.                         forceStopPackageLocked(packageName, pkgUid, "from pid " + callingPid);  
  44.                     }  
  45.                 }  
  46.             }  
  47.         } finally {  
  48.             Binder.restoreCallingIdentity(callingId);  
  49.         }  
  50.     }  
  51. ....  
  52.   
  53. }  
ActivityManagerService继承了ActivityManagerNative类,因此也实现了forceStopPackage接口。ActivityMangerProxy远程调用后,到了ActivityManagerNative的onTransact函数,然后调用到forceStopPackage接口,因为最后再ActivityManagerService实现了这个接口所以最后就到ActivityManagerService中来了。
0 0
原创粉丝点击