在閱讀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)圖。

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)圖。

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)