6
回答
关于BnServiceManager的一个问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

@邓凡平 你好,想跟你请教个问题:

BpServiceManager调用addService之后,经过一系列的操作,最终会在BnServiceManager中的onTransact中响应,这里通过响应的指令ADD_SERVICE_TRANSACTION会进行下面的操作

string16 which = data.readString16();

sp<IBinder> b = data.readStrongBinder();

status_t err = addService(which, b);

reply->writeInt32(err);

请问这里的addService在哪实现?

举报
Lemac
发帖于5年前 6回/1K+阅
共有6个答案 最后回答: 5年前

引用来自“邓凡平”的答案

看卷1,样章也有吧
卷1看了。。。没有。。。看了您的卷1我才自己分析到这里的。然后找不到后面的了
--- 共有 3 条评论 ---
邓凡平回复 @Lemac : 麻烦您再把这一章的整体逻辑思路再回想吧。serviceManager是单独一个进程。6.3节说得很清楚了。小伙,佩服你的钻劲,似乎今天用错地方了 呵呵。加油吧。 5年前 回复
Lemac回复 @邓凡平 : 是这样的,您讲的是在waitForResponse中,通过talkWithDriver把addService的指令发送出去,但是发送完成之后,您书里默认通过default分支跳转到了executeCommand,如果走这里的就会走到BnServiceManager。但是我觉得addService这里不一定会走default。 5年前 回复
邓凡平那再认真看看?这个是servicemanager的关键所在,肯定是讲了,而且是单独一节 加油 小伙...就差最后一步了 5年前 回复
您好,我也有你这样的疑惑,我的理解是,ServiceManager的服务端根本没有继承BnServiceManager,它由ServiceManger这个executable文件取代了,不知道我说的对不对哈!

class BnServiceManager : public BnInterface<IServiceManager>
 {
 public:
     virtual status_t    onTransact( uint32_t code,
                                     const Parcel& data,
                                     Parcel* reply,
                                     uint32_t flags = 0);
 };
public interface IServiceManager extends IInterface {
    public void addService(String name, IBinder service) throws RemoteException;
}


在android2.2中有 cmds/runtime/文件夹,里面有继承自BnServiceManager的类BServiceManager,不过这是在模拟器中使用的,其Android.mk文件中有:

ifeq ($(TARGET_SIMULATOR),true)
xxxx

也就是说在真机中BnServiceManager是没有用的.

不过目前在android 4.0中已经没有这段代码了


嗯~后来深入研究了一下,这一块弄的差不多明白啦。。。不过好长时间没看,又忘的差不多啦。。
顶部