fun with binders
TRANSCRIPT
![Page 1: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/1.jpg)
©2015 GlobalLogic Inc. CONFIDENTIAL
![Page 2: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/2.jpg)
©2015 GlobalLogic Inc. CONFIDENTIAL
Fun with Binders
![Page 3: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/3.jpg)
CONFIDENTIAL
1. AIDL Crash Course
2. Binders and Security
3. Tips and Tricks
4. Q&A
Agenda
![Page 4: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/4.jpg)
CONFIDENTIAL©2015 GlobalLogic Inc.
AIDL Crash Course
![Page 5: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/5.jpg)
CONFIDENTIAL
AIDL Crash Course
Process A
Activity
Process B
Service
Target
bindService()AIDL Stub
onBind
AIDL ProxyonServiceConnected
![Page 6: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/6.jpg)
CONFIDENTIAL
AIDL Crash Course
IDummy.aidl
Stub class
Proxy class
IDummy.java
// IDummy.aidlinterface IDummy { void send(String message);}
![Page 7: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/7.jpg)
CONFIDENTIAL
AIDL Crash Courseprivate class Proxy implements IDummy {
IBinder mRemote;
public void send(String text) throws RemoteException {Parcel data = Parcel.obtain();Parcel reply = Parcel.obtain();try {
data.writeString(text);mRemote.transact(Stub.TRANSACTION_send, data, reply,
0);} finally {
data.recycle();reply.recycle();
}}
}
![Page 8: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/8.jpg)
CONFIDENTIAL
AIDL Crash Coursepublic abstract class Stub extends Binder implements IDummy {
private static final int TRANSACTION_send = 1;
protected boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException{
if (code == TRANSACTION_send) {String arg0 = data.readString();send(arg0);return true;
}return false;
}}
![Page 9: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/9.jpg)
CONFIDENTIAL
Process A
transact()
Process B
onTransact()
AIDL Crash Course
Activityshow(“123”)
Binder
Magic
show(“123”)
AIDL Proxy AIDL Stub
Target
![Page 10: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/10.jpg)
CONFIDENTIAL©2015 GlobalLogic Inc.
Binders and Security
![Page 11: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/11.jpg)
CONFIDENTIAL
Binders and Security - Basics
Process BProcess A
Binder
IBinder #1
IBinder #2
IBinder #3
==
==
![Page 12: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/12.jpg)
CONFIDENTIAL
System Process
Binders and Security - Basics
User Process
ActivityManagerActivityManager
Service
WindowManagerWindowManager
Service
PowerManagerWindowManager
Service
...Manager...Manager
Service
![Page 13: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/13.jpg)
CONFIDENTIAL
Binders and Security - PowerManagerpublic final class WakeLock {
private final IBinder mToken = new Binder();
public void acquire() { mService.acquireWakeLock(mToken, ...); }
public void release() { mService.releaseWakeLock(mToken); }
}
![Page 14: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/14.jpg)
CONFIDENTIAL
Binders and Security - InputMethodManagerpublic final class InputMethodManager {
final IInputMethodClient.Stub mClient = new IInputMethodClient.Stub() { // ... }
public boolean showSoftInput(View view, int flags) { // ... return mService.showSoftInput(mClient, flags); }
public boolean hideSoftInputFromWindow(IBinder windowToken, int flags) { // ... return mService.hideSoftInput(mClient, flags); }
}
![Page 15: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/15.jpg)
CONFIDENTIAL©2015 GlobalLogic Inc.
Tips and Tricks
![Page 16: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/16.jpg)
CONFIDENTIAL
Tips and Tricks
Binder
Context.startActivity
Context.sendBroadcast
Context.startService
Context.bindService
ContentResolver.call
...
Parcel
![Page 17: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/17.jpg)
CONFIDENTIAL
Tips and Tricks - Binder & ContentProvider
Process #1
Service
Process #2
Service
Process #N
Service
...
Process #N+1
Activity
Process #N+2
Activity
Process #N+M
Activity
![Page 18: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/18.jpg)
CONFIDENTIAL
Tips and Tricks - Binder & ContentProvider
Process A
ContentProvider
Process B
Activity
Binder / Stub
call
![Page 19: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/19.jpg)
CONFIDENTIAL
Tips and Tricks - Binder & ContentProviderpublic class Dummy {
private static final Uri AUTHORITY = /*...*/; private static IDummy sDummy; private static ContentResolver sResolver = /*...*/;
public static IDummy getProxy() { if (sDummy != null && sDummy.asBinder().pingBinder()) { return sDummy; } Bundle bundle = sResolver.call(AUTHORITY, "get_binder", null, null); return sDummy = IDummy.Stub.asInterface(bundle.getBinder("binder")); }}
![Page 20: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/20.jpg)
CONFIDENTIAL
Tips and Tricks - Binder & ContentProvider
Dummy.getProxy().send("test");
bindService(/**/, new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {
IDummy.Stub.asInterface(service).send("test");}
@Overridepublic void onServiceDisconnected(ComponentName name) {}
});
![Page 21: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/21.jpg)
CONFIDENTIAL
Useful Links● Official Binder documentation
http://developer.android.com/reference/android/os/Binder.html
● Binders as tokens
http://www.androiddesignpatterns.com/2013/07/binders-window-tokens.html
● AIDL and ContentProviders
http://mdev-android.blogspot.com/2014/12/androids-alternative-ipc-approche.html
![Page 22: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/22.jpg)
CONFIDENTIAL©2015 GlobalLogic Inc.
Q&A
![Page 23: Fun with Binders](https://reader035.vdocuments.net/reader035/viewer/2022062220/55cc7ab8bb61eb313d8b481b/html5/thumbnails/23.jpg)
CONFIDENTIAL©2015 GlobalLogic Inc.
Rostyslav Lesovyi
Thank You!