Java应用程序服务 由Activity Manager Service进行管理
FooManager 是包装类,用来获取FooService的
IFooService.aidl会自动生成IFooService.Stub和IFooService.Stub.Proxy
BinderProxy相当于BpBinder 通过JNI到BpBinder Binder相当于BBinder通过JavaBBinder--Binder
FooManager的foo方法-->BinderProxy.transact(),然后调用android_os_BinderProxy_transact();再调用Bpbinder的transact方法 等于少了Bp类名 和Bn类名 多了一个 服务端多了两个 一个是JavaBBinder和Binder
ServiceManager 也有ServiceManagerProxy 然后是BinderProxy JavaBBinder
register_android_os_Binder BinderInternal是ServiceManager
int_register_android_os_Binder注册Binder
JavaBBinder的对象在JavaBBinderHolder的get方法中创建 b = new JavaBBinder(env, mObject);
private long mObject; 调用BBinder的transact()函数将引起JavaBBinder的onTransact()函数的调用.然后在调用Binder的execTransact()方法 在c++中调用java方法时,使用CallXXXMethod 然后Binder类的ontransact方法会被调用
先由java层的Parcel的readStrongBinder然后调用c++的readStrongBinder函数和javaObjectForBinder.
生成的实例对象保存到Parcel类的mObject变量中 parcelForJavaObject函数 将java的Parcel转换为C++的Parcel
hide 不会编译进SDK中 服务继承aidl编出来的stub类
ContextImpl.java (frameworks\base\core\java\android\app)
(ACCOUNT_SERVICE.equals(name)) {
return getAccountManager();
BinderInternal类提供获取BpBinder对象的功能. 通过其获得getContextObject方法
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b); 返回BpBinder
无论是C++中的BpServiceManager还是Java中的ServiceManager
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
和CPP还有几分相似
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);
}
AIDL编译器自动生成服务接口 oneway不需要应答就可以返回
ActivityThread是Android所有应用程序的主线程
ContextImpl
ComponentName cn = ActivityManagerNative.getDefault().startService(
mMainThread.getApplicationThread()(主叫线程), service,
service.resolveTypeIfNeeded(getContentResolver()));
ActivityManagerNative.getDefault()
IBinder b = ServiceManager.getService("activity");
gDefault = asInterface(b);
new ActivityManagerProxy(obj);
ActivityThread对象的mAppThread变量中保存着ApplicationThread对象,ApplicationThread对象继承自ApplicationThreadNative,只在ActivityThread实例化,它负责从ams中接收binder ipc数据,通过消息队列实现对ActivityThread的控制.
ActivityThread thread = new ActivityThread();
thread.attach(false);
IActivityManager mgr = ActivityManagerNative.getDefault();
mgr.attachApplication(mAppThread);
ATTACH_APPLICATION_TRANSACTION
应用程序请求的服务实际是由ActivityThread生成的. attachApplication这个方法控制
attachApplication
attachApplicationLocked
realStartServiceLocked
app = mPidsSelfLocked.get(pid); zygote生成进程后,返回pid,哈希表 ProcessRecord进程关联
FooManager 是包装类,用来获取FooService的
IFooService.aidl会自动生成IFooService.Stub和IFooService.Stub.Proxy
BinderProxy相当于BpBinder 通过JNI到BpBinder Binder相当于BBinder通过JavaBBinder--Binder
FooManager的foo方法-->BinderProxy.transact(),然后调用android_os_BinderProxy_transact();再调用Bpbinder的transact方法 等于少了Bp类名 和Bn类名 多了一个 服务端多了两个 一个是JavaBBinder和Binder
ServiceManager 也有ServiceManagerProxy 然后是BinderProxy JavaBBinder
register_android_os_Binder BinderInternal是ServiceManager
int_register_android_os_Binder注册Binder
JavaBBinder的对象在JavaBBinderHolder的get方法中创建 b = new JavaBBinder(env, mObject);
private long mObject; 调用BBinder的transact()函数将引起JavaBBinder的onTransact()函数的调用.然后在调用Binder的execTransact()方法 在c++中调用java方法时,使用CallXXXMethod 然后Binder类的ontransact方法会被调用
先由java层的Parcel的readStrongBinder然后调用c++的readStrongBinder函数和javaObjectForBinder.
生成的实例对象保存到Parcel类的mObject变量中 parcelForJavaObject函数 将java的Parcel转换为C++的Parcel
hide 不会编译进SDK中 服务继承aidl编出来的stub类
ContextImpl.java (frameworks\base\core\java\android\app)
(ACCOUNT_SERVICE.equals(name)) {
return getAccountManager();
BinderInternal类提供获取BpBinder对象的功能. 通过其获得getContextObject方法
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{
sp<IBinder> b = ProcessState::self()->getContextObject(NULL);
return javaObjectForIBinder(env, b); 返回BpBinder
无论是C++中的BpServiceManager还是Java中的ServiceManager
sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject());
和CPP还有几分相似
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);
}
AIDL编译器自动生成服务接口 oneway不需要应答就可以返回
ActivityThread是Android所有应用程序的主线程
ContextImpl
ComponentName cn = ActivityManagerNative.getDefault().startService(
mMainThread.getApplicationThread()(主叫线程), service,
service.resolveTypeIfNeeded(getContentResolver()));
ActivityManagerNative.getDefault()
IBinder b = ServiceManager.getService("activity");
gDefault = asInterface(b);
new ActivityManagerProxy(obj);
ActivityThread对象的mAppThread变量中保存着ApplicationThread对象,ApplicationThread对象继承自ApplicationThreadNative,只在ActivityThread实例化,它负责从ams中接收binder ipc数据,通过消息队列实现对ActivityThread的控制.
ActivityThread thread = new ActivityThread();
thread.attach(false);
IActivityManager mgr = ActivityManagerNative.getDefault();
mgr.attachApplication(mAppThread);
ATTACH_APPLICATION_TRANSACTION
应用程序请求的服务实际是由ActivityThread生成的. attachApplication这个方法控制
attachApplication
attachApplicationLocked
realStartServiceLocked
app = mPidsSelfLocked.get(pid); zygote生成进程后,返回pid,哈希表 ProcessRecord进程关联