Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Practical IPC
Search
Keishin Yokomaku
November 22, 2016
Technology
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Practical IPC
Keishin Yokomaku
November 22, 2016
More Decks by Keishin Yokomaku
See All by Keishin Yokomaku
Base64 in Android
keithyokoma
0
54
One screen, many BottomSheets
keithyokoma
0
460
LazyColumnのitemがViewPortの中で占める領域の割合を知りたい
keithyokoma
0
750
Build apps for Cars
keithyokoma
0
590
Save the state
keithyokoma
0
630
Either in Kotlin
keithyokoma
0
650
持続的なアプリ開発のためのDXを支える技術
keithyokoma
2
5.6k
Make the objects serializable with kotlinx.serialization
keithyokoma
0
5.3k
Kotlin で書く Gradle Custom Tasks
keithyokoma
0
590
Other Decks in Technology
See All in Technology
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
3
340
世界、断片、モデル。そして理解
ardbeg1958
1
110
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
6
3.2k
シンガポールで登壇してきます
yama3133
0
120
kintone の AI コワーカーを、 Anthropic にエージェントを"ホストさせて"作った話 #devkinmeetup
sugimomoto
0
100
“それは自分の仕事じゃない"を越えて行け
yuukiyo
0
240
Devsumi 2026 Summer 人もAIも使える共通基盤を事業の加速装置にする~デザインシステム運用に学ぶ組織レバレッジ~ 渡辺 凌央
legalontechnologies
PRO
0
120
Claude Code公式skillで 自分の仕事を少しずつ手放そう!(Claude Code開発ノウハウ大公開スペシャル by クラスメソッド)
kaym
1
330
AIと共生する開発者プラットフォーム:バクラクのモノレポ×マイクロサービス基盤
sakajunquality
2
3.5k
公式ドキュメントの歩き方etc
coco_se
0
100
地域 SRE コミュニティ最前線 / SRE NEXT 2026 Discussion Night Track C
muziyoshiz
0
220
Genie Ontologyは銀の弾丸かを考える / Is Genie Ontology a Silver Bullet?
nttcom
0
260
Featured
See All Featured
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.3k
Rails Girls Zürich Keynote
gr2m
96
14k
GitHub's CSS Performance
jonrohan
1033
470k
Building Adaptive Systems
keathley
44
3.1k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
150
Discover your Explorer Soul
emna__ayadi
2
1.2k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Bash Introduction
62gerente
615
220k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.8k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
420
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
200
Transcript
Practical IPC Keishin Yokomaku / shibuya.apk #11 @ GMO Yours
Practical IPC About Me ▸ Keishin Yokomaku ▸ Drivemode, Inc.
/ Principal Engineer ▸ KeithYokoma: GitHub / Twitter / Qiita / Tumblr / Stack Overflow ▸ Books: Mobile App Dev Guide / Android Academia / Grimoire of Android ▸ Fun: Gymnastics / Cycling / Photography / Motorsport ▸ Today’s Quote: “Power is everything.” 2
Practical IPC 3
Practical IPC Inter-Process Communication (abbr. IPC) 4 Process A Process
B
Practical IPC Inter-Process Communication (abbr. IPC) 5 App A App
B
Practical IPC Inter-Process Communication (abbr. IPC) 6 App A System
Practical IPC Inter-Process Communication (abbr. IPC) 7 Client Server
Practical IPC IPC ͕ΘΕ͍ͯΔॴ ▸ PackageManager ▸ e.g. PackageManager ͕ಈ͍͍ͯΔϓϩηεʹର͢Δ͍߹Θͤ
▸ Intent ▸ e.g. ϥϯνϟʔ͔ΒΞϓϦͷىಈ ▸ android.media.session, android.media.browser ▸ Android Auto ༻ͷΦʔσΟΦΞϓϦ͚ϑϨʔϜϫʔΫ 8
Practical IPC ࣗͰ IPC ͯ͠ΈΔ ▸ ࡞Δͷ ▸ AIDL ▸
Service 9
Practical IPC AIDL ▸ Android Interface Definition Language ▸ Java
ʹࣅͨจ๏Λ࣋ͬͨಛผͳݴޠ ▸ ΠϯλϑΣʔεΛఆٛ͢ΔͨΊʹ͏ ▸ ࣮ࡍͷॲཧ Java Ͱهड़͢Δ ▸ aidl ઐ༻ͷσΟϨΫτϦʹೖΕ͓ͯ͘ 10
Practical IPC AIDL ͷهड़ྫ package com.github.keithyokoma.aidl; interface SampleAidl { String
getSomething(int value); } 11
Practical IPC ίϯύΠϧΤϥʔʹͳΔ AIDL ͷهड़ྫ 1 package com.github.keithyokoma.aidl; interface SampleAidl
{ String getSomething(int value); String getSomething(int value, boolean flag); } 12 ΦʔόʔϩʔυͰ͖ͳ͍
Practical IPC ίϯύΠϧΤϥʔʹͳΔ AIDL ͷهड़ྫ 2 package com.github.keithyokoma.aidl; interface SampleAidl
{ String getSomething(int value); void doSomething(CustomObject object); } 13 ϓϦϛςΟϒܕɾStringܕɾҰ෦ͷίϨΫγϣϯܕҎ֎ͷܕಛผʹએݴ͠ͳ͍ݶΓ͑ͳ͍
Practical IPC ಠࣗΫϥεΛ IPC Ͱ͏ͨΊͷ parcelable Ωʔϫʔυ package com.github.keithyokoma.aidl; interface
SampleAidl { String getSomething(int value); void doSomething(CustomObject object); } parcelable CustomObject; 14 CustomObject Parcelable Λ࣮γͨΫϥεͰ͋Δ͜ͱΛ໌ࣔ
Practical IPC ඇಉظॲཧͷͨΊͷ AIDL ͷه๏ package com.github.keithyokoma.aidl; oneway interface SampleAidl
{ String getSomething(int value); } 15 oneway Ωʔϫʔυ͕ͭ͘ͱɺϝιουݺͼग़͕͠ଈ࠲ʹฦ٫͞Ε݁Ռඇಉظʹฦͬͯ͘Δ
Practical IPC AIDL Λͬͨ IPC ͷਤ 16 Client Server Proxy
Stub IBinder
Practical IPC AIDL Λͬͨ IPC ͷਤ 17 Client Server Proxy
Stub IBinder AIDL Λॻ͍ͯϏϧυ͢Δͱࣗಈੜ͞ΕΔ
Practical IPC AIDL Λͬͨ IPC ͷਤ 18 Client Server Proxy
Stub IBinder ࣮ࡍʹlibbinder binder Ϟδϡʔϧͷॲཧ͕ؒʹ͋Δ
Practical IPC Service ͷ࣮1 public class MyService extends Service {
private final SampleAidl.Stub mStub = new SampleAidl.Stub() { @Override public String getSomething(int value) { return “Hello World!”; } } @Nullable @Override public IBinder onBind(Intent intent) { return mStub; } } 19
Practical IPC Service ͷ࣮1 public class MyService extends Service {
private final SampleAidl.Stub mStub = new SampleAidl.Stub() { @Override public String getSomething(int value) { return “Hello World!”; } } @Nullable @Override public IBinder onBind(Intent intent) { return mStub; } } 20
Practical IPC Service ͷ࣮1 public class MyService extends Service {
private final SampleAidl.Stub mStub = new SampleAidl.Stub() { @Override public String getSomething(int value) { return “Hello World!”; } } @Nullable @Override public IBinder onBind(Intent intent) { return mStub; } } 21
Practical IPC Service ͷ࣮2 <manifest> <application> <service android:name=“.MyService” android:exported=“true” android:enabled=“true”>
<intent-filter> <action android:name=“com.example.SampleAidl.ACTION_CONNECT” /> </intent-filter> </service> </application> </manifest> 22
Practical IPC Service ͷ࣮2 <manifest> <application> <service android:name=“.MyService” android:exported=“true” android:enabled=“true”>
<intent-filter> <action android:name=“com.example.SampleAidl.ACTION_CONNECT” /> </intent-filter> </service> </application> </manifest> 23
Practical IPC Service Λݺͼग़͢ଆͷ࣮1 public class MyActivity extends Activity {
private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = SampleAidl.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mService = null; } } private SampleAidl mService; } 24
Practical IPC Service Λݺͼग़͢ଆͷ࣮1 public class MyActivity extends Activity {
private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = SampleAidl.Stub.asInterface(service); } @Override public void onServiceDisconnected(ComponentName name) { mService = null; } } private SampleAidl mService; } 25
Practical IPC Service Λݺͼग़͢ଆͷ࣮2 public class MyActivity extends Activity {
private final ServiceConnection mConnection = // …… private SampleAidl mService; public void onClickStartConnection(View view) { Intent intent = new Intent(“com.sample.SampleAidl.ACTION_CONNECT”); bindService(intent, mConnection, BIND_AUTO_CREATE); } @Override protected void onDestroy() { unbindService(mConnection); super.onDestroy(); } } 26
Practical IPC Service Λݺͼग़͢ଆͷ࣮2 public class MyActivity extends Activity {
private final ServiceConnection mConnection = // …… private SampleAidl mService; public void onClickStartConnection(View view) { Intent intent = new Intent(“com.sample.SampleAidl.ACTION_CONNECT”); bindService(intent, mConnection, BIND_AUTO_CREATE); } @Override protected void onDestroy() { unbindService(mConnection); super.onDestroy(); } } 27
Practical IPC Service Λݺͼग़͢ଆͷ࣮3 public class MyActivity extends Activity {
private final ServiceConnection mConnection = // …… private SampleAidl mService; public void onClickGetSomething() { try { Toast.makeText(getApplicationContext(), mService.getSomething(1), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { // something went wrong } } } 28
Practical IPC Service Λݺͼग़͢ଆͷ࣮3 public class MyActivity extends Activity {
private final ServiceConnection mConnection = // …… private SampleAidl mService; public void onClickGetSomething() { try { Toast.makeText(getApplicationContext(), mService.getSomething(1), Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { // something went wrong } } } 29
Practical IPC ͳͥ IPC Λ͏ͷ͔ ▸ ଞͷΞϓϦͱόοΫάϥϯυͰ࿈ܞ͍ͨ͠ ▸ e.g. ଞͷΞϓϦʹσʔλΛૹΓࠐΜͰԿΒ͔ͷॲཧΛͯ͠Β͍͍ͨ
▸ e.g. ଞͷΞϓϦʹσʔλͷऔಘΛཧͯ͠Β͍͍ͨ ▸ e.g. ଞͷΞϓϦ͕͍࣋ͬͯΔίϯςϯπΛૢ࡞͍ͨ͠ ▸ etc… 30
Practical IPC ͳͥ IPC Λ͏ͷ͔ ▸ ྑ͍ͱ͜Ζ ▸ Activity ͷΈͳΒͣɺৗறܕ
Service Ͱ͑Δ ▸ όΠϯυҎ֎Ͱ Intent (broadcast ؚΉ) ͷΈΛհ͞ͳ͍ͷͰಈ࡞͍ ▸ ਏ͍ͱ͜Ζ ▸ ཧίετ͕͔͞Ή(֎෦ެ։લఏͳͷͰόʔδϣϯཧ͕ඞཁɾޙड़) ▸ ؋ΞϓϦ͕ແ͍ͱʹཱͨͳ͍ 31
Practical IPC IPC ͷ͍ॴ ▸ SDK ͱͯ͠ΞϓϦͷಛఆͷػೳɾAPI Λެ։͢Δ ▸ e.g.
ΦʔσΟΦͷ࠶ੜίϯτϩʔϧػೳΛ AIDL Ͱఆٛ͢Δ ▸ e.g. AIDL ܦ༝ͰΞϓϦʹΞυΦϯػೳΛՃ͢Δ ▸ etc… 32
Practical IPC IPC Λ͏ͱ͖ͷҙ ▸ IPC Ͱͷ௨৴૬खͷݕূ ▸ IPC Ͱఆ͞ΕΔྫ֎
▸ AIDL ͷόʔδϣϯཧ ▸ ProGuard ͷઃఆ 33
Practical IPC IPC Ͱͷ௨৴૬खͷόϦσʔγϣϯ ▸ ڐՄͨ͠௨৴૬खͱ͚ͩ IPC ͍ͨ͠ ▸ Կ͠ͳ͍ͱ୭ͱͰ
IPC Ͱ͖ͯ͠·͏ ▸ ηΩϡϦςΟϦεΫ ▸ ଓ࣌ʹ୭͕௨৴ΛࢼΈ͍ͯΔ͔ݕূ͢Δ ▸ μϝͳ૬खͱͷίωΫγϣϯམͱ͢ 34
Practical IPC IPC Ͱͷ௨৴૬खͷόϦσʔγϣϯ ▸ ݕূʹ͏ใ ▸ ύοέʔδ໊ ▸ ॺ໊ͷϋογϡ
▸ Android Auto ͚ API ͷ MediaBrowserService ͕ྑ͍ྫ ▸ xml ʹڐՄ͢Δύοέʔδ໊ͱॺ໊ͷϋογϡͷҰཡΛ͓࣋ͬͯ͘ ▸ http://bit.ly/2gdkUJP 35
Practical IPC ߟྀ͓͖ͯ͘͠ྫ֎ ▸ TransactionTooLargeException ▸ BadParcelableException ▸ DeadObjectException 36
Practical IPC TransactionTooLargeException 37
Practical IPC TransactionTooLargeException ▸ ϓϩηεؒ௨৴Ͱ͑ΔϝϞϦۭؒͷ੍ݶΛ͑ͨ ▸ 1ϓϩηεʹׂΓͯΒΕΔϓϩηεؒ௨৴༻ͷϝϞϦۭؒ1mB ▸ ճආࡦ ▸
ಉ࣌ʹͨ͘͞Μϓϩηεؒ௨৴͠ͳ͍ ▸ Bitmap ͳͲڊେͳσʔλΛϓϩηεؒ௨৴ʹͷͤͳ͍ ▸ Ͳ͏ͯ͠ Bitmap Λ͏ͱ͖ɺBitmap ͷαΠζΛࢦఆͰ͖ΔΑ͏ʹ͢Δ 38
Practical IPC Don’t interface RemoteService { void setBitmap(in Bitmap image);
} 39 Do interface RemoteService { void setBitmap(in Uri imageUri); }
Practical IPC BadParcelableException 40
Practical IPC BadParcelableException 41 ▸ ޓੑͷͳ͍ Parcelable Λड͚औͬͨ ▸ Ϋϥεϩʔμͷҧ͍ΛߟྀʹೖΕΑ͏
▸ ϑΟʔϧυͷՃɾআ৻ॏʹʢSerializableΑΓ͍͞͠ʣ ▸ ճආࡦ ▸ ΫϥεϩʔμΛஔ͖͑Δ
Practical IPC DeadObjectException 42
Practical IPC DeadObjectException ▸ ࢮΜͰ͍Δϓϩηεʹ௨৴ΛࢼΈͨ ▸ ࢮମऽΓɺμϝઈର ▸ ճආࡦ ▸
IBinder.DeathRecipient ServiceConnection Ͱࢮ׆ࢹ ▸ SDK ͱͯ͠ϥοϓͨ͠ΫϥεΛఏڙ͢Δ߹ɺࢮΜͩ͜ͱΛίʔϧόοΫ͢ΔΠ ϯλϑΣʔεΛผ్༻ҙ͢ΔͱΑ͍ 43
Practical IPC DeadObjectException private RemoteService mService; private boolean mIsBound; private
ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName component, IBinder service) { mService = ((RemoteService.Binder) service).getService(); mIsBound = true; } @Override public void onServiceDisconnected() { mIsBound = false; } } 44
Practical IPC DeadObjectException public static abstract class Callback implements IBinder.DeathRecipient
{ @Override public void binderDied() { onDestroy(); } public abstract void onDestroy(); } private IBinder mBinder; public void registerCallback(Callback callback) { mBinder.asBinder().linkToDeath(callback, 0); } public void unregisterCallback(Callback callback) { mBinder.asBinder().unlinkToDeath(callback, 0); } 45
Practical IPC AIDL ͷόʔδϣϯཧ ▸ ϝιουΛΦʔόʔϩʔυ͍ͨ͠ ▸ ෆՄೳͳͷͰผ໊ʹ͢Δ͔͠ͳ͍ ▸ όουϊϋΛ͏(ޙड़)
▸ Parcelable Λมߋ͍ͨ͠ ▸ ϑΟʔϧυͷՃͷͱ͖ɺParcel ͔Βͷ෮ؼॻ͖ࠐΈͷॱ൪࠷ޙʹՃ 46
Practical IPC AIDL ͷόʔδϣϯཧʹ͓͚Δόουϊϋ ▸ ΦʔόʔϩʔυͰ͖ͳ͍ ▸ ࣮ Service ͷ࣮ʹϝιου͕͋Γ͑͢͞ΕΦʔόʔϩʔυͰ͖Δ
▸ e.g. ݺͼग़͠ઌͷ AIDL Ͱ hoge() ϝιουΛ hoge(int) ʹมߋɺͨͩ͠ Service ͷ࣮ʹ hoge() ͯ͋͠Δ => ݺͼग़͠ݩͷΞϓϦͷ AIDL ʹ hoge() ͔͠ͳͯ͘ hoge() ͪΌΜͱݺΔ 47
Practical IPC ProGuard ▸ ϝιου໊ͷಡԽඞͣճආ͢Δ ▸ ϝιου໊͕ղܾͰ͖ͳ͘ͳͬͯࢮΜͰ͠·͏ ▸ AIDL ΛؚΊͨ
SDK ϥΠϒϥϦΛ͢ΔͳΒɺProGuard ͷઃఆಉࠝ͢Δ 48
·ͱΊ 49
Practical IPC ·ͱΊ ▸ AIDL ͷ͍ॴ ▸ ଞͷΞϓϦʹࣗͷΞϓϦͷͭػೳΛެ։͢Δ ▸ ΞυΦϯՃɺσʔλͷऔಘɾૹ৴ɺίϯςϯπͷૢ࡞ͳͲ
▸ SDK ͱͯ͠ ▸ Intent ͷΑ͏ͳதؒϨΠϠ͕ͳ͘ͳΔͷͰಈ࡞͍ ▸ ίʔϧόοΫΛ༻ҙͯ͠։ൃऀϑϨϯυϦʔʹ͢Δ 50
Practical IPC ·ͱΊ ▸ AIDL ͷ੍ ▸ ΦʔόʔϩʔυෆՄ ▸ ϓϦϛςΟϒܕɺStringܕɺҰ෦ίϨΫγϣϯܕҎ֎ParcelableΛ࣮
▸ Parcelable ͷ੍ ▸ ڊେͳΦϒδΣΫτϝϞϦͷ੍Λߟ͑Δ͜ͱ ▸ ΦϒδΣΫτͷޓੑʹؾΛ͚ͭΔ 51
Practical IPC ·ͱΊ ▸ ProGuard ▸ IPC ʹؔΘΔ෦ಡԽΛճආ͢Δ ▸ ϓϩηεͷࢮ׆ࢹ
▸ ࢮΜͩϓϩηεʹ௨৴Λ͠ͳ͍ ▸ ௨৴૬खͷόϦσʔγϣϯ ▸ ୭ʹͰެ։͍͍ͯ͠ػೳ͔Ͳ͏͔Ͱ੍ΛܾΊΔ 52
Practical IPC Keishin Yokomaku / shibuya.apk #11 @ GMO Yours
Practical IPC Reference ▸ Deep Dive into Android IPC/Binder Framework
http://bit.ly/2dsFzaI ▸ Android Binder-IPC http://bit.ly/2gFKWcl ▸ Binder ͷ͡ΊͷҰาͱ Android ͷϓϩηεؒ௨৴ http://bit.ly/2fY9lWi ▸ Binder ͷ͡ΊͷҰา http://bit.ly/2fNs35k ▸ Open Binder http://bit.ly/2fNlP5h ▸ Intent ͷ֓ཁ http://bit.ly/2fANsvs 54
DroidKaigi Registration has started! http://bit.ly/2gFFK8z 55