從ActivityManagerNative看Android系統(tǒng)AIDL的實(shí)現(xiàn)

作者Blog


看這個(gè)之前,可以先去看看大神對于Binder機(jī)制的分析,在這里附上地址

了解Binder機(jī)制


看完之后,再來看IActivityManager,ActivityManagerNative,ActivityManagerService這三者之間的關(guān)系。

IActivityManager:這就相當(dāng)于AIDL中定義的接口,其中包括三個(gè)部分

public interface IActivityManager extends IInterface{
// 省略一大波代碼
}
  1. 對該接口的完整類名描述
String descriptor = "android.app.IActivityManager";
  1. 接口方法定義
public int startActivity(/*參數(shù)忽略*/) throws RemoteException;
// 此處省略N條方法定義
  1. 接口方法的transaction code(后面有用到的)定義
int START_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
// 此處省略N條transaction code定義

ActivityManagerNative:接口的Binder機(jī)制實(shí)現(xiàn)類,NOTICE:并沒有實(shí)現(xiàn)IActivityManager中定義的方法,這個(gè)后面再說;這里面分為兩部分

  1. ActivityManagerNative (對應(yīng)AIDL生成的Stub類)
public abstract class ActivityManagerNative extends Binder implements IActivityManager{
    // 1 . 構(gòu)造函數(shù)
    public ActivityManagerNative() {    
        attachInterface(this, descriptor);
    }
    // 2 . asInterface函數(shù),轉(zhuǎn)換Binder對象到Interface,有些情況會生成代理對象
    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);
}
    // 3 . onTransact函數(shù),通過code(這個(gè)code就是之前在IActivityManager中定義的transaction code)
//     找到對應(yīng)的方法,進(jìn)行調(diào)用
    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
        throws RemoteException {
          // 省略一小撮代碼
  }
// 4 . asBinder函數(shù),返回Binder對象,就是自己
public IBinder asBinder() {
    return this;
}
// 省略一大波代碼
}
  1. ActivityManagerProxy(對應(yīng)Stub的內(nèi)部類Proxy)
class ActivityManagerProxy implements IActivityManager{
//  遠(yuǎn)程Binder對象
private IBinder mRemote;
// 1. 構(gòu)造函數(shù)
public ActivityManagerProxy(IBinder remote){
    mRemote = remote;
}
// 2. asBinder函數(shù),返回遠(yuǎn)程Binder對象
public IBinder asBinder(){
    return mRemote;
}
// 3. 代理對象的接口的實(shí)現(xiàn)
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
        String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException{
                 //  代碼省略,不多,可以去看看源碼
}
// 其他方法實(shí)現(xiàn)省略,大同小異
代理對象接口的實(shí)現(xiàn)基本都差不多,分為這三部分
1. 拿到data
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.write...(...);
2. 調(diào)用方法
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
3. 返回結(jié)果
reply.readException();
int result = reply.readInt();
reply.recycle();
data.recycle();
return result;

ActivityManagerService:這個(gè)才是接口定義方法的真正實(shí)現(xiàn)類

public final class ActivityManagerService extends ActivityManagerNative 
       implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
public final int startActivity(IApplicationThread caller, String callingPackage,
     Intent intent, String resolvedType, IBinder resultTo,  String resultWho,
     int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options)
       throws RemoteException{
     //  代碼省略......
}
}

接下來就看你了,可以自己去用Android Studio寫一個(gè)AIDL看看生成的類,整個(gè)的結(jié)構(gòu)基本上是差不多的

作者Blog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容