Android Binder IPC
for Linux
YU-HSIN HUNG
ANDROID BINDER IPC FOR LINUX
Motivation
▸ Binder IPC subsystem is the core part of Android OS
▸ Activity, Service, BroadcastReceiver, ContentProvider
▸ ActivityManager, WindowManager, SurfaceFlinger
▸ Why Android propose another IPC mechanism?
▸ Feasibility of using Binder IPC on common Linux distros
In the Android platform, the
binder is used for nearly
everything that
happens across processes in the
core platform.
Dianne Hackborn
ANDROID BINDER IPC FOR LINUX
ANDROID BINDER IPC FOR LINUX
Inter-Process Communication
ANDROID BINDER IPC FOR LINUX
Unix IPC
▸ Pipe
▸ FIFO
▸ Socket
▸ SysV IPC
▸ Shared memory
▸ Message queue
▸ Semaphore
ANDROID BINDER IPC FOR LINUX
Binder IPC
▸ Client/server architecture
▸ Remote procedure call
▸ Implemented as a Linux device driver
▸ Only one copy (from user to kernel) is needed
ANDROID BINDER IPC FOR LINUX
Binder Architecture
ANDROID BINDER IPC FOR LINUX
Binder Driver
▸ init() - Register a misc device (/dev/binder)
▸ open() - Open binder device
▸ mmap() - Allocate memory and map to kernel space
▸ ioctl() - Write/read IPC
ANDROID BINDER IPC FOR LINUX
Binder Driver - initialization
ANDROID BINDER IPC FOR LINUX
Binder Driver - device “file”
ANDROID BINDER IPC FOR LINUX
Binder Driver - open device
ANDROID BINDER IPC FOR LINUX
Binder Driver - memory map
▸ No more than 4MB
ANDROID BINDER IPC FOR LINUX
Binder Driver - memory map
ANDROID BINDER IPC FOR LINUX
Binder Driver - ioctl
▸ No read() & write()
▸ Commands
▸ BINDER_WRITE_READ
▸ BINDER_SET_MAX_THREADS
▸ BINDER_SET_CONTEXT_MGR
▸ BINDER_THREAD_EXIT
ANDROID BINDER IPC FOR LINUX
Binder Driver - protocol
▸ BC_TRANSACTION <-> BR_TRANSACTION
▸ BC_REPLY <-> BR_REPLY
▸ ……
ANDROID BINDER IPC FOR LINUX
Binder Driver - communication model
ANDROID BINDER IPC FOR LINUX
Binder Driver - write
ANDROID BINDER IPC FOR LINUX
Binder Driver - read
ANDROID BINDER IPC FOR LINUX
Binder Driver - read
ANDROID BINDER IPC FOR LINUX
Binder IPC subsystem
ANDROID BINDER IPC FOR LINUX
Binder IPC subsystem - more!
▸ ProcessState, IPCThreadState
▸ Parcel
▸ AIDL
ANDROID BINDER IPC FOR LINUX
Implementation
▸ Environment & code base
▸ Ubuntu 14.04.4 (Linux Kernel 4.2.0-27)
▸ Android 6.0.1_r46
▸ Components to port
▸ binder & ashmem driver
▸ binder library
▸ Service Manager
ANDROID BINDER IPC FOR LINUX
Issues & Challenges
▸ Not dynamic loadable
▸ Bionic C library
▸ Atomic library
▸ Dependencies to Android log daemon & SELinux
ANDROID BINDER IPC FOR LINUX
Not dynamic loadable
▸ 10+ symbols are not exported by kernel
▸ Naive way: build kernel along with Binder driver statically
▸ Tricky way: kallsyms + function pointer redirection
▸ Run a shell script in Makefile
▸ Generate additional C source and header files
▸ Compile with Binder driver
ANDROID BINDER IPC FOR LINUX
Not dynamic loadable
ANDROID BINDER IPC FOR LINUX
Atomic library
▸ Have tried C++11 <atomic> -> no luck :(
▸ x86 supports atomic fetch and add!
ANDROID BINDER IPC FOR LINUX
Evaluation - correctness
▸ Integer Adder Service
▸ Client: a = iter, b = iter+3 -> Server: calculate a+b
ANDROID BINDER IPC FOR LINUX
Evaluation - latency
ANDROID BINDER IPC FOR LINUX
Evaluation - analysis
▸ Not suitable for large payload
▸ mmap allows only 4MB
▸ deferred work (e.g. release buffer) in workqueue
▸ global lock everywhere :(
ANDROID BINDER IPC FOR LINUX
Reference
▸ Linux Kernel & Android Framework source code
▸ 《深入理理解 Android 核⼼心設計思想 - 核⼼心解構篇》
▸ Binder系列列 - Gityuan博客
▸ Android IPC Mechanism by jserv
▸ Deep Dive into Android IPC/Binder Framework

Android Binder IPC for Linux

  • 1.
    Android Binder IPC forLinux YU-HSIN HUNG
  • 2.
    ANDROID BINDER IPCFOR LINUX Motivation ▸ Binder IPC subsystem is the core part of Android OS ▸ Activity, Service, BroadcastReceiver, ContentProvider ▸ ActivityManager, WindowManager, SurfaceFlinger ▸ Why Android propose another IPC mechanism? ▸ Feasibility of using Binder IPC on common Linux distros
  • 3.
    In the Androidplatform, the binder is used for nearly everything that happens across processes in the core platform. Dianne Hackborn ANDROID BINDER IPC FOR LINUX
  • 4.
    ANDROID BINDER IPCFOR LINUX Inter-Process Communication
  • 5.
    ANDROID BINDER IPCFOR LINUX Unix IPC ▸ Pipe ▸ FIFO ▸ Socket ▸ SysV IPC ▸ Shared memory ▸ Message queue ▸ Semaphore
  • 6.
    ANDROID BINDER IPCFOR LINUX Binder IPC ▸ Client/server architecture ▸ Remote procedure call ▸ Implemented as a Linux device driver ▸ Only one copy (from user to kernel) is needed
  • 7.
    ANDROID BINDER IPCFOR LINUX Binder Architecture
  • 8.
    ANDROID BINDER IPCFOR LINUX Binder Driver ▸ init() - Register a misc device (/dev/binder) ▸ open() - Open binder device ▸ mmap() - Allocate memory and map to kernel space ▸ ioctl() - Write/read IPC
  • 9.
    ANDROID BINDER IPCFOR LINUX Binder Driver - initialization
  • 10.
    ANDROID BINDER IPCFOR LINUX Binder Driver - device “file”
  • 11.
    ANDROID BINDER IPCFOR LINUX Binder Driver - open device
  • 12.
    ANDROID BINDER IPCFOR LINUX Binder Driver - memory map ▸ No more than 4MB
  • 13.
    ANDROID BINDER IPCFOR LINUX Binder Driver - memory map
  • 14.
    ANDROID BINDER IPCFOR LINUX Binder Driver - ioctl ▸ No read() & write() ▸ Commands ▸ BINDER_WRITE_READ ▸ BINDER_SET_MAX_THREADS ▸ BINDER_SET_CONTEXT_MGR ▸ BINDER_THREAD_EXIT
  • 15.
    ANDROID BINDER IPCFOR LINUX Binder Driver - protocol ▸ BC_TRANSACTION <-> BR_TRANSACTION ▸ BC_REPLY <-> BR_REPLY ▸ ……
  • 16.
    ANDROID BINDER IPCFOR LINUX Binder Driver - communication model
  • 17.
    ANDROID BINDER IPCFOR LINUX Binder Driver - write
  • 18.
    ANDROID BINDER IPCFOR LINUX Binder Driver - read
  • 19.
    ANDROID BINDER IPCFOR LINUX Binder Driver - read
  • 20.
    ANDROID BINDER IPCFOR LINUX Binder IPC subsystem
  • 21.
    ANDROID BINDER IPCFOR LINUX Binder IPC subsystem - more! ▸ ProcessState, IPCThreadState ▸ Parcel ▸ AIDL
  • 22.
    ANDROID BINDER IPCFOR LINUX Implementation ▸ Environment & code base ▸ Ubuntu 14.04.4 (Linux Kernel 4.2.0-27) ▸ Android 6.0.1_r46 ▸ Components to port ▸ binder & ashmem driver ▸ binder library ▸ Service Manager
  • 23.
    ANDROID BINDER IPCFOR LINUX Issues & Challenges ▸ Not dynamic loadable ▸ Bionic C library ▸ Atomic library ▸ Dependencies to Android log daemon & SELinux
  • 24.
    ANDROID BINDER IPCFOR LINUX Not dynamic loadable ▸ 10+ symbols are not exported by kernel ▸ Naive way: build kernel along with Binder driver statically ▸ Tricky way: kallsyms + function pointer redirection ▸ Run a shell script in Makefile ▸ Generate additional C source and header files ▸ Compile with Binder driver
  • 25.
    ANDROID BINDER IPCFOR LINUX Not dynamic loadable
  • 26.
    ANDROID BINDER IPCFOR LINUX Atomic library ▸ Have tried C++11 <atomic> -> no luck :( ▸ x86 supports atomic fetch and add!
  • 27.
    ANDROID BINDER IPCFOR LINUX Evaluation - correctness ▸ Integer Adder Service ▸ Client: a = iter, b = iter+3 -> Server: calculate a+b
  • 28.
    ANDROID BINDER IPCFOR LINUX Evaluation - latency
  • 29.
    ANDROID BINDER IPCFOR LINUX Evaluation - analysis ▸ Not suitable for large payload ▸ mmap allows only 4MB ▸ deferred work (e.g. release buffer) in workqueue ▸ global lock everywhere :(
  • 30.
    ANDROID BINDER IPCFOR LINUX Reference ▸ Linux Kernel & Android Framework source code ▸ 《深入理理解 Android 核⼼心設計思想 - 核⼼心解構篇》 ▸ Binder系列列 - Gityuan博客 ▸ Android IPC Mechanism by jserv ▸ Deep Dive into Android IPC/Binder Framework