binder

Service Manger的初始化分析

孤街浪徒 提交于 2019-11-29 21:41:21
在init.rc文件中,有定义serviceservicemanager /system/bin/servicemanager,在系统初始化会解析init.rc文件时,遇到这句话,将会把servicemanager加载到服务启动列表中,同时它也是第一个启动的服务。 ServiceManager的相关代码位于frameworks/native/cmds/servicemanager文件夹中。总体来说,它的初始化分为三个步骤: 1. 通过调用binder_open打开/dev/binder字符设备,并映射了一段进程虚拟地址空间,通过binder驱动的处理,这段虚拟地址空间也可以被内核同时访问(无需先复制),因为binder驱动在内核中同时也映射了一段虚拟地址空间,它们映射的目标物理地址是一样的,也就是说这两个不同的虚拟地址空间都同时映射到了一块相同的物理地址空间。这一步主要是为接下来的数据通信提供内存空间,作为binder transaction过程中的数据存放处。 2. 作为Service Manager,它的特殊性在于:首先,它有一个固定的句柄值,即0。其次,它必须是第一个调用binder_become_context_manager函数的进程。通过这个函数,binder驱动就会为其创建一个结点,这个结点是全局的。 3. 最后通过binder_loop进入消息循环

Android开机启动流程初探

故事扮演 提交于 2019-11-29 18:37:25
l Init 进程 Android 系统在启动时首先会启动 Linux 系统,引导加载 Linux Kernel 并启动 init 进程。 Init 进程是一个由内核启动的用户级进程,是 Android 系统的第一个进程。该进程的相关代码在 platform\system\core\init\init.c 。在 main 函数中,有如下代码: open_devnull_stdio(); log_init(); INFO("reading config file\n"); init_parse_config_file("/init.rc"); /* pull the kernel commandline and ramdisk properties file in */ import_kernel_cmdline(0); get_hardware_name(hardware, &revision); snprintf(tmp, sizeof(tmp), "/init.%s.rc", hardware); init_parse_config_file(tmp); 这里会加载解析 init.rc 和 init. hardware .rc 两个初始化脚本。 *.rc 文件定义了在 init 进程中需要启动哪些进程服务和执行哪些动作。其详细说明参见 platform\system\core

Binder基本概念

这一生的挚爱 提交于 2019-11-29 15:49:52
Binder通信是一种Client-Server的通信结构,从表面上来看,是Client通过获得一个Server的代理接口对Server进行调用。实际上,代理接口中定义的方法与Server中定义的方法是一一对应的。Client调用某个代理接口中的方法时,代理接口的方法会将Client传递的参数打包成Parcel对象。代理接口将该Parcel发送给内核中的Binder Driver。Server会读取Binder Driver中请求的数据,如果是发送给自己的,则解包Parcel对象,处理并将结果返回。整个调用过程是一个同步的过程,在Server处理时,Client会被阻塞。 来源: https://blog.csdn.net/csdn9228/article/details/100847828

Android 跨进程通信基础

妖精的绣舞 提交于 2019-11-28 15:21:47
Android跨进程通信基础——Binder, BinderProxy, parcel, parcelable, Stub, Stub.Proxy (该文章最早于2013年6月7日发表于有道云笔记 进入阅读 ) 百度、google 过很多文章,都没能找到能够从 API 使用者角度简单描述 Binder,BinderProxy,Parcel,Parcelable,Stub,Stub.Proxy 之间关系的文章,要么高深莫测,要么混乱不清。最终决定还是自己动手,看源码,看文档,现总结如下: Binder,BinderProxy 形成了进程间通信的基础,相当于公路桥梁; Parcel 在 IBinder 基础上传输数据,相当于运输工具; Parcelable 基本数据类型和实现了 Parcelable 接口的复合数据类型才可被 Parcel 传输,相当于摆放整齐、安检合格的货物; Stub,Stub.Proxy 实现跨进程调用的接口,相当于收发货方。 注:Binder,BinderProxy 都实现了 IBinder 接口 下面以 Activity 与 Service 通信为例来分析其运行机制。 示例目的:通过跨进程调用方式在 Activity 进程端调用 Service 进程端的方法。这些方法由接口 RemoteSSO 定义。这里假设两者是运行在不同进程的(也可以运行在相同进程

Android IPC进程间通讯机制

醉酒当歌 提交于 2019-11-28 15:21:35
一.Linux系统进程间通信有哪些方式? 1.socket; 2.name pipe命名管道; 3.message queue消息队列; 4.singal信号量; 5.share memory共享内存; 二.Java系统的通信方式是什么? 1.socket; 2.name pipe; 三.Android系统通信方式是什么? Binder 通信; 四.Binder通信的优势是什么? 高效率 五.Binder通信的特点是什么? 是同步,而不是异步; 六.Binder通信是如何实现的? 1.Binder通信是通过linux的binder driver来实现的, 2.Binder通信操作类似线程迁移(thread migration),两个进程间IPC看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回; 3.Binder的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的IPC以及执行进程本地消息,Binder通信是同步而不是异步。 七. Android中的 Binder通信实现要点: 1. Android中的Binder通信是基于Service与Client的工作模型的; 2. 所有需要IBinder通信的进程都必须创建一个IBinder接口; 3. 系统中有一个进程管理所有的system service: 4.

【android系统】binder通信机制--记一次项目开发中用到的实例

守給你的承諾、 提交于 2019-11-28 08:15:43
自己把自己坑了一把,在一篇文章中说到,如果有盆友需要就分享一篇binder机制的文章。时隔好多年了似的,我都忘了这事了,今天居然真有需要的。首先感谢盆友的信任,其次正好我去年写了一个binder机制的实例,正好总结总结。 再次欢迎大家在公众号上来给我们留言,交流技术上的问题。 首先这篇文章不说binder机制的原理,如果盆友需要可以看看这一篇文章。这算一篇笔记吧,记一下项目中用到的binder机制。 Binder进程间通信机制(图文解析) 什么是binder? binder简单点说就是用来进程间通信的工具。 有什么优点这里也不累述了,有很多资料,大概总结下: 性能方面:相比socket传输效率高,开销小。 安全方面:传统的IPC通信方式没有任何措施,Android为每个安装好的应用程序分配了自己的UID,进程的UID是鉴别进程身份的重要标志。 概述图 说明: Client进程:使用服务的进程。 Server进程:提供服务的进程。 ServiceManager进程:ServiceManager的作用是将字符形式的Binder名字转化成Client中对该Binder的引用,使得Client能够通过Binder名字获得对Server中Binder实体的引用。 Binder驱动:驱动负责进程之间Binder通信的建立,Binder在进程之间的传递,Binder引用计数管理

Android系统Surface机制的SurfaceFlinger服务的启动过程分析

落花浮王杯 提交于 2019-11-27 08:37:16
分享一下我老师大神的人工智能教程!零基础,通俗易懂! http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴! 在前面一篇文章中,我们简要介绍了 Android 系统 Surface 机制中的 SurfaceFlinger 服务。 SurfaceFlinger 服务是在 System 进程中启动的,并且负责统一管理设备的帧缓冲区。 SurfaceFlinger 服务在启动的过程中,会创建两个线程,其中一个线程用来监控控制台事件,而另外一个线程用来渲染系统的 UI 。在本文中,我们就将详细分析 SurfaceFlinger 服务的启动过程。 《Android系统源代码情景分析》一书正在进击的程序员网( http://0xcc0xcd.com )中连载,点击进入! 从前面 Android系统进程Zygote启动过程的源代码分析 一文可以知道, System 进程是由Zygote进程启动的,并且是以Java层的SystemServer类的静态成员函数main为入口函数的。因此,接下来我们就从SystemServer类的静态成员函数main开始,分析 SurfaceFlinger 服务的启动过程,如图1所示。 图1 SurfaceFlinger服务的启动过程 SurfaceFlinger

Android插件化——Hook技术

为君一笑 提交于 2019-11-26 23:54:18
1、Hook技术之动态代理 Hook技术的基础和必备技术是动态代理,关于动态代理的使用和原理参见 Java动态代理 2、Binder Hook(Hook 系统服务) 2.1、系统获取服务的原理 ContextImpl.getSystemService(String name) @Override public Object getSystemService ( String name ) { return SystemServiceRegistry . getSystemService ( this , name ) ; } public static Object getSystemService ( ContextImpl ctx , String name ) { //1、从注册的SYSTEM_SERVICE_FETCHERS中根据名称获取ServiceFetcher ServiceFetcher < ? > fetcher = SYSTEM_SERVICE_FETCHERS . get ( name ) ; return fetcher != null ? fetcher . getService ( ctx ) : null ; //2、ServiceFetcher中创建服务 } 在使用系统服务时会直接调用Context的getSystemService()

Android 7.0 Camera架构源码分析1 - CameraService启动

假如想象 提交于 2019-11-26 08:27:52
本系列教程主要讲解Camera从APP层到HAL层的整个流程,第一篇先讲解CameraService的启动,后面会讲解open、preview、takepicture的流程。 Android 7.0之前CameraService是在mediaserver进程中注册的,看下Android 6.0的代码: //path: frameworks\av\media\mediaserver\main_mediaserver.cpp int main() { sp < ProcessState > proc(ProcessState ::self ()); sp < IServiceManager > sm = defaultServiceManager(); ALOGI( "ServiceManager: %p" , sm . get()); AudioFlinger ::instantiate (); MediaPlayerService ::instantiate (); ResourceManagerService ::instantiate (); //初始化相机服务 CameraService ::instantiate (); AudioPolicyService ::instantiate (); SoundTriggerHwService ::instantiate ();

6.2-3输入系统双向进程间通信

牧云@^-^@ 提交于 2019-11-25 21:38:11
分析 输入系统需要实现进程间通信,如何写? 先写一个进程,用来读取和分发事件,写出APP,用来处理事件,中间会涉及进程间通信 是否可以使用Binder系统?回顾 如何实现双向通信 这里引入一个socketpair,基于缺点,使用Binder来解决无亲缘关系的进程间通信 一、双向通信(socketpair) 来源: CSDN 作者: qq_34738528 链接: https://blog.csdn.net/qq_34738528/article/details/103234883