inter-process communication of android
TRANSCRIPT
![Page 1: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/1.jpg)
1
Inter-process communicationof Android
Tetsuyuki Kobayashi
2011.6.3 updated
![Page 2: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/2.jpg)
2
Who am I?
20+ years involved in embedded systems
10 years in real time OS, such as iTRON
10 years in embedded Java Virtual Machine
Now GCC, Linux, QEMU, Android, …
Blogs
http://d.hatena.ne.jp/embedded/ (Personal)
http://blog.kmckk.com/ (Corporate)
http://kobablog.wordpress.com/(English)
@tetsu_koba
new
![Page 3: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/3.jpg)
3
Today's topic
Inter process communications in Android
Inter process method invocation using Binder
Ashmem
System Properties
![Page 4: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/4.jpg)
4
Processes running on Android$ ps ...root 37 1 248 156 c00aef2c 0000875c S /sbin/ueventdsystem 42 1 768 260 c022950c afd0b6fc S /system/bin/servicemanagerroot 43 1 3824 564 ffffffff afd0bdac S /system/bin/voldroot 44 1 3796 560 ffffffff afd0bdac S /system/bin/netdroot 45 1 628 264 c02588c0 afd0c0cc S /system/bin/debuggerdradio 46 1 4336 672 ffffffff afd0bdac S /system/bin/rildroot 47 1 62224 27576 c00aef2c afd0b844 S zygotemedia 48 1 16828 3736 ffffffff afd0b6fc S /system/bin/mediaserverbluetooth 49 1 1216 572 c00aef2c afd0c59c S /system/bin/dbus-daemonroot 50 1 776 316 c02a8424 afd0b45c S /system/bin/installdkeystore 51 1 1704 432 c02588c0 afd0c0cc S /system/bin/keystoreshell 52 1 696 336 c0050934 afd0c3ac S /system/bin/shroot 53 1 3356 160 ffffffff 00008294 S /sbin/adbdsystem 67 47 172464 32596 ffffffff afd0b6fc S system_serversystem 115 47 80028 20728 ffffffff afd0c51c S com.android.systemuiapp_24 124 47 80732 20720 ffffffff afd0c51c S com.android.inputmethod.latinradio 135 47 87848 20324 ffffffff afd0c51c S com.android.phoneapp_18 144 47 89136 24160 ffffffff afd0c51c S com.android.launcherapp_7 165 47 86136 22736 ffffffff afd0c51c S android.process.acoreapp_0 197 47 73996 17472 ffffffff afd0c51c S com.android.deskclockapp_14 208 47 75000 18464 ffffffff afd0c51c S android.process.mediaapp_3 219 47 72228 17652 ffffffff afd0c51c S com.android.bluetoothapp_25 234 47 85336 17836 ffffffff afd0c51c S com.android.mmsapp_26 254 47 74656 19080 ffffffff afd0c51c S com.android.emailapp_27 266 47 74912 18100 ffffffff afd0c51c S com.android.providers.calendarapp_1 285 47 71616 16280 ffffffff afd0c51c S com.android.protipsapp_19 293 47 72184 16572 ffffffff afd0c51c S com.android.musicapp_21 301 47 74728 17208 ffffffff afd0c51c S com.android.quicksearchboxapp_28 311 47 75408 18040 ffffffff afd0c51c S com.cooliris.mediashell 323 52 856 316 00000000 afd0b45c R ps$
More than 30 processes (200+ threads).
![Page 5: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/5.jpg)
5
ActivityManager
WindowManager
AlarmManager
Activity
Kernel
Inter Process Communication
![Page 6: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/6.jpg)
6
Abstraction of Inter Process Communication
Binder
AIDL
IntentMore abstract
![Page 7: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/7.jpg)
7
Inter Process Communication of Android
Intent
The highest level abstraction
Inter process method invocationAIDL: Android Interface Definition Language
binder
kernel driver
ashmem
shared memory
![Page 8: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/8.jpg)
8
Intent (1)
The highest level abstraction IPC in Android
Requests are queued and handled sequentially.
Powerful enough between applications
Implemented using inter process method invocation
![Page 9: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/9.jpg)
9
Intent (2)
Loosely coupling
The sender need not choose the receiver
The sender can specify ”action”. Then proper receiver is chosen and handles it.VIEW + http://... → Browser opens the url.VIEW + geo:0,0?q=Tokyo → Map app shows a map of Tokyo.
CALL + tel:01234567 → Phone app dials the number.
![Page 10: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/10.jpg)
10
Inter process method invocation
used for system services
needs multi-thread programming
wrapped by AIDL to hide complexity
implemented using binder
![Page 11: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/11.jpg)
11
Invoking method via interface
caller
callee
In the same process
![Page 12: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/12.jpg)
12
Inter-process invocation
caller
callee
callee
caller
interface
interface
interface
How?
![Page 13: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/13.jpg)
13
Inter-process invocation
caller
callee
Binder in kernel
callee
caller
Proxy
Binder Thread
Stub
interface
interface
interface
![Page 14: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/14.jpg)
14
android.os.Parcel
”flatten” ”unflatten”
transmit
Delivering arguments of method
![Page 15: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/15.jpg)
15
<<interface>>
Proxy Stub
Describing in UML ...
implements
![Page 16: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/16.jpg)
16
<<interface>>
Proxy Stub
Describing in UML ...
caller
callee
calls
implements
extends
![Page 17: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/17.jpg)
17
<<interface>>
Proxy Stub
AIDL
caller
callee
Auto generated from .aidl file
![Page 18: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/18.jpg)
18
ActivityManager
Kernel
Binder Thread #1
Main Thread
Looperqueue
3:”onPause”is called in mainthread
1:Call ”schedulePauseActivity”across process
Use case: Who calls ”onPause” in Activity?
2:Send message
by Handler
Activity
![Page 19: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/19.jpg)
19
Binder
/dev/binder
Not for general purpose. Tuned for specific transaction.
Multi-thread awareHave internal status per thead
(CF. Socket have internal status per fd.)
![Page 20: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/20.jpg)
20
Comparing binder with socket
socket binder
internal status
associated to FD
associated to PID(FD can be shared among threads in the same process)
read & write operation
as a stream done at once by ”ioctl”
network transparency
Yes Noexpects local only
![Page 21: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/21.jpg)
21
Transaction of Binder (1)
if (ioctl(fd, BINDER_WRITE_READ, &bwt ) >= 0) err = NO_ERROR;else err = -errno;
write buffer
read buffer
write_size
write_consumed
write_buffer
read_size
read_consumed
read_buffer
binder_write_read
![Page 22: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/22.jpg)
22
Transaction of Binder (2)
Process A
Process B
Binder
Process A
Binder
Process B
Copy memory by copy_from _user
Copy memory by copy_to_user
Then, wake up process B
Process A and B have different memory space.They can not see each other.
Kernel
Kernel
![Page 23: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/23.jpg)
23
AshmemAndroid / Anonymous SHared MEMory
subsystem
$(ANDROID_TOP)/system/core/cutils/ashmem.hint ashmem_create_region(const char *name, size_t size) → returns
fd
int ashmem_set_prot_region(int fd, int prot)
int ashmem_pin_region(int fd, size_t offset, size_t len)
int ashmem_unpin_region(int fd, size_t offset, size_t len)
kernel reclaim not ‘pin’ ed memory
Similar to weak reference of Java. useful to implement cache.
android.os.MemoryFile from Java program
![Page 24: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/24.jpg)
24
System Properties of Android
'Key-Value store' type data base for basic system information.
Shared among all processes.
Init process has the master data.
The other processes have read-only copy.
Init process handles write request to the master data.
implemented using ashmem before Gingerbread.
At Gingerbread changed not to use ashmem.
![Page 25: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/25.jpg)
25
Example of System Properties ...[ro.bt.bdaddr_path]: [/sys/module/board_mahimahi/parameters/bdaddr][ro.ril.def.agps.mode]: [2][ro.ril.fast.dormancy.rule]: [1][ro.ril.fd.scron.timeout]: [4][ro.ril.fd.scroff.timeout]: [3][ro.ril.gprsclass]: [10][init.svc.adbd]: [running][ril.reload.count]: [1][init.svc.bootanim]: [stopped][hw.keyboards.0.devname]: [mahimahi-keypad][hw.keyboards.65537.devname]: [mahimahi-keypad][hw.keyboards.131075.devname]: [h2w headset][net.hostname]: [android_200142d4dfd0d25c][dev.bootcomplete]: [1][gsm.version.ril-impl]: [HTC-RIL 2.2.1001G (Jul 16 2010,21:52:13)][gsm.sim.operator.numeric]: [][gsm.sim.operator.alpha]: [][gsm.sim.operator.iso-country]: [][gsm.sim.state]: [ABSENT][gsm.current.phone-type]: [1][wlan.driver.status]: [ok][init.svc.wpa_supplicant]: [running] ...
![Page 26: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/26.jpg)
26
Special Key of System Properties
Starts from ”ro.” is read-only.
”ctl.start” / ”ctl.stop” is command to start/stop the service.
property_set("ctl.stop", "bootanim"); stops boot animation service
Starts from ”init.svc.” shows the state of the service.
![Page 27: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/27.jpg)
27
Reading System Property
Kernel
init Other processes
/dev/__properties__(on tmpfs)
mmap (read/write) mmap (read only)
Just read the property in each process.
![Page 28: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/28.jpg)
28
Writing System Property
Kernel
init Other processes
/dev/__properties__(on tmpfs)
mmap (read/write)
mmap (read only)
Send write request to init through socketsocket
![Page 29: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/29.jpg)
29
Actual code of initialize System Properties
fd = open("/dev/__properties__", O_RDWR | O_CREAT, 0600); if (fd < 0) return -1;
if (ftruncate(fd, size) < 0) goto out;
data = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); if(data == MAP_FAILED) goto out;
close(fd);
fd = open("/dev/__properties__", O_RDONLY); if (fd < 0) return -1;
unlink("/dev/__properties__");
Give this fd to other processes.
No longer access by file name.
$(ANDROID_TOP)/system/core/init/property_service.c
/dev is a tmpfs
![Page 30: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/30.jpg)
30
Resources
3rd session of Yokohama Android Platform clubhttp://www.yokohama.android-pf.org/study/dai-san-kai-benkyou-kai
1st session of Android SDK work grouphttp://www.android-group.jp/index.php?%CA%D9%B6%AF%B2%F1%2FAndroid ...
KMC bloghttp://blog.kmckk.com/archives/3611344.html
http://blog.kmckk.com/archives/3613707.html
http://blog.kmckk.com/archives/3627888.html
http://blog.kmckk.com/archives/3645070.html
http://blog.kmckk.com/archives/3647635.html
http://blog.kmckk.com/archives/3617229.html
![Page 31: Inter-process communication of Android](https://reader033.vdocuments.site/reader033/viewer/2022050613/540874cadab5ca5b348b57bb/html5/thumbnails/31.jpg)
31
Q&A and demo
http://www.kmckk.co.jp/eng/kzma9/http://www.kmckk.co.jp/eng/jet_index.html