首页
社区
课程
招聘
关于 ActivityManagerProxy中attachApplication的疑问
发表于: 2016-7-4 17:44 5863

关于 ActivityManagerProxy中attachApplication的疑问

2016-7-4 17:44
5863
在看新进程启动时,ActivityThread调用attach函数将binder对象传给AMS时有个疑问

此函数位于 ActivityManagerProxy 中 函数如下
    
public void attachApplication(IApplicationThread app) throws RemoteException  
    {  
        Parcel data = Parcel.obtain();  
        Parcel reply = Parcel.obtain();  
        data.writeInterfaceToken(IActivityManager.descriptor);  
        data.writeStrongBinder(app.asBinder());  
        mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0);  
        reply.readException();  
        data.recycle();  
        reply.recycle();  
    } 


IApplicationThread app 根据老罗和网上的分析应该是 ApplicationThreadProxy对象,
ams通过这个代理对象来和客户端交互
但是跟踪源码发现 app 参数是由下面这句初始化的
ApplicationThread mAppThread = new ApplicationThread();
位于 ActivityThread 成员函数的初始化中,而 ApplicationThread 继承 ApplicationThreadNative,而 ApplicationThreadNative 明显是一个server类型的binder,获取它的代理对象  应该传入一个BinderProxy对象做为参数 并且 调用它的asInterface接口,我并没有看到相应的转化,有人帮忙解惑下面吗?

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 133
活跃值: (587)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
        case ATTACH_APPLICATION_TRANSACTION: {
            data.enforceInterface(IActivityManager.descriptor);
            IApplicationThread app = ApplicationThreadNative.asInterface(
                    data.readStrongBinder());
            if (app != null) {
                attachApplication(app);
            }
            reply.writeNoException();
            return true;
        }


            IApplicationThread app = ApplicationThreadNative.asInterface(
                    data.readStrongBinder());
这一步 因为 传入的参数 是继承Binder类 所以 queryLocalInterface 会返回传入的对象,并不会新建代理对象,不知道哪里分析错了
2016-7-4 18:56
0
雪    币: 133
活跃值: (587)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
3
data.enforceInterface(IActivityManager.descriptor); 导致读取的binder对象 descriptor与原来的不相等 所以asInterface执行下面的代码
new ApplicationThreadProxy(obj);  
但是这个obj是Binder类型   一般的应该是BinderProxy类型,可能是因为ApplicationThread没有注册到ServiceManager,每个进程中的ActivityThread的ApplicationThread只与ams通信就可以了 可以这么理解吗?
2016-7-4 20:42
0
游客
登录 | 注册 方可回帖
返回
//