android框架揭秘之Java服务学习笔记

来源:互联网 发布:cors网络账号怎么获取 编辑:程序博客网 时间:2024/06/16 15:48
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进程关联
0 0
原创粉丝点击