binder

从示例了解 Binder 机制

為{幸葍}努か 提交于 2020-02-01 05:06:34
Binder 是 Android 实现跨进程通信(IPC)的一种手段,Android 中每个应用都运行个独自的进程中,每个应用想要正常工作都需要系统服务提供支持,它们之间的信息传递就是基于 Binder 实现。只是因为 Android 对 Binder 层层封装起来普通开发任务接触不到 Binder 层面的接口,所以 Binder 才显示有点神秘。本篇文章将从 Service 组件做为起点,用实例演示 Binder 是如何进行跨进程通信的。 如何使用 Binder Binder 属于 C-S 结构,客户端与服务端属于不同的进程。相信大家第一次使用 Binder 是学习 Service 组件时写的 Hello World 程序。 // Service public class CalculateService extends Service { private final IBinder mBinder = new CalculateBinder ( ) ; public class CalculateBinder extends Binder { public CalculateService getService ( ) { return CalculateService . this ; } } @Override public IBinder onBind ( Intent

binder学习1

喜你入骨 提交于 2020-01-30 20:19:28
Binder机制的引入原因 Binder机制是为C/S架构设计的IPC机制,基于性能和安全性的考虑,Android系统在传统IPC机制之外,又引入了Binder机制。 性能 传统的Socket/管道/消息队列等IPC机制有一个共同点,数据传输过程中,先从发送方的缓冲区copy到内核缓冲区,再从内核缓冲区copy 到接收方缓冲区,数据至少经过两次copy。Binder机制的优化设计,使其仅需要从发送方缓冲区拷贝数据到内核缓冲区,接收方即可直接读取内 核缓冲区中的数据,数据仅需一次copy,提升了数据传输性能。 安全性 Binder机制提供通信方的UID和PID,有助于判断非法访问。并且,Binder机制支持匿名Binder,可以用于规避通过猜测(i.e. 通过猜测 端口地址进行Socket通信)进行通信的风险。 Binder机制的角色 Binder机制包括四个角色:Binder driver、Service Manager、Service、Client. Binder driver Binder driver工作于内核态(kernel space), 作为linux内核的一部分,跟随linux系统启动。它向linux内核注册了MISC设备,就是我们看到的 dev/binder设备文件,当Service/Client调用open/ioctl等系统调用操作dev/binder文件时

android App启动过程

▼魔方 西西 提交于 2020-01-28 02:58:31
本文以图文并茂的形式简单介绍一个APP从启动到主页面显示经历了哪些流程,以及实现的原理。不介绍具体源码,仅仅构建一个大体框架。 启动流程: ①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; ②system_server进程接收到请求后,向zygote进程发送创建进程的请求; ③Zygote进程fork出新的子进程,即App进程; ④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求; ⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求; ⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息; ⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。 ⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。 上面的一些列步骤简单介绍了一个APP启动到主页面显示的过程

Android四大组件之Service

不羁岁月 提交于 2020-01-24 05:06:30
在 Android 四大组件之中,除了 Activity 之外,最常用的就是 Service 了。先来看一下官方对 Service 的介绍 : Service是一个可以在后台执行需要长时间运行的操作的应用组件,它不提供用户界面。其它组件可以启动一个Service ,之后即使用户切换到别的应用里,这个Service 也将继续在后台运行。此外,一个组件可以与一个Service绑定来与之交互,甚至可以进行进程间通信。服务可以在后台执行很多任务,比如处理网络事务,播放音乐,文件读写或者与一个内容提供者交互等等。 由此可见,Service 的用途还是十分广泛的,我们在开发中经常会用到 Service,所以应该对 Service 有一定的了解。 Service 有一个非常需要注意的地方就是它其实是 运行在主线程中的 ,如果是刚了解 Service 的人,很容易会误以为 Service 是另开一个新线程运行的。所以我们一定要注意,不要在 Service 中执行一些耗时操作,从而导致线程阻塞。 想要了解Service,那么就要先了解Service的生命周期,幸运的是,Service的生命周期比起Activity要简单的多。如下 : 上图展示了 Service 在两种形式下的生命周期。下面说明 Service 的两种形式 : 未绑定形式 Service: 该形式的 Service 是通过

Android Binder Debug

放肆的年华 提交于 2020-01-19 04:48:46
# find / -name binder ./sys/fs/selinux/class/binder ./sys/devices/virtual/misc/binder ./sys/class/misc/binder ./sys/kernel/debug/binder ./sys/kernel/debug/tracing/events/binder ./sys/module/binder //binder下所有通信进程信息 # ls /sys/kernel/debug/binder/proc 1105 1660 1892 2106 2383 2411 2440 2467 2496 2526 2629 2813 2922 2975 3035 3170 3262 3314 3373 3409 3451 3484 3581 3666 3725 3860 512 529 541 571 608 611 614 616 618 633 637 641 770 1358 1675 1909 2302 2397 2426 2453 2482 2509 2596 2762 2908 2941 3021 3115 3195 3297 3330 3394 3433 3466 3562 3612 3698 3744 499 527 538 570 582 610 613 615 617 621 635

Android Binder原理初探

落花浮王杯 提交于 2020-01-18 20:27:31
1、Binder的通信原理 动态内核可加载模块&&内存映射 在 Android Binder开卷 中所说的IPC通信模型中所描述的,跨进程通信需要内核空间做支持。传统的IPC机制如管道,Socket都是内核的一部分,因此通过内核支持来实现进程间通信自然没有问题。但是Binder并不是Liunx系统内核的一部分。Binder机制得益于Liunx的 动态内核可加载模块(Loadable Kernel Module,LKM) 的机制,模块是具有独立功能的程序,它可以单独编译,但是不能独立运行,它运行时被链接到内核作为内核的一部分运行。这样,Android系统就可以通过动态添加一个内核模块运行在内核空间,用户进程之间通过这个内核模块作为桥梁来实现通信。 在Android系统中, 驱动(Binder Dirver)。 Binder是基于内存映射来实现的,在 Android Binder开卷 中又分析到内存映射通常是用在有物理介质的文件系统上的,Binder没有物理介质,它使用内存映射是为了跨进程传递数据。 Binder通信的步骤: Binder驱动在内核空间创建一个数据接收缓存区; 在内核空间开辟一块内核缓存区,建立内核缓存区和数据接收缓存区之间的映射关系,以及数据接收缓存区和接收进程用户地址的映射关系; 发送方进程通过copy_from_user()函数将数据拷贝到内核中的内核缓存区

Android Binder机制学习

久未见 提交于 2020-01-09 00:27:58
Binder机制是什么: Binder机制是​ Android系统中进程间通讯(IPC)的一种方式,Android中ContentProvider、Intent、aidl都是基于Binder。 为什么要用Binder机制: 在提及Binder之前,我们先看看我们平时开发的app的状况。每个app就像孤岛一样,生活在系统分配给自己的虚拟机和内存空间,好处是安全,各个app不会互相影响到对方,IE一个网页的崩溃却会导致整个IE应用程序死亡(举个小栗子,IE不属于跨进程)。在这种情况下,必须有一种机制,提供安全高效的通信的功能,Binder就为此而生。所以,Binder是Android系统的一种IPC(进程间通信)方式。ActivityManagerService、WinderManagerService等系统服务的背后都是Binder。 Binder机制的好处: 进程通信大概就两个方面因素,一者性能方面,传输效率问题,传统的管道队列模式采用内存缓冲区的方式,数据先从发送方缓存区拷贝到内核开辟的缓存区中,然后再从内核缓存区拷贝到接收方缓存区,至少有两次拷贝过程,而socket都知道传输效率低,开销大,用于跨网络进程交互比较多,共享内存虽然无需拷贝,但是不安全。 总结一下就是: Binder机制优点: 1、只需要进行一次数据拷贝,性能上仅次于共享内存 2、基于C/S架构,职责明确,架构清晰

Android开发的艺术探索第二章

百般思念 提交于 2020-01-04 14:21:08
IPC机制 2.1 Android IPC简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指 两个进程之间进行数据交换的过程。 IPC不是Android中所独有的,任何一个操作系统都需要有相应的IPC机制,比如 Windows上可以通过剪贴板、管道和邮槽等来进行进程间通信;Linux上可以通过命名管 道、共享内容、信号量等来进行进程间通信。可以看到不同的操作系统平台有着不同的进 程间通信方式,对于Android来说,它是一种基于Linux内核的移动操作系统,它的进程间 通信方式并不能完全继承自Linux,相反,它有自己的进程间通信方式。在Android中最有 特色的进程间通信方式就是Binder了,通过Binder可以轻松地实现进程间通信。除了 Binder,Android还支持Socket,通过Socket也可以实现任意两个终端之间的通信,当然同 一个设备上的两个进程通过Socket通信自然也是可以的。 2.2 Android中的多进程模式 通过给四 大组件指定android:process属性,我们可以轻易地开启多进程模式,这看起来很简单,但 是实际使用过程中却暗藏杀机,多进程远远没有我们想的那么简单,有时候我们通过多进 程得到的好处甚至都不足以弥补使用多进程所带来的代码层面的负面影响。 2.2.1 开启多进程模式

android App启动过程

两盒软妹~` 提交于 2020-01-04 05:25:50
本文以图文并茂的形式简单介绍一个APP从启动到主页面显示经历了哪些流程,以及实现的原理。不介绍具体源码,仅仅构建一个大体框架。 启动流程: ①点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; ②system_server进程接收到请求后,向zygote进程发送创建进程的请求; ③Zygote进程fork出新的子进程,即App进程; ④App进程,通过Binder IPC向sytem_server进程发起attachApplication请求; ⑤system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求; ⑥App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息; ⑦主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。 ⑧到此,App便正式启动,开始进入Activity生命周期,执行完onCreate/onStart/onResume方法,UI渲染结束后便可以看到App的主界面。 上面的一些列步骤简单介绍了一个APP启动到主页面显示的过程

Android跨进程通信篇

女生的网名这么多〃 提交于 2020-01-03 05:17:12
前言 转载请声明,转自【https://www.cnblogs.com/andy-songwei/p/10256379.html】,谢谢! 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一。Android系统的运行由大量相互独立的进程相互协助来完成的,所以Android进程间通信问题,是做好Android开发高级工程师必须要跨过的一道坎。但是,我们是否真的清楚,Android中都有哪些方式实现跨进程通信呢?这些方式都有哪些优缺点?如何选择这些通信方式?Binder是什么?为什么要引入Binder?Binder是这么样实现跨进程通信的?AIDL是什么?AIDL和Binder又有什么关系呢?...... 本文将对Android的跨进程通、进程内通信等方面做一些总结,以及比较详细地介绍AIDL的使用,主要内容如下: 其行文脉络大致如下,希望能加深读者对这方面内容的记忆:(1)Android基于Linux系统,所以先说系统进程相关知识和Linux IPC。(2)总结Android的IPC,顺带总结了Android进程内组件之间的通信方式。(3)Android为了克服Linux IPC中的缺点,引入了Binder,所以对Binder做了一些宏观上的介绍。(4)AIDL是实现Binder最常用的工具,所以详细介绍了AIDL相关内容。 一、基础知识简介