Java层代码分析
2017-02-08 16:27:29 0 举报
由于您没有提供具体的Java代码,我无法为您生成精确的代码分析。但是,我可以为您提供一个通用的Java代码分析模板: 这段Java代码主要实现了XXX功能。首先,它定义了一个名为XXX的类,该类包含一些私有成员变量,如XXX和XXX。然后,它定义了一些公共方法,如XXX()用于初始化对象,XXX()用于实现主要功能。在XXX()方法中,首先进行了XXX操作,然后执行了XXX操作。最后,通过调用XXX()方法,完成了XXX任务。此外,该代码还使用了XXX设计模式,提高了代码的可读性和可维护性。总的来说,这段代码结构清晰,逻辑严谨,是一段优秀的Java代码。
作者其他创作
大纲/内容
由于服务是用来被其他进程调用的,所以必须对外暴露调用接口
用户空间
1做什么事 由于服务是完成某一项任务的,如读取某个硬件值
此时代码进入驱动层,由ServiceManager的Binder实体返回Service的Binder实体,放在reply中
实际上拿到的ServiceManagerProxy,并有一个Binder对象(与驱动层Binder实体交互)
这个binder就是HelloService在Java层的Binder实体
mRemote即ServiceManager在Java层的Binder实体
用户想获得HelloService服务,并调用其方法
Java层的Binder是为了与C++层,驱动层的Binder进行通信,他是向下的作用我们还需要进行Java层的转化,使得用户可以调用HelloService的接口,即将其转化为实现了IHelloService.Proxy的类,便可以调用HelloService的方法
2对外接口
调用getValue()方法
IBinder binder = reply.readStrongBinder();
重新回到Client进程中---(暂不考虑各种调用细节)
1拿到ServiceManager
1调用ServiceManager的addService()
Binder驱动的底层实现是ServiceManager的Binder实体接管了HelloService的Binder实体后续与该Service的通信必须经过ServiceManager
内核代码
Client拿到了_result值
1.定义服务
编译后成成一个IHelloService.java
2调用getService方法
现在假设我们自己写了一个HelloService,研究过程如下:
那么,AIDL的作用体现在哪呢? 跨进程,我们现在所做的都是在HelloService进程中,AIDL简化了你所需要做的工作
拿到val后,写入到reply中 reply.writeInt(_result); //JNI方法
package android.os; interface IHelloService { void setVal(int val); int getVal(); }
内核空间
用户情景:
ServiceManager
3调用HelloServiceProxy的方法
Stub 由HelloService实现 Proxy Client拿到的HelloService的代理接口
调用IHelloService.Proxy实现类的getVal()方法
此时,代码进入Binder驱动,HelloService的驱动层Binder实体通知HelloService执行相应代码
执行IHelloService.Stub实现类的getVal()方法
2.启动服务
---
实际是调用ServiceManagerProxy的getService方法
Client
ServiceManager是系统已经帮我们实现好了的
C/C++库
然后,代码进入IHelloService.Stub的onTransact()方法 case TRANSACTION_getVal:
Java代码
0 条评论
下一页