Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up
for free
Practical IPC
Keishin Yokomaku
November 22, 2016
Technology
0
130
Practical IPC
Keishin Yokomaku
November 22, 2016
Tweet
Share
More Decks by Keishin Yokomaku
See All by Keishin Yokomaku
keithyokoma
2
3k
keithyokoma
0
1.4k
keithyokoma
0
290
keithyokoma
3
280
keithyokoma
1
69
keithyokoma
1
1.5k
keithyokoma
0
100
keithyokoma
0
440
keithyokoma
4
230
Other Decks in Technology
See All in Technology
satosiyonezawa
0
150
kanaugust
PRO
0
210
miu_crescent
0
400
chipstar_light
0
490
shirayanagiryuji
1
200
kanaugust
PRO
0
120
oracle4engineer
0
240
autifyhq
1
820
miyamotok
0
100
tutsunom
1
180
techharmony
0
190
tatsy
2
440
Featured
See All Featured
shpigford
370
42k
jponch
103
5.1k
lauravandoore
12
1.7k
holman
288
130k
tenderlove
55
3.5k
jonrohan
1021
390k
notwaldorf
21
2.1k
jnunemaker
PRO
40
4.7k
roundedbygravity
242
21k
eileencodes
114
25k
malarkey
392
61k
malarkey
119
16k
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