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
53
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
640
持続的なアプリ開発のための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
背中から、背中へ /paying forward to community
naitosatoshi
0
170
AWS Summit 2026で見えたSIerにとっての Amazon Quickの位置づけ
maf_0521
0
120
從觀望到全公司落地:AI Agentic Coding 導入實戰 — 流程整合與安全治理
appleboy
0
170
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
190
AI 不只幫你寫 Code: 當專案從 300 暴增到 1500, 我們如何撐住 DevOps
appleboy
0
290
「ビジネスがわかるエンジニア」とは何か?
ryooob
0
410
AIをフル活用してオンコール機能のプロトタイプを2日で作った話 / Building an AI-Powered On-Call Prototype in Just Two Days
nari_ex
0
150
データレイクの「見えない問題」を可視化する
sansantech
PRO
1
240
5分でわかるDuckDB Quack
chanyou0311
4
270
どうして今サーバーサイドKotlinを選択したのか
nealle
0
140
そこにあるから地図ができる~位置を示す"モノ"を愉しむ~ - Interface 2026年6月号GPS特集オフ会 / interface_202606_GPS_offline
sakaik
1
140
飲食店もAIで。レジ締めやハンディシステムをつくってる話 / Using AI for restaurant management
vtryo
0
210
Featured
See All Featured
Building AI with AI
inesmontani
PRO
1
1.1k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1k
Being A Developer After 40
akosma
91
590k
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
870
Game over? The fight for quality and originality in the time of robots
wayneb77
1
210
A designer walks into a library…
pauljervisheath
211
24k
Typedesign – Prime Four
hannesfritz
42
3.1k
RailsConf 2023
tenderlove
30
1.5k
Are puppies a ranking factor?
jonoalderson
1
3.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.4k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
Paper Plane (Part 1)
katiecoart
PRO
0
9.3k
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