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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
攻撃者視点で考えるDetection Engineering
cryptopeg
3
2k
人材育成分科会.pdf
_awache
4
290
Bucharest Tech Week 2026 - Guardians of the Cloud-Native Galaxy
edeandrea
PRO
0
120
RAG を使わないという選択肢
tatsutaka
1
270
2026TECHFRESH畢業分享會 - AI 時代的人生存檔點
line_developers_tw
PRO
0
1.3k
2026TECHFRESH畢業分享會 - Lightning Talk - E起 See See : 電商推薦讀心術? 數據說了算
line_developers_tw
PRO
0
1.3k
現地で盛り上がった WWDC26 Keynote
zozotech
PRO
1
260
日本 Fintech 未来予測レポート 2027〜2028年(オリジナル版)
8maki
0
2.3k
SONiCの統計情報を取得したい
sonic
0
220
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
150
AIのReact習熟度を測る
uhyo
2
640
2026TECHFRESH畢業分享會 - 葬送的通靈師:化系統與用戶雜訊成行動訊號
line_developers_tw
PRO
0
1.3k
Featured
See All Featured
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
150
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
[SF Ruby Conf 2025] Rails X
palkan
2
1.1k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
170
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
600
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
66
55k
The agentic SEO stack - context over prompts
schlessera
0
820
From π to Pie charts
rasagy
0
210
Accessibility Awareness
sabderemane
1
140
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
140
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
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