1.大致了解Binder的调用过程:Android学习笔记--Binder
如果一个服务需要通过binder机制对外提供跨进程的接口,需要做下面这些事情。
(1) 第一步,需要为这个接口定义一个继承自IInterface的接口类,假设叫做IMyService。
(2) 第二步,需要定义两个binder类,其中一个是代理类BpMyService,需继承自BpInterface;另一个是实现类BnMyService,需继承自BnInterface。
(3) 第三步,定义BnMyService的子类,这个子类可以是任何名字,比如就叫MyService,在其中真正实现接口所提供的各个函数。
(4) 第四步,创建MyService的实例,注册到服务管理器(如IMediaPlayerService),也可以在其它接口的函数中创建(如上面的IMediaPlayer)。
2.参考文章:Android深入浅出之Binder机制
以MediaServer注册MediaPlayerService来分析进程间通信。
1.首先打开binder设备
2.通过defaultServiceManager来返回一个new IserviceManager,应该是注册的意思
3.通过MediaPlayerService::instantiate();来添加service到ServiceManager中去。实际上调用的是BpServiceManager中的addService,addService通过进程间通信传递到BnSercieManager,实际执行是在ServiceManager.c中。
int main(int argc, char** argv)
{
sp<ProcessState> proc(ProcessState::self());//获取ProcessState实例,主要作用就是打开dev/binder设备(open_dirver)
sp<IServiceManager> sm = defaultServiceManager();
LOGI("ServiceManager: %p", sm.get());
//add for coredump .check only in debug mode
{
char value[PROPERTY_VALUE_MAX];
property_get("ro.debuggable", value, "0");
if(value[0] == '1' )
{
struct rlimit rl;
rl.rlim_cur = -1;
rl.rlim_max = -1;
setrlimit(4,&rl);
}
}
VolumeManager::instantiate(); // volumemanager have to be started before audioflinger
AudioFlinger::instantiate();
MediaPlayerService::instantiate();
CameraService::instantiate();
AudioPolicyService::instantiate();
ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
2.defaultServiceManager()
sp<IServiceManager> defaultServiceManager()
{
if (gDefaultServiceManager != NULL) return gDefaultServiceManager;
{
AutoMutex _l(gDefaultServiceManagerLock);
if (gDefaultServiceManager == NULL) {
gDefaultServiceManager = interface_cast<IServiceManager>(
ProcessState::self()->getContextObject(NULL));
}
}
return gDefaultServiceManager;
}
1.ProcessState::self()->getContextObject(NULL)相当于 newBpBinder(0);
2.interface_cast<IServiceManager>()的实质是 return IServiceManager:asInterface(obj);
3.
binder的实质意义就是让两个进程通信。
3.JAVA层binder调用
int register_android_os_Binder(JNIEnv* env)
{
if (int_register_android_os_Binder(env) < 0)//初始化java Binder与Native的关系
return -1;
if (int_register_android_os_BinderInternal(env) < 0)//BinderInternal与Native的关系
return -1;
if (int_register_android_os_BinderProxy(env) < 0)//BinderProxy与Native的关系
return -1;
if (int_register_android_os_Parcel(env) < 0)//Parcel与Native的关系
return -1;
return 0;
}
static int int_register_android_os_Binder(JNIEnv* env)
{
jclass clazz;
clazz = env->FindClass(kBinderPathName);//kBinderPathName为java类binder的全路径名 为“android/os/Binder”
LOG_FATAL_IF(clazz == NULL, "Unable to find class android.os.Binder");
//gBinderOffsets保存一些Binder类在JNI中使用的数据
gBinderOffsets.mClass = (jclass) env->NewGlobalRef(clazz);
gBinderOffsets.mExecTransact
= env->GetMethodID(clazz, "execTransact", "(IIII)Z");
assert(gBinderOffsets.mExecTransact);
gBinderOffsets.mObject
= env->GetFieldID(clazz, "mObject", "I");
assert(gBinderOffsets.mObject);
return AndroidRuntime::registerNativeMethods(
env, kBinderPathName,
gBinderMethods, NELEM(gBinderMethods));
}
框架的初始化就是获取一些JNI层的一些信息。
2.
public static void setSystemProcess() { //将AMS注册到ServiceManager中去
ActivityManagerService m = mSelf;
ServiceManager.addService("activity", m);}
java层的service是如何在SM中注册的??