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

来源:互联网 发布:s7下不了软件 编辑:程序博客网 时间:2024/05/07 09:49


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

1.ActivityManagerNative

先来看ActivityManagerNative:

public abstract class ActivityManagerNative extends Binder implements IActivityManager{    /**     * Cast a Binder object into an activity manager interface, generating     * a proxy if needed.     */    static public IActivityManager asInterface(IBinder obj) {        if (obj == null) {            return null;        }        IActivityManager in =            (IActivityManager)obj.queryLocalInterface(descriptor);        if (in != null) {            return in;        }        return new ActivityManagerProxy(obj);    }    /**     * Retrieve the system's default/global activity manager.     */    static public IActivityManager getDefault() {        return gDefault.get();    }

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

    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {        protected IActivityManager create() {            IBinder b = ServiceManager.getService("activity");            if (false) {                Log.v("ActivityManager", "default service binder = " + b);            }            IActivityManager am = asInterface(b);            if (false) {                Log.v("ActivityManager", "default service = " + am);            }            return am;        }    };

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

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

    @Override    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)            throws RemoteException {        switch (code) {        case START_ACTIVITY_TRANSACTION:        {            data.enforceInterface(IActivityManager.descriptor);            IBinder b = data.readStrongBinder();            IApplicationThread app = ApplicationThreadNative.asInterface(b);            String callingPackage = data.readString();            Intent intent = Intent.CREATOR.createFromParcel(data);            String resolvedType = data.readString();            IBinder resultTo = data.readStrongBinder();            String resultWho = data.readString();            int requestCode = data.readInt();            int startFlags = data.readInt();            ProfilerInfo profilerInfo = data.readInt() != 0                    ? ProfilerInfo.CREATOR.createFromParcel(data) : null;            Bundle options = data.readInt() != 0                    ? Bundle.CREATOR.createFromParcel(data) : null;            int result = startActivity(app, callingPackage, intent, resolvedType,                    resultTo, resultWho, requestCode, startFlags, profilerInfo, options);            reply.writeNoException();            reply.writeInt(result);            return true;        }............

2. ActivityManager

下面我们再来看看ActivityManager类:

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

    public void forceStopPackageAsUser(String packageName, int userId) {        try {            ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);        } catch (RemoteException e) {        }    }

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


3. ActivityManagerProxy

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

class ActivityManagerProxy implements IActivityManager{    public ActivityManagerProxy(IBinder remote)    {        mRemote = remote;//这个就是从ServiceManger获取的IBinder    }    public IBinder asBinder()    {        return mRemote;    }......public void forceStopPackage(String packageName, int userId) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();data.writeInterfaceToken(IActivityManager.descriptor);data.writeString(packageName);data.writeInt(userId);mRemote.transact(FORCE_STOP_PACKAGE_TRANSACTION, data, reply, 0);//远程调用,然后就到ActivityManagerNative的onTranct函数中处理了。reply.readException();data.recycle();reply.recycle();    }.....}


4. IActivityManager

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

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

public interface IActivityManager extends IInterface {    public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,            String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,            ProfilerInfo profilerInfo, Bundle options) throws RemoteException;    public int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent,            String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,..........int HANDLE_APPLICATION_CRASH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;    int START_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;    int UNHANDLED_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;    int OPEN_CONTENT_URI_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;    // Remaining non-native transaction codes.    int FINISH_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+10;    int REGISTER_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+11;    int UNREGISTER_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+12;    int BROADCAST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+13;    int UNBROADCAST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+14;    int FINISH_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+15;    int ATTACH_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+16;    int ACTIVITY_IDLE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+17;    int ACTIVITY_PAUSED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+18;    int ACTIVITY_STOPPED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+19;    int GET_CALLING_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+20;    int GET_CALLING_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+21;    int GET_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+22;    int MOVE_TASK_TO_FRONT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+23;    int MOVE_TASK_TO_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+24;    int MOVE_TASK_BACKWARDS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+25;    int GET_TASK_FOR_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+26;..........}

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


5. ActivityManagerService

最后来看看ActivityManagerService的实现:

public final class ActivityManagerService extends ActivityManagerNative..... {.....    @Override    public void forceStopPackage(final String packageName, int userId) {        if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)                != PackageManager.PERMISSION_GRANTED) {            String msg = "Permission Denial: forceStopPackage() from pid="                    + Binder.getCallingPid()                    + ", uid=" + Binder.getCallingUid()                    + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;            Slog.w(TAG, msg);            throw new SecurityException(msg);        }        final int callingPid = Binder.getCallingPid();        userId = handleIncomingUser(callingPid, Binder.getCallingUid(),                userId, true, ALLOW_FULL_ONLY, "forceStopPackage", null);        long callingId = Binder.clearCallingIdentity();        try {            IPackageManager pm = AppGlobals.getPackageManager();            synchronized(this) {                int[] users = userId == UserHandle.USER_ALL                        ? getUsersLocked() : new int[] { userId };                for (int user : users) {                    int pkgUid = -1;                    try {                        pkgUid = pm.getPackageUid(packageName, user);                    } catch (RemoteException e) {                    }                    if (pkgUid == -1) {                        Slog.w(TAG, "Invalid packageName: " + packageName);                        continue;                    }                    try {                        pm.setPackageStoppedState(packageName, true, user);                    } catch (RemoteException e) {                    } catch (IllegalArgumentException e) {                        Slog.w(TAG, "Failed trying to unstop package "                                + packageName + ": " + e);                    }                    if (isUserRunningLocked(user, false)) {                        forceStopPackageLocked(packageName, pkgUid, "from pid " + callingPid);                    }                }            }        } finally {            Binder.restoreCallingIdentity(callingId);        }    }....}
ActivityManagerService继承了ActivityManagerNative类,因此也实现了forceStopPackage接口。ActivityMangerProxy远程调用后,到了ActivityManagerNative的onTransact函数,然后调用到forceStopPackage接口,因为最后再ActivityManagerService实现了这个接口所以最后就到ActivityManagerService中来了。


1 1