コアサービス開発に必要な情報を整理3
こちらによくまとめられたスライドがありました。参考にさせて頂きました。
http://blog.kmckk.com/archives/3676340.html#more
以下自分用メモメモ
メモ1 androidの素の様子
デバイスのプロセスツリー
init |-zygote-+-system_server-+- |-android.process.acore |-android.process.media |-com.android.phone |-com.adnroid.alarmclock |-com.android.music |-com.android.mms |-com.google.process.gapps |-com.google.android.apps.maps |-mediaserver-+-{mediaserver} | |-{mediaserver} | |-rild-+-{rild} | |-{rild} | `-{rild} | |-servicemanager
chiaki@ubuntu:~/mydroid$ vi frameworks/base/cmds/servicemanager/service_manager.c chiaki@ubuntu:~/mydroid$ vi ./frameworks/base/cmds/servicemanager/binder.c struct binder_state *binder_open(unsigned mapsize) { struct binder_state *bs; bs = malloc(sizeof(*bs)); if (!bs) { errno = ENOMEM; return 0; } bs->fd = open("/dev/binder", O_RDWR); int binder_write(struct binder_state *bs, void *data, unsigned len) { …略 res = ioctl(bs->fd, BINDER_WRITE_READ, &bwr); …略
その他で/dev/binderを使っているところ
chiaki@ubuntu:~/mydroid$ view frameworks/base/libs/binder/ProcessState.cpp static int open_driver() { if (gSingleProcess) { return -1; } int fd = open("/dev/binder", O_RDWR); ||> Javaから使う >|cs| frameworks/base/core/java/android/os/ServiceManager.java frameworks/base/core/java/android/os/ServiceManagerNative.java frameworks/base/core/java/android/os/IServiceManager.java android.os.ServiceManager: IBinder getService(String name) IBinder checkService(String name) Binder DriverにaddServiceを加える void addService(String name, IBinder service) String[] listServices()
メモ2 素の実装
1.IServiceManager、IPCThreadStateを使ってコアサービスをBinderDriverに加える(BBinder::onTransact())ためのクラスを作る
2.1.のオブジェクトを作成してBinderDriverに実際にコアサービスを追加する
3.2を利用するネイティブクラスでは、ServiceManagerのインターフェース(BpBinderのIBinderインターフェース)を使ってサービス2を使う
4.Nativeコードからサービス2を呼び出せる
5.JavaからはNativeコード4を呼び出してサービス2の結果を得られる
Java→JNINativeメソッド→クラス3(のbinder)→IBinderインターフェース→BpBinder→IBinderインターフェース→サービス2
メモ3 メモ2+Proxyパターン
BpBinderを触らず、Proxyを作ってBinderに異なるインターフェースを持たせる
Java→JNINativeメソッド→Nativeのクラス3→クラス3のインターフェース→プロキシクラス→IBinderインターフェース→BpBinder→IBinderインターフェース→サービス2
メモ4 メモ3+Stubパターン
onTransact()をStubで実装する。
Java→JNINativeメソッド→Nativeのクラス3→クラス3のインターフェース→プロキシクラス→IBinderインターフェース→Stub(onTransact)→(インターフェースを介して)→サービス2