Binder注冊(cè)與查找


在閱讀Activity組件相關(guān)源碼時(shí),我們經(jīng)??梢钥吹揭韵路椒?。我們知道,App進(jìn)程調(diào)用這些方法與system_server進(jìn)程通信,請(qǐng)求它的Ams服務(wù)。

ActivityManagerNative.getDefault().Xxx()

在system_server進(jìn)程中,運(yùn)行Android的一些系統(tǒng)服務(wù),例如Ams服務(wù)、Wms服務(wù)。每個(gè)App進(jìn)程都要和它們打交道,Activity注冊(cè)、窗體管理等。進(jìn)程間的通信方案主要采用Binder。Binder通信的機(jī)制比較復(fù)雜,依賴Java層、底層以及驅(qū)動(dòng)層。在Java層中,系統(tǒng)框架將這些服務(wù)都抽象成業(yè)務(wù)接口。進(jìn)程通信的兩端都會(huì)實(shí)現(xiàn)這些接口。我們從平時(shí)常見(jiàn)的源碼開(kāi)始,一步步分析Binder的基本原理,本文主要內(nèi)容是Binder的注冊(cè)與查找,先看一下Java層的基礎(chǔ)架構(gòu)。


Java層Binder架構(gòu)

上面代碼提到的getDefault方法。

static public IActivityManager getDefault() {
    return gDefault.get();//返回IActivityManager單例
}

在ActivityManagerNative類(lèi)中,定義一個(gè)IActivityManager類(lèi)型的單例對(duì)象。

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
    protected IActivityManager create() {
        IBinder b = ServiceManager.getService("activity");
        IActivityManager am = asInterface(b);  
        return am;
    }
};

單例創(chuàng)建時(shí),create方法,可以看出,首先,通過(guò)ServiceManager類(lèi)獲取IBinder對(duì)象。然后,調(diào)用ActivityManagerNative的asInterface方法,生成IActivityManager對(duì)象。getDefault方法,獲取該IActivityManager對(duì)象。因此,文章開(kāi)頭所述代碼,客戶端App獲取到IActivityManager對(duì)象,再調(diào)用它的業(yè)務(wù)方法。看一下asInterface方法。

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);
}

該方法創(chuàng)建一個(gè)ActivityManagerProxy,封裝IBinder,它實(shí)現(xiàn)IActivityManager接口。所以,客戶端App使用的其實(shí)是業(yè)務(wù)代理對(duì)象。

class ActivityManagerProxy implements IActivityManager {
    public ActivityManagerProxy(IBinder remote) {
        mRemote = remote;
    }

    public IBinder asBinder() {
        return mRemote;
    }

    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ù)據(jù)
        mRemote.transact;//mRemote的方法。
    }

    public boolean finishActivity(IBinder token, int resultCode, Intent resultData, boolean finishTask)
            throws RemoteException {
        ...
        mRemote.transact;//mRemote的方法。
    }
    ...//其他業(yè)務(wù)方法
    private IBinder mRemote;
}

代理對(duì)象雖然實(shí)現(xiàn)了業(yè)務(wù)方法,但它不關(guān)心具體業(yè)務(wù),只是負(fù)責(zé)打包數(shù)據(jù),然后,調(diào)用內(nèi)部封裝的IBinder與真正的Binder遠(yuǎn)程通信,讓你感覺(jué)到使用遠(yuǎn)端真正的服務(wù)像在本地一樣。下面看一下ActivityManagerNative類(lèi)。

public abstract class ActivityManagerNative extends Binder implements IActivityManager {
    @Override
    public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
            throws RemoteException {
    }
    //未實(shí)現(xiàn)IActivityManager業(yè)務(wù)方法。  
}  

它是一個(gè)抽象類(lèi),繼承Binder類(lèi),未實(shí)現(xiàn)IActivityManager的業(yè)務(wù)方法,重寫(xiě)了Binder的onTransact方法,根據(jù)業(yè)務(wù)code,路由到子類(lèi)具體的業(yè)務(wù)方法中。

public final class ActivityManagerService extends ActivityManagerNative
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
}

ActivityManagerService是ActivityManagerNative的子類(lèi),實(shí)現(xiàn)具體業(yè)務(wù)方法,在system_server進(jìn)程提供Ams服務(wù)。
IActivityManager是業(yè)務(wù)接口,在前面提到過(guò),進(jìn)程兩端都會(huì)實(shí)現(xiàn)該接口,他們分別是ActivityManagerProxy類(lèi)(請(qǐng)求端)和ActivityManagerService類(lèi)(服務(wù)端)。其中,請(qǐng)求端內(nèi)部封裝IBinder,服務(wù)端繼承Binder,他們之間的跨進(jìn)程通信依賴Binder。
在App請(qǐng)求端,通過(guò)ServiceManager類(lèi),獲取IBinder服務(wù),其實(shí)它是一個(gè)BinderProxy代理對(duì)象。通信的發(fā)送和接收位置分別是請(qǐng)求端BinderProxy的transact方法和服務(wù)端onTransact方法。IActivityManager業(yè)務(wù)Java層的Binder通信架構(gòu)圖。

IActivityManager業(yè)務(wù)Java層的Binder通信架構(gòu)圖.jpg
圖中清晰的描述了Java層Binder的通信架構(gòu)。我們從前面知道,ServiceManager類(lèi),根據(jù)字符串查找Binder服務(wù),最終,獲取的是BinderProxy代理對(duì)象,下面看一下Binder服務(wù)的查找過(guò)程。


Binder服務(wù)查找

若要在App中享受system_server進(jìn)程的系統(tǒng)服務(wù),需要獲取到一個(gè)可訪問(wèn)服務(wù)的BinderProxy代理和業(yè)務(wù)代理。業(yè)務(wù)代理的創(chuàng)建前面已經(jīng)介紹過(guò),App進(jìn)程通過(guò)ServiceManager類(lèi)的getService方法獲取服務(wù),所謂服務(wù),其實(shí)就是一個(gè)BinderProxy代理,看一下getService方法。

public static IBinder getService(String name) {
    try {
        IBinder service = sCache.get(name);
        if (service != null) {
            return service;
        } else {
            //獲取BinderProxy,轉(zhuǎn)換成IServiceManager。
            //然后訪問(wèn)業(yè)務(wù)方法getService。
            return getIServiceManager().getService(name);
          }
    } catch (RemoteException e) {
    }
    return null;
}

首先,根據(jù)字符串a(chǎn)ctivity在ServiceManager緩存查找,緩存Map,保存已向sm進(jìn)程查找過(guò)的IBinder對(duì)象。

private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>();

如果未查到,向sm進(jìn)程查詢。前提條件是,system_server進(jìn)程的Ams服務(wù)啟動(dòng)時(shí),已向sm進(jìn)程注冊(cè)。

private static IServiceManager getIServiceManager() {
    if (sServiceManager != null) {
        return sServiceManager;
    }
    // Find the service manager
    sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
    return sServiceManager;
}

我們知道,App進(jìn)程向sm進(jìn)程查詢,也是進(jìn)程間通信,同前面介紹過(guò)的App和system_server進(jìn)程通信類(lèi)似,通信方案依然是Binder。該方法返回IServiceManager業(yè)務(wù)代理對(duì)象,封裝BinderProxy代理。不同的是,其他服務(wù)BinderProxy代理是向sm進(jìn)程查詢來(lái)的,而這個(gè)BinderProxy代理來(lái)自BinderInternal類(lèi)的getContextObject方法,這個(gè)問(wèn)題后續(xù)再看。先看一下ServiceManagerNative的asInterface方法。

static public IServiceManager asInterface(IBinder obj) {
    if (obj == null) {
        return null;
    }
    IServiceManager in =
            (IServiceManager)obj.queryLocalInterface(descriptor);
    if (in != null) {
        return in;
    }
    return new ServiceManagerProxy(obj);
}

創(chuàng)建ServiceManagerProxy,封裝BinderProxy,最后,調(diào)用業(yè)務(wù)getService方法,訪問(wèn)sm進(jìn)程。IServiceManager業(yè)務(wù)Binder通信上層架構(gòu)圖。

IServiceManager業(yè)務(wù)Binder通信上層架構(gòu)圖.jpg
源碼中查找發(fā)現(xiàn),在sm進(jìn)程服務(wù)端,并沒(méi)有一個(gè)類(lèi)似ActivityManagerService的業(yè)務(wù)實(shí)現(xiàn)類(lèi)。在請(qǐng)求端,調(diào)用業(yè)務(wù)代理ServiceManagerProxy的getService方法。

public IBinder getService(String name) throws RemoteException {
    Parcel data = Parcel.obtain();
    Parcel reply = Parcel.obtain();
    data.writeInterfaceToken(IServiceManager.descriptor);
    data.writeString(name);//業(yè)務(wù)參數(shù)寫(xiě)入Parcel
    //底層通信。
    mRemote.transact(GET_SERVICE_TRANSACTION, data, reply, 0);
    IBinder binder = reply.readStrongBinder();
    ...
    return binder;
}

業(yè)務(wù)方法code和參數(shù)打包,調(diào)用BinderProxy的transact方法進(jìn)行通信,sm進(jìn)程讀取到查詢請(qǐng)求時(shí),根據(jù)服務(wù)字符串對(duì)應(yīng)服務(wù)Binder,(sm進(jìn)程的查詢流程,以及為什么沒(méi)有業(yè)務(wù)實(shí)現(xiàn)類(lèi),等寫(xiě)sm源碼相關(guān)時(shí)再分析)。然后,通過(guò)Parcel的readStrongBinder方法,讀取IBinder,它就是我們查找對(duì)應(yīng)服務(wù)的BinderProxy。到這里,Binder服務(wù)查找就結(jié)束了,ServiceManager類(lèi)的代碼比較簡(jiǎn)單。再看一下服務(wù)注冊(cè),與查找類(lèi)似,只是這次的發(fā)起者是system_server進(jìn)程。
下面,我們看一下Parcel的readStrongBinder方法,讀取底層IBinder數(shù)據(jù),它調(diào)用nativeReadStrongBinder方法,下面是對(duì)應(yīng)的JNI#方法。

static jobject android_os_Parcel_readStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr) {
    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
    if (parcel != NULL) {
        return javaObjectForIBinder(env, parcel->readStrongBinder());
    }
    return NULL;
}

首先,底層Parcel的readStrongBinder方法,獲取到底層IBinder,然后,調(diào)用javaObjectForIBinder方法,創(chuàng)建Java層對(duì)象。

sp<IBinder> Parcel::readStrongBinder() const {
    sp<IBinder> val;
    unflatten_binder(ProcessState::self(), *this, &val);
    return val;
}

底層Parcel的方法,它調(diào)用unflatten_binder方法,意思是解析Binder。

status_t unflatten_binder(const sp<ProcessState>& proc,
    const Parcel& in, sp<IBinder>* out) {
    const flat_binder_object* flat = in.readObject(false);
    if (flat) {
        switch (flat->type) {
            case BINDER_TYPE_BINDER:
                *out = reinterpret_cast<IBinder*>(flat->cookie);
                return finish_unflatten_binder(NULL, *flat, in);
            case BINDER_TYPE_HANDLE:
                *out = proc->getStrongProxyForHandle(flat->handle);
                return finish_unflatten_binder(
                    static_cast<BpBinder*>(out->get()), *flat, in);
        }
    }
    return BAD_TYPE;
}

第二個(gè)是當(dāng)前底層Parcel對(duì)象,根據(jù)flat的type類(lèi)型,如果是handle句柄,通過(guò)getStrongProxyForHandle方法解析到第三個(gè)參數(shù)out中,即底層BpBinder類(lèi)。

sp<IBinder> ProcessState::getStrongProxyForHandle(int32_t handle) {
    sp<IBinder> result;
    AutoMutex _l(mLock);
    handle_entry* e = lookupHandleLocked(handle);
    if (e != NULL) {
        IBinder* b = e->binder;
        if (b == NULL || !e->refs->attemptIncWeak(this)) {
            .. .
            b = new BpBinder(handle); //這里創(chuàng)建底層BpBinder。
            e->binder = b;
            ...
        } else {
            result.force_set(b);
            e->refs->decWeak(this);
        }
    }
    return result;
}

這是ProcessState的方法,創(chuàng)建一個(gè)BpBinder,封裝handle。它就是請(qǐng)求進(jìn)程需要的底層BpBinder,handle可以找到對(duì)應(yīng)的目標(biāo)進(jìn)程。
獲取到IBinder后,調(diào)用javaObjectForIBinder方法。

jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) {
    ...
    object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor);
    if (object != NULL) {
        env->SetLongField(object, gBinderProxyOffsets.mObject, (jlong)val.get());
        val->incStrong((void*)javaObjectForIBinder);
        jobject refObject = env->NewGlobalRef(
                env->GetObjectField(object, gBinderProxyOffsets.mSelf));
        //關(guān)聯(lián)結(jié)構(gòu)體地址與BinderProxy引用
        val->attachObject(&gBinderProxyOffsets, refObject,
                jnienv_to_javavm(env), proxy_cleanup);
        ...
    }

    return object;
}

NewObject方法,創(chuàng)建Java層BinderProxy對(duì)象,gBinderProxyOffsets結(jié)構(gòu)體的mClass類(lèi)初始化是android/os/BinderProxy,構(gòu)造器mConstructor初始化init方法。設(shè)置BinderProxy的內(nèi)部mObject引用底層BpBinder。
JNIEnv的SetLongField方法,BinderProxy對(duì)象的變量賦值。
JNIEnv的GetObjectField方法,獲取BinderProxy對(duì)象的mSelf引用,它是BinderProxy弱引用。
JNIEnv的NewGlobal方法,獲取的RefrefObject是全局引用,通過(guò)attachObject方法,將關(guān)聯(lián)結(jié)構(gòu)體地址與BinderProxy引用(RefrefObject),保存在底層BpBinder的mObjects中。

void BpBinder::attachObject(
    const void* objectID, void* object, void* cleanupCookie,
    object_cleanup_func func) {
    AutoMutex _l(mLock);
    mObjects.attach(objectID, object, cleanupCookie, func);
}

調(diào)用mObjects的attach方法。objectID就是結(jié)構(gòu)體gBinderProxyOffsets地址。
最終,javaObjectForIBinder方法,返回一個(gè)Java層BinderProxy代理對(duì)象。我們回到前面nativeReadStrongBinder對(duì)應(yīng)JNI#方法,上層Parcel讀取到的IBinder就是該對(duì)象。
下面我們?cè)倏匆幌翨inderInternal類(lèi)的getContextObject方法,它返回的是訪問(wèn)sm進(jìn)程的BinderProxy對(duì)象。對(duì)應(yīng)的JNI#方法,(android_util_Binder.cpp文件定義)

static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz) {
    sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
    return javaObjectForIBinder(env, b);
}

該方法的邏輯和上面一樣,獲取底層BpBinder,創(chuàng)建Java層BinderProxy對(duì)象,看一下getContextObject方法。

sp<IBinder> ProcessState::getContextObject(const sp<IBinder>& /*caller*/) {
    return getStrongProxyForHandle(0);
}

調(diào)用getStrongProxyForHandle方法,獲取底層BpBinder,這個(gè)方法前面介紹過(guò),它的入?yún)⒕浔鷋andle是0,BpBinder目標(biāo)進(jìn)程就是sm服務(wù)進(jìn)程,sm服務(wù)進(jìn)程句柄為0。

總之,從Parcel中讀取Binder的過(guò)程,本質(zhì)是在底層創(chuàng)建一個(gè)BpBinder,它可以通過(guò)句柄handle找到目標(biāo)進(jìn)程,創(chuàng)建一個(gè)上層BinderProxy對(duì)象。


Binder服務(wù)注冊(cè)

system_server進(jìn)程啟動(dòng)的系統(tǒng)服務(wù),需要向sm進(jìn)程注冊(cè),才可以被App進(jìn)程使用,服務(wù)繼承Binder類(lèi)。我們先看一下服務(wù)創(chuàng)建過(guò)程,從SystemServer的main方法開(kāi)始。

public static void main(String[] args) {
    new SystemServer().run();
}

創(chuàng)建一個(gè)SystemServer對(duì)象,執(zhí)行它的run方法。

private void run() {
    try {
        startBootstrapServices();
        startCoreServices();
        startOtherServices();
    } catch (Throwable ex) {
    }
    Looper.loop();
}

在該方法,這三個(gè)startXxx方法將啟動(dòng)多個(gè)服務(wù),在startBootstrapServices方法中,啟動(dòng)我們的Ams服務(wù)。

private void startBootstrapServices() {
    //獲取ActivityManagerService對(duì)象
    mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
    ...
    mActivityManagerService.setSystemProcess();
}

以上兩個(gè)關(guān)鍵方法,第一個(gè)是SystemServiceManager的startService方法,入?yún)⑹且粋€(gè)class類(lèi),該Class繼承SystemService,startService方法將創(chuàng)建該類(lèi)實(shí)例對(duì)象,Lifecycle是內(nèi)部類(lèi),繼承SystemService。創(chuàng)建該實(shí)例時(shí),會(huì)初始化一個(gè)ActivityManagerService對(duì)象。其他服務(wù)也還是類(lèi)似的創(chuàng)建方式。服務(wù)內(nèi)部類(lèi),一個(gè)繼承SystemService的創(chuàng)建該服務(wù)對(duì)象的類(lèi)。SystemServiceManager就可以提供統(tǒng)一的方法(參數(shù)繼承SystemService泛型)創(chuàng)建服務(wù)。

public static final class Lifecycle extends SystemService {
    private final ActivityManagerService mService;
    public Lifecycle(Context context) {
        super(context);
        mService = new ActivityManagerService(context);
    }
    @Override
    public void onStart() {
        mService.start();
    }
    public ActivityManagerService getService() {
        return mService;
    }
}

ActivityManagerService繼承Binder,在Binder構(gòu)造創(chuàng)建時(shí),觸發(fā)init初始化方法,JNI#方法,底層對(duì)應(yīng)android_os_Binder_init方法。創(chuàng)建一個(gè)底層對(duì)象JavaBBinderHolder,設(shè)置上層Binder的mObject引用。
第二個(gè)關(guān)鍵方法是ActivityManagerService類(lèi)setSystemProcess方法。

public void setSystemProcess() {
    try {
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, true);
        ServiceManager.addService("meminfo", new MemBinder(this));
        ....
    } catch (NameNotFoundException e) {
    }
}

此方法中就有我們比較熟悉的內(nèi)容了,ServiceManager類(lèi),addService方法,注冊(cè)IActivityManager服務(wù),this代表注冊(cè)的服務(wù)是ActivityManagerService對(duì)象。
下面是ServiceManager類(lèi)的addService方法。

public static void addService(String name, IBinder service) {
    try {
        getIServiceManager().addService(name, service, false);
    } catch (RemoteException e) { 
    }
}

該方法和查找服務(wù)getService方法類(lèi)似,也是通過(guò)ServiceManagerProxy業(yè)務(wù)代理和BinderProxy代理和sm進(jìn)程通信。ServiceManagerProxy的addService方法。

public void addService(String name, IBinder service, boolean allowIsolated)
           throws RemoteException {
    Parcel data = Parcel.obtain();
    Parcel reply = Parcel.obtain();
    data.writeInterfaceToken(IServiceManager.descriptor);
    data.writeString(name);
    data.writeStrongBinder(service);
    data.writeInt(allowIsolated ? 1 : 0);
    mRemote.transact(ADD_SERVICE_TRANSACTION, data, reply, 0);
    reply.recycle();
    data.recycle();
}

該方法中,通過(guò)Parcel的writeStrongBinder方法,將Binder服務(wù)寫(xiě)入底層,向sm進(jìn)程注冊(cè)。從查找和注冊(cè)這兩個(gè)方法看,他們傳輸?shù)腜arcel都包含Binder類(lèi)型的數(shù)據(jù)存取。注冊(cè)方法也是IServiceManager的業(yè)務(wù)方法,發(fā)送注冊(cè)請(qǐng)求后,sm進(jìn)程會(huì)處理注冊(cè)的相關(guān)事務(wù)。(同樣,等寫(xiě)sm源碼相關(guān)時(shí)再分析)。
同Binder的查找類(lèi)似,我們也看一下Parcel的writeStrongBinder方法,寫(xiě)入底層Binder數(shù)據(jù),它調(diào)用nativeWriteStrongBinder方法,下面是對(duì)應(yīng)的JNI#方法。

static void android_os_Parcel_writeStrongBinder(JNIEnv* env, jclass clazz, jlong nativePtr, jobject object) {
    Parcel* parcel = reinterpret_cast<Parcel*>(nativePtr);
    if (parcel != NULL) {
        const status_t err = parcel->writeStrongBinder(ibinderForJavaObject(env, object));
        ...
    }
}

首先,ibinderForJavaObject方法,根據(jù)上層傳入的Binder對(duì)象,注意,這里寫(xiě)入Binder,而不是BinderProxy,獲取底層IBinder。

sp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) {
    //返回的是JavaBBinder指針
    if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) {
        JavaBBinderHolder* jbh = (JavaBBinderHolder*)
            env->GetLongField(obj, gBinderOffsets.mObject);
        return jbh != NULL ? jbh->get(env, obj) : NULL;
    }
    //獲取BinderProxy代理的BpBinder引用
    if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) {
        return (IBinder*)
            env->GetLongField(obj, gBinderProxyOffsets.mObject);
    }
    return NULL;
}

gBinderOffsets的mClass類(lèi)初始化android/os/Binder,jobject對(duì)象是上層Binder類(lèi)型時(shí),獲取內(nèi)部mObject引用,該引用在上層Binder對(duì)象初始化是JavaBBinderHolder指針(前面代碼Binder構(gòu)建時(shí)初始化的),它的get方法,獲取的是JavaBBinder指針。它繼承底層BBinder。返回JavaBBinder指針。
然后,調(diào)用底層Parcel的writeStrongBinder方法,將JavaBBinder寫(xiě)入Parcel。

status_t Parcel::writeStrongBinder(const sp<IBinder>& val) {
    return flatten_binder(ProcessState::self(), val, this);
}

和讀取類(lèi)似,寫(xiě)入方法調(diào)用的是flatten_binder方法。

status_t flatten_binder(const sp<ProcessState>& /*proc*/,
    const sp<IBinder>& binder, Parcel* out) {
    flat_binder_object obj;
    obj.flags = 0x7f | FLAT_BINDER_FLAG_ACCEPTS_FDS;
    if (binder != NULL) {
        IBinder *local = binder->localBinder();
        if (!local) {
            BpBinder *proxy = binder->remoteBinder();
            const int32_t handle = proxy ? proxy->handle() : 0;
            obj.type = BINDER_TYPE_HANDLE;
            obj.binder = 0; /* Don't pass uninitialized stack data to a remote process */
            obj.handle = handle;
            obj.cookie = 0;
        } else {
            obj.type = BINDER_TYPE_BINDER;
            obj.binder = reinterpret_cast<uintptr_t>(local->getWeakRefs());
            obj.cookie = reinterpret_cast<uintptr_t>(local);
        }
    } else {
        obj.type = BINDER_TYPE_BINDER;
        obj.binder = 0;
        obj.cookie = 0;
    }
    return finish_flatten_binder(binder, obj, out);
}

寫(xiě)入的是JavaBBinder指針,根據(jù)底層IBinder的localBinder方法判斷,在BBinder類(lèi),重寫(xiě)IBinder的localBinder方法,返回它自己本身。在BpBinder類(lèi),未重寫(xiě)locaBinder方法,返回空。

BBinder* BBinder::localBinder() {
    return this;
}

初始化flat_binder_object結(jié)構(gòu)體,將它的cookie設(shè)置JavaBBinder指針。最后,在finish_flatten_binder方法,將flat_binder_object結(jié)構(gòu)體寫(xiě)入輸出Parcel。

inline static status_t finish_flatten_binder(
    const sp<IBinder>& /*binder*/, const flat_binder_object& flat, Parcel* out) {
    return out->writeObject(flat, false);
}

總之,向Parcel中寫(xiě)入Binder的過(guò)程,本質(zhì)是將底層JavaBBinder保存在flat_binder_object結(jié)構(gòu)體,然后,結(jié)構(gòu)體寫(xiě)入底層Parcel。


總結(jié)

本文主要介紹了三個(gè)部分,Java層Binder通信架構(gòu)、Binder服務(wù)查找、注冊(cè)的流程,在Java層,請(qǐng)求進(jìn)程依賴BinderProxy和業(yè)務(wù)XxxProxy,服務(wù)進(jìn)程依賴Binder和業(yè)務(wù)Xxx服務(wù)。Binder通信架構(gòu)不依賴業(yè)務(wù),用戶可以自己寫(xiě)業(yè)務(wù)接口,利用Binder機(jī)制實(shí)現(xiàn)進(jìn)程間通信,比如aidl。
系統(tǒng)服務(wù)查找和注冊(cè)都需要與sm進(jìn)程通信。一般情況下,注冊(cè)者是服務(wù)提供的system_server進(jìn)程,查找者是App進(jìn)程。
sm進(jìn)程是Binder服務(wù)管理者,Binder服務(wù)需要向它注冊(cè)才可以被使用。
ServiceManager類(lèi),框架層提供的一個(gè)服務(wù)操作類(lèi),可以通過(guò)該類(lèi)提供的addService和getService方法,與sm進(jìn)程通信。該類(lèi)內(nèi)部提供了和sm進(jìn)程通信BinderProxy代理和業(yè)務(wù)代理。
與sm進(jìn)程通信的BinderProxy,由BinderInternal類(lèi)的getContextObject方法獲取。sm進(jìn)程的handle是0。
sm進(jìn)程服務(wù)端,沒(méi)有一個(gè)類(lèi)似ActivityManagerService的業(yè)務(wù)實(shí)現(xiàn)類(lèi)。


任重而道遠(yuǎn)

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

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

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