コアサービス開発に必要な情報を整理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