Android 9 ServerManger源码分析
ServerManager
书接上回: Wifi服务启动流程(1)
SystemService.java 的 publishBinderService 方法将service添加到ServiceManager
(frameworks\base\services\core\java\com\android\server\SystemService.java)
protected final void publishBinderService(String name, IBinder service,boolean allowIsolated, int dumpPriority) {//将service添加到ServiceManagerServiceManager.addService(name, service, allowIsolated, dumpPriority);}
ServerManager.addservice
(路径:frameworks\base\core\java\android\os\ServiceManager.java)
/*** 将一个名为@a 名称的新@a 服务放入服务管理器中。** @param name 新服务的名称* @param service 服务对象* @param allowIsolated 设置为 true 以允许隔离沙盒进程* @param dumpPriority 支持转储优先级作为访问此服务的位掩码*/public static void addService(String name, IBinder service, boolean allowIsolated,int dumpPriority) {try {getIServiceManager().addService(name, service, allowIsolated, dumpPriority);} catch (RemoteException e) {Log.e(TAG, "error in addService", e);}}
其中的getIServiceManager() 获取的值,相当于获取到native层的调用权
private static IServiceManager getIServiceManager() {//单例模式if (sServiceManager != null) {return sServiceManager;}// Find the service manager//获得与native层交互的媒介sServiceManager = ServiceManagerNative.asInterface(Binder.allowBlocking(BinderInternal.getContextObject()));return sServiceManager;}
Binder.allBlocking
(路径:frameworks\base\core\java\android\os\Binder.java)
/*** 允许在给定接口上阻塞调用,覆盖请求* {@link #setWarnOnBlocking(boolean)} 的值。* <p>* 只有当你绝对是很少调用确保远程接口是内置系统组件永远无法升级。 特别是,这必须永远不会调用由包托管的接口,这些接口可以升级或更换,否则您将面临系统不稳定的风险那个远程接口楔入。** @隐藏*/public static IBinder allowBlocking(IBinder binder) {try {if (binder instanceof BinderProxy) {((BinderProxy) binder).mWarnOnBlocking = false;} else if (binder != null && binder.getInterfaceDescriptor() != null&& binder.queryLocalInterface(binder.getInterfaceDescriptor()) == null) {Log.w(TAG, "Unable to allow blocking on interface " + binder);}} catch (RemoteException ignored) {}return binder;}
BinderInternal.getContextObject()
/*** 返回系统的全局“上下文对象”。 这通常是IServiceManager 的实现,您可以使用它来查找其他服务。*/public static final native IBinder getContextObject();
对应的Native层方法
路径:frameworks\base\core\jni\android_util_Binder.cpp
static jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz)
{sp<IBinder> b = ProcessState::self()->getContextObject(NULL);return javaObjectForIBinder(env, b);
}
javaObjectForIBinder (提供一个代理对象给FrameWork层调用)
jobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val)
{if (val == NULL) return NULL;if (val->checkSubclass(&gBinderOffsets)) {// // 这是一个由 ibinderForJavaObject 创建的 JavaBBinder。已经有的 Java 对象。jobject object = static_cast<JavaBBinder*>(val.get())->object();LOGDEATH("objectForBinder %p: it's our own %p!\n", val.get(), object);return object;}// 对于函数的其余部分,我们将持有这个锁,以进行序列化// 查找/创建/销毁本机 Binder 代理的 Java 代理。AutoMutex _l(gProxyLock);BinderProxyNativeData* nativeData = gNativeDataCache;if (nativeData == nullptr) {nativeData = new BinderProxyNativeData();}// gNativeDataCache 现在逻辑上是空的。jobject object = env->CallStaticObjectMethod(gBinderProxyOffsets.mClass,gBinderProxyOffsets.mGetInstance, (jlong) nativeData, (jlong) val.get());if (env->ExceptionCheck()) {// 在异常情况下,getInstance 仍然拥有 nativeData 的所有权。gNativeDataCache = nullptr;return NULL;}BinderProxyNativeData* actualNativeData = getBPNativeData(env, object);if (actualNativeData == nativeData) {// 新的 BinderProxy; 我们仍然拥有独家访问权。nativeData->mOrgue = new DeathRecipientList;nativeData->mObject = val;gNativeDataCache = nullptr;++gNumProxies;if (gNumProxies >= gProxiesWarned + PROXY_WARN_INTERVAL) {ALOGW("Unexpectedly many live BinderProxies: %d\n", gNumProxies);gProxiesWarned = gNumProxies;}} else {// 未使用 nativeData。 下次再用。gNativeDataCache = nativeData;}return object;
}
IServiceManager.asInterface (FrameWork获取到代理)
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);}
未完待续。。。
Android 9 ServerManger源码分析相关推荐
- CTS(11)---android自动化测试CTS源码分析之一
android自动化测试CTS源码分析之一 1, 概述 CTS(Compatibility Test Suite)全名兼容性测试,主要目的就是让Android设备开发商能够开发出兼容性更好的andro ...
- android agps,Android应用开发Android GPS ——AGPS源码分析及配置
本文将带你了解Android应用开发Android GPS --AGPS源码分析及配置,希望本文对大家学Android有所帮助. " Android Framework GPS --AGPS ...
- android gps源码分析,Android编程之Android GPS ——AGPS源码分析及配置
本文主要介绍了Android编程的Android GPS --AGPS源码分析及配置,通过具体的分析以及源码,向大家展示了这些,希望对大家学习Android编程有所帮助. 1:冷启动指令: locat ...
- android(cm11)状态栏源码分析(一)
版权声明:您好,转载请留下本人博客的地址,谢谢 https://blog.csdn.net/hongbochen1223/article/details/50216563 (一):写在前面 最近由于工 ...
- Android 7.0 源码分析项目一期竣工啦
从 Android 入行开始,因为工作需求和解决疑难bug的原因陆陆续续的看过一些源码,但都不成系统,从2016年年底开始,在Github上建了一个Android Open Source Projec ...
- Android之HandlerThread源码分析和简单使用(主线程和子线程通信、子线程和子线程通信)
1.先熟悉handler方式实现主线程和子线程互相通信方式,子线程和子线程的通信方式 如果不熟悉或者忘记了,请参考我的这篇博客 Android之用Handler实现主线程和子线程互相通信以及子 ...
- Android之AsyncTask源码分析(第五篇:execute方法只能执行一次的原因)
(注意:本文基于API 28的源码分析,API 29上或其他平台的源码略有不同) 前言 当你调用AsyncTask对象的execute()方法时,突然发生崩溃--内心充满不解:java.lang.Il ...
- Android——RIL 机制源码分析
Android 电话系统框架介绍 在android系统中rild运行在AP上,AP上的应用通过rild发送AT指令给BP,BP接收到信息后又通过rild传送给AP.AP与BP之间有两种通信方式: 1. ...
- Android屏幕刷新——源码分析
Android屏幕刷新原理--源码分析 文章目录 Android屏幕刷新原理--源码分析 概述 VSync信号 三级缓冲 源码分析 消息队列的同步屏障 参考资料 概述 Android系统每16ms(一 ...
最新文章
- IQKeyboardManager使用方法
- 2019年计算机视觉将继续承担哪些作用?
- ​cglib实现动态代理构建带参数的代理实例
- java 事件驱动模式_事件驱动
- HTTP 错误 500.21 - Internal Server Error
- 本土化App名稱和icon
- Apache下PHP的几种工作方式
- python创建字符串数组_如何创建任意长度字符串的numpy数组?
- mysql 函数substring_index()
- 相同的树Python解法
- (6)kendo UI使用基础介绍与问题整理——dropdownlist/基础问题整理
- mysql图片jsp_mysql jsp 图片
- 【转载】不带www跳转www.设定网站唯一入口,提升权重!
- (DFS)n皇后问题
- 理解类级别的访问控制权限——类的成员函数可以访问该类所有对象的私有成员
- C++STL之next_permutation()函数使用
- python能做什么工作-学了Python可以做什么工作
- 033-生产机器扩容
- matlab shapley函数,合作博弈shapley值讲解.ppt
- 谈谈架构师是何种生物