SlideShare a Scribd company logo
1 of 81
Download to read offline
Android プロセス間通信の仕組み
                   (Android IPC Mechanism)

Jim Huang (黃敬群)
Developer, 0xlab
                                                          jserv@0xlab.org
                                               March 19, 2012 / 南台科大



http://www.slideshare.net/jserv/android-ipc-mechanism を許可を得て@magoroku15が翻訳
Rights to copy
                                                                              © Copyright 2012 0xlab
                                                                                    http://0xlab.org/

                                                                                    contact@0xlab.org
                                                   Corrections, suggestions, contributions and translations
 Attribution – ShareAlike 3.0                                                                are welcome!

 You are free                                                      Latest update: Mar 21, 2012

  to copy, distribute, display, and perform the work
  to make derivative works
  to make commercial use of the work
 Under the following conditions
        Attribution. You must give the original author credit.
        Share Alike. If you alter, transform, or build upon this work, you may
        distribute the resulting work only under a license identical to this one.
  For any reuse or distribution, you must make clear to others the license terms
of this work.
  Any of these conditions can be waived if you get permission from the
copyright holder.
 Your fair use and other rights are in no way affected by the above.
 License text: http://creativecommons.org/licenses/by-sa/3.0/legalcode
                                                                                                      2
この資料の内容
•   AndroidとBinder IPC
•   デザインパターン
•   Binderの構造
•   Graphicsでの利用例




                         3
ANDROIDとBINDER IPC


                     4
Androidのタスク
       Process A        Process B



Task      Activity         Activity



                           Content
          Activity
                           Provider


                          .apk package
          Service



         .apk package

                                         5
Component View
• コンポーネントタイプ
 –   Activity
 –   Service
 –   Content Provider
 –   Broadcast Reciver




                               6
Application Components System




                 Application Components System
                                                 7
IPC = Inter-Process Communication
          プロセス間通信


                  Activity
       Activity              Window     Alarm
       Manager               Manager   Manager




  Kernel




                                                 8
なぜIPCなのか
• それぞれのプロセスは固有のアドレス空間を
  持ち、 分離・保護されている
• 2つの異なるプロセス間が直接かかわりを
  持って、問題を引き起こさないようにしている
• 場合によっては2つのプロセスの間の通信が
  必要となる



                          9
IPCの例
• Linuxの場合
 – Signal             シグナル
 – Pipe               パイプ
 – Socket             ソケット
 – Semaphore          セマフォ
 – Message queue      メッセージキュー
 – Shared memory      共用メモリ
• Androidの場合
 – Binder             Lightweight RPC を提供

                                        10
Binderの歴史
• Palm社がOpenBinderとして開発
  – Dianne Hackbornが開発リーダ
• Android BinderはOpenBinderのカスタマイズと再実装
  – 手続きとデータを他のプロセスに送って実行する




                                         11
背景
• アプリケーションとサービスはそれぞれ異なる
  プロセスで実行しているが、相互の通信と
  データの共有が必要
• IPCは処理のオーバーヘッドとセキュリティ
  ホールをもたらす場合がある




                      12
Androidでの解決 Binder
•   プロセス間通信をドライバで実装
•   共用メモリを利用した高速処理
•   処理要求のためのプロセス毎にスレッドプールを用意
•   参照カウントとプロセスと超えてオブジェクトの参照
•   プロセス間の同期呼び出し

    “In the Android platform, the binder is used for
    nearly everything that happens across processes
    in the core platform. " – Dianne Hackborn
    https://lkml.org/lkml/2009/6/25/3


                                                       13
Binder: IPCの抽象化
• Intent
   – 高位の抽象化
• AIDL
   – Android InterfaceDefinition Language
   – プロセス間通信呼び出し                                        More abstract
• Binder                              Intent
   – カーネルドライバ
• Ashmem                                    AIDL
   – 共用メモリ

                                               Binder




                                                                    14
手続きの呼び出し


   caller




   callee


同じプロセスの場合



            15
プロセス間の手続き呼び出し
                     caller
                              interface



caller
         interface
                     どうやって?
callee

                              interface


                     callee
                                          16
プロセス間の手続き呼び出し
                        caller
                                         interface


                        Proxy
caller
         interface    Binder in kernel


                     Binder Thread
callee
                          Stub
                                         interface


                        callee
                                                     17
デザインパターン


           18
Binderを用いた場合
• Proxy方式
• Mediator方式
• Bridge方式




                      19
Proxy方式
• プロキシがネットワーク接続、メモリ上の巨大オブジェ
  クト、ファイル、その他すべての資源を仲介
 – 処理が重く、複製ができない場合がある




                          20
AndroidのProxy方式
• Binder が手続き呼び出しと関連する全てのデータをLinuxが扱える
  レベルに分解
• 送信元のアドレス空間から、送信先のアドレス空間へ転送
• 転送後は送信先でデータを再構成して手続きを実行


   システムで用意



   AIDLでインタ
   フェースを生成


     アプリで記述


               リモート側   ローカル側         21
Mediator方式
• オブジェクト間の通信はmediatorオブジェクト
  がカプセル化する




                              22
Bridge方式
• 抽象化部分と実装部分を分離し、それぞれの独
  立性を保持




                      23
Android: BridgeとMediatorの併用


             Java と C++によるBridge方式




Mediator方式

                                     24
UMLでの表現


        <<interface>>

                   implements


Proxy                   Stub




                                25
UMLでの表現
                                 caller



        <<interface>>              calls


                   implements


Proxy                   Stub

                               extends

                        callee


                                           26
AIDL
.aidl ファイルから自動生成                           caller



                  <<interface>>




          Proxy                   Stub



                                  callee

                                                    27
ActivityのonPause()を呼ぶのは誰か?
             2
              Handlerを利用して
             プロセス内でメッセージ
                   を送る                   Activity
                                                    3
                                                        Main threadから
                     queue                               OnPause() が
                                          Looper         呼び出される

  Activity
  Manager                                  Main
                      Binder              Thread
                     Thread #1




Kernel           1
                        プロセスを跨いで
                     ”schedulePauseActivity”
                           を呼び出す
                                                                  28
IPC Interaction in Android


 2              1
      call          getService
 interface




Framework


                                     29
Binderの動作

Process A               Process B




                                    30
BINDERの内部処理


              31
用語
• Binder
  – Binder Object
     • Binderインターフェイスが生成するクラスのインスタンス
     • 1つのBinder objectは複数のBinderを実装する
• Binder Protocol
  – IBinder インターフェイス
     • 事前に定義されたBinderが実装可能な手続き、プロパティ、
       イベントの集合
  – Binder Token
     • Binderを識別するユニークな数値

                                         32
Binderの機能
•   シンプルなプロセス間メッセージング
•   Managing/管理
•   Identifying/識別
•   Calls/呼び出し
•   Notification/通知
•   Binder as a security access token
    – セキュリティアクセストークン


                                        33
Binderの機能
• Binder framework は単純なプロセス間メッセージ以上
  の機能を備えている
• 遠隔の手続きをローカルな手続きと同様に呼び出す
  事ができる




                                  34
Binderプロトコル




・あるプロセスが他のプロセスにデータを送る事をトランザクションと呼ぶ
・送るデータをトランザクションデータと呼ぶ




                                 35
Service Manager (SM)
• あらかじめ、アドレスがわかっている特殊なBinderノード
  – クライアントは接続先のBinderのアドレスを知らない
  – Binder interfaceだけが自分のアドレスを知っている
• Binder Interfaceは自分の名前とトークンをSMに登録する
  – クライアントは利用するサービス名をSMに問い合わせてBinder
    のアドレスを解決する




                                        36
SMからサービスの一覧を取得
$ adb shell service list
Found 71 services:
0       stub_isms: [com.android.internal.telephony.ISms]
1       stub_phone: [com.android.internal.telephony.ITelephony]
2       stub_iphonesubinfo:
               [com.android.internal.telephony.IPhoneSubInfo]
..
5       stub_telephony.registry:
           [com.android.internal.telephony.ITelephonyRegistry]
...
7       stub_activity: [android.app.IActivityManager]
...
9       phone: [com.android.internal.telephony.ITelephony]
…
56      activity: [android.app.IActivityManager]
...
64      SurfaceFlinger: [android.ui.ISurfaceComposer]
...
                                                                  37
ActivityManagerの手続き呼び出し
$ adb shell service list
...
56      activity: [android.app.IActivityManager]
...
$ adb service call activity 1598968902
Result: Parcel(
  0x00000000: 0000001c 006e0061 00720064 0069006f '....a.n.d.r.o.i.'
  0x00000010: 002e0064 00700061 002e0070 00410049 'd...a.p.p...I.A.'
  0x00000020: 00740063 00760069 00740069 004d0079 'c.t.i.v.i.t.y.M.'
  0x00000030: 006e0061 00670061 00720065 00000000 'a.n.a.g.e.r.....')

 public abstract interface IBinder {
     ...
     field public static final int INTERFACE_TRANSACTION
         = 1598968902; // 0x5f4e5446
     …
 }                       Source: frameworks/base/api/current.txt
                                                                        38
Serviceとの関係
$ adb service call phone 1 s16 "123"
Result: Parcel(00000000 '....')
      電話アプリに”123”と表示される
      parameter “1” → dial()
      s16 "123" → String("123")
$ adb shell service list
Found 71 services:
...
9         phone: [com.android.internal.telephony.ITelephony]




interface ITelephony {
    /* Dial a number. This doesn't place the call. It displays
     * the Dialer screen. */
    void dial(String number);
                                                                        Source: frameworks/base/
                                      telephony/java/com/android/internal/telephony/ITelephony.aidl

                                                                                                39
Binderの実装レイヤ
       Javaで記述




       C++で記述




       Cで記述


                 40
APIレイヤ
   • AIDLはリモートサービ
     スの実装を容易にする
   • AIDLパーサが以下を生
     成しミドルウェアを隠ぺ
     いする
    – Proxy class
    – Stub class
    – Java API Wrapper



                         41
AIDL
•   データ型
•   Javaプリミティブ
•   コンテナ
•   String,List,Map,CharSequence,List<>,多次元配列、
•   Parcelable
•   Interface Reference
•   方向 in, out, inout, oneway
•   Android os Ibinder FLAG_ONEWAY
                                            42
AIDL コンパイラ
                                        // Interface
 • Javaのみをサポート
                                        interface IRemoteService
 • StubとProxyを生成                        {
                                            void ping();
                                        }
                         Client

                      IRemoteService mService =
                          IRemoteService.Stub.asInterface(servic
     Server
public class RemoteService extends Service {
    public IBinder onBind(Intent intent) { return mBinder; }
    private final IRemoteService.Stub mBinder =
        new IRemoteService.Stub() {
            public void ping() { // Nothing }
    };
}
                                                                   43
タイトル




       44
ParcelsとMarshalling
• プロセス間メッセージの仕組み
• オブジェクト指向の外観にparcelと呼ぶデータ
  を飛ばす
• Parcelを組み立てる処理をMarshallingと呼ぶ
• Parcelからobjectを生成する処理を
  unmarshallingと呼ぶ



                              45
Parcel
• Marshalling プロセスの境界を越えて、データ
  を転送する
 – ネイティブなバイナリで表現
• ほとんどのコードはAIDLが生成
• Extensible - Parclabe




                                46
android.os.Parcel
引数を受け渡す仕組み




  展開して     転送して          組み立て
                                47
Parceelの定義
        • IBinderを経て送
          信可能なメッ
          セージのコンテ
          ナ
        • Parcelはフラット
          に展開したデー
          タと転送先で有
          効なオブジェクト
          して利用可能な
          データを含む

                    48
Parcelのrepresentation
• Parcelは汎用的なserializationでは無い
 – 高速なIPCのためのClass API
 – 永続的なストレージにparcelを置く事は不適切
• 基本データ型を読み・書きする機能
 –writeByte(byte) / readByte()
 –writeDouble(double) / readDouble()
 –writeFloat(float) / readFloat()
 –writeInt(int) / readInt()
 –writeLong(long) / readLong()
 –writeString(String) / readString()

                                       49
Parcelable
• ParcelabeプロトコルはParcelが自身を読み書
  きする効率的なプロトコル
 – writeParcelable(Parcelable, int)
 – readParcelable(ClassLoader)
 – writeParcelableArray(T[],int)
 – readParcelableArray(ClassLoader)
• これらの手続きはクラスタイプとparcelへの
  データ書き込みの双方で用いられて、後に適
  切なクラスローダを用いて復元される

                                      50
Bundles
• 特別な型付けのないコンテナをBundleと呼び、
  ヘテロジニアスな値をKey/Valueのマップで保
  持
• これは、データの読み書きの性能向上に効果
  があり、Parcelの中にデータをmarshallingする
  際に発生する、型付け無APIが型付けに関わ
  るディバックの難しさを避ける


                               51
ミドルウェアレイヤ
    • ユーザ空間に実装さ
      れた、C++のBinderフ
      レームワーク
    • スレッドの生成と管理
      のための構造と手続き
      を実現している
    • Binderのカーネルドラ
      イバを呼び出す

                       52
• frameworks/base/include/binder/IServiceManager.h
    – sp<IServiceManager> defaultServiceManager()
• frameworks/base/include/binder/IInterface.h
    – template BpInterface




                                                     53
Kernel Driver レイヤ
       • Binderドライバは次のシス
         テムコールをサポート
         – open,mmap,release,poll,ioctl
       • Ioctlの引数
         – コマンドコード
             •   BINDER_WRITE_READ
             •   BINDER_SET_MAX_THREADS
             •   BINDER_SET_CONTEXT_MGR
             •   BINDER_THREAD_EXIT
             •   BINDER_VERSION
         – データバッファ


                                          54
Binderドライバ
• マルチスレッドに対応
 – スレッド毎に内部状態を持つ
• UNIXのソケットはファイルディスクリプタ毎に状態を持つ点
  が異なる




                              55
Binder Driver
• 受け付けたIPC毎のサービスを処理するため
  のスレッドのプールを持つ
• Binderは2つのプロセス間のオブジェクトの対
  応を付けを行う
• Binderはプロセスのアドレス空間内でオブジェ
  クトの参照を行う
• 同期呼び出し、参照カウント


                         56
UNIX socketとbinderの比較
             socket   binder


内部状態         FDで管理    PIDで管理


read&write   ストリームI/O 単発のIoctl


ネットワーク透過性 有           無

                                 57
Binder
$ adb cat /sys/devices/virtual/misc/binder/uevent
MAJOR=10
MINOR=47
DEVNAME=binder




                                                    58
SMからBinder Driver
Client                 Service Manager
                       service list
                                          1   登録       Server
      IXXX
                           Name:Handle                 onTransact(…)
  2                        Name:Handle                     thread pool
      Handle=0             Name:Handle

transact(…)


                     問い合わせ
                 3             4                   5            User Space

                                                                Kernel Spac
                       Binder Driver: /dev/binder

                                                                       59
Transaction

                                                   BR
                                                         BinderDriverReturnProtocol
                                                   BC
                                                         BinderDriverCommandProtocol




ioctl(fd, BINDER_WRITE_READ, &bwt ) >= 0)

                               binder_write_read

                 write_size
                                                        write buffer
           write_consumed
                write_buffer
                  read_size
           read_consumed
                read_buffer                             read buffer


                                                                                60
BinderのTransaction
プロセスA とB は異なるアドレス空間を持つので、直接メモリ転送はできない
      Kernel               Process B
                         Process A
                Binder




  copy_from _userでメモリコピーし、Bを起こす

     Kernel
                            Process B
                Binder



                         Process A
   copy_to_userでメモリコピー

Android の内部では Binderを用いてプロセス間で描画データを処理している
                                             61
Binder IPCの限界
• Dalvik VMはメモリを共有していないので、
  Binder IPCがプロセスの境界を跨いだ通信を
  行う
 – お互いのメモリオブジェクトを直接参照できない
• Binderは大きなデータストリームの転送には
  向いていない
 – Audio/VideoをParcelに変換して転送するのには
   向かない

                                    62
Binderの特性
• 良い点
 –   コンパクトな手続きの呼び出し
 –   バイナリデータの転送
 –   Ashmemのショートカット
 –   GUIDを利用しない
• 悪い点
 –   DalvikのParcel処理のオーバヘッド
 –   Ioctl経由での冗長な処理
 –   名前解決のオーバヘッド
 –   大域ロックの欠如
                              63
Binderのセキュリティ
• Binderのセキュリティ機能
  – セキュリティはクライアント識別で行う
     • Binder.getCallingUid(), Binder.getCallingPid()
  – UNIXドメインソケットに似ている
     • getsockopt(…, SO_PEERCRED, …)
  – クライアントはInterfaceの利用状況を推測できない
• Service Manager
  – システムサービスのディレクトリサービス
• サーバがクライアントのパミッションをチェック
  – Context.checkPermission(permission, pid, uid)

                                                        64
Binderのサンプルプログラム
• Build binder benchmark program
% cd system/extras/tests/binder/benchmarks
% mm
% adb push ¥
 ../../../../out/target/product/crespo/data/nativebenchmark/binderAddInts ¥
 /data/local/
• Execute
% adb shell
$ su
# /data/local/binderAddInts -d 5 -n 5 &
# ps
...
root 17133 16754 4568 860 ffffffff 400e6284 S /data/local/binderAddInts
root 17135 17133 2520 616 00000000 400e5cb0 R /data/local/binderAddInts



                                                                              65
Binder sample program
• Execute
# /data/local/binderAddInts -d 5 -n 5 &
# ps
...
root 17133 16754 4568 860 ffffffff 400e6284 S /data/local/binderAddInts
root 17135 17133 2520 616 00000000 400e5cb0 R /data/local/binderAddInts

#cat /sys/kernel/debug/binder/transaction_log
transaction_log:3439847: call from 17133:17133 to 72:0 node 1 handle 0 size 124:4
transaction_log:3439850: reply from 72:72 to 17133:17133 node 0 handle 0 size 4:0
transaction_log:3439855: call from 17135:17135 to 17133:0 node 3439848 handle 1 size 8:0
...




                                                                                 66
Binderをsysfsで見る
% adb shell ls /sys/kernel/debug/binder
failed_transaction_log
proc
state
stats
transaction_log
transactions

                                          67
リモートプロシジャーコール




                68
BINDER_WRITE_READ




                    69
Binder Transaction
•   Target Method
     –   handle : Remote Interface
     –   ptr & cookie : Local Interface
     –   code : Method ID
•   Parcel - Input/Output Parameters
     –   data.ptr.buffer
     –   data_size
•   Object Reference Management
     –   data.ptr.offsets
     –   offsets_size
•   Security
     –   sender_pid
     –   sender_euid
•   No Transaction GUID
     –   Transparent Recursion



                                                 70
オブジェクトの参照




            71
Serviceの登録と検索
• 登録
   – System serviceはISserviceManager::addServiceの呼び出しで登録
   – パラメータはBinder Driverのhandle
• 検索
   – Binder Driver Mapの中を指定された名前で検索
   – IServiceManager::getService()が登録済みのサービスのhandleを返す
• Android.os.Ibinder.INTERFACE_TRANSACTIONが実際の名前




                                                           72
BINDERの利用例 GRAPHICS


                      73
実際の例




Binder IPC is used for communicating between Graphics client and server.
 Taken from http://www.cnblogs.com/xl19862005/archive/2011/11/17/2215363.html   74
Surface
Source: frameworks/base/core/java/android/view/Surface.java
/* Handle on to a raw buffer that is being managed by the
   screen compositor */
public class Surface implements Parcelable {
  public Surface() {
     mCanvas = new CompatibleCanvas();
  }
  private class CompatibleCanvas
extends Canvas { /* ... */ }
}
          Surface のinstancesはParcelとして読み書きできる
                                                         75
引数の受け渡し



”flatten”                ”unflatte


              transmit



                            76
Android SurfaceFlinger
•   2D/3D のsurfaceを重ね合わせる
•   surfaceは複数のアプリケーションが生成
•   surfaces はbuffers をBinder IPC callsで渡す
•   OpenGL ES and 2D hardware accelerator を重ね合わせ
•   ダブルバッファをページ切り替え




                                                   77
Surface flingerの構成




                     78
Camera+SurfaceFlinger+Binder




                               79
Reference
• Inter-process communication of Android, Tetsuyuki Kobayashi
• 淺談Android系統進程間通信(IPC)機制Binder中的Server和
  Client獲得Service Manager接口之路
• http://blog.goggb.com/?post=1580
• Android Binder – Android Interprocess Communication,
  Thorsten Schreiber
• Design Patterns in the Android Framework, Prof. Sheng-De
  Wang




                                                            80
http://0xlab.org




                   81

More Related Content

What's hot

ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングjunk_coken
 
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroiddemuyan
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチンyohhoy
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpsonickun
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjugYahoo!デベロッパーネットワーク
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理Takuya ASADA
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。Kazuki Onishi
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Yoshifumi Kawai
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Preferred Networks
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動Takashi Takizawa
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングTomoya Hibi
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所Hiroaki Goto
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介MITSUNARI Shigeo
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較Akihiro Suda
 

What's hot (20)

ctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリングctfで学ぼうリバースエンジニアリング
ctfで学ぼうリバースエンジニアリング
 
基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid基礎から学ぶ組み込みAndroid
基礎から学ぶ組み込みAndroid
 
Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門Zynq+PyCoRAM(+Debian)入門
Zynq+PyCoRAM(+Debian)入門
 
暗認本読書会9
暗認本読書会9暗認本読書会9
暗認本読書会9
 
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
 
RSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjpRSA暗号運用でやってはいけない n のこと #ssmjp
RSA暗号運用でやってはいけない n のこと #ssmjp
 
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug実運用して分かったRabbit MQの良いところ・気をつけること #jjug
実運用して分かったRabbit MQの良いところ・気をつけること #jjug
 
Ethernetの受信処理
Ethernetの受信処理Ethernetの受信処理
Ethernetの受信処理
 
ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。ラズパイでデバイスドライバを作ってみた。
ラズパイでデバイスドライバを作ってみた。
 
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
Unityによるリアルタイム通信とMagicOnionによるC#大統一理論の実現
 
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
Kubernete Meetup Tokyo #18 - Kubebuilder/controller-runtime 入門
 
initとプロセス再起動
initとプロセス再起動initとプロセス再起動
initとプロセス再起動
 
WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介WebSocket / WebRTCの技術紹介
WebSocket / WebRTCの技術紹介
 
DPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキングDPDKによる高速コンテナネットワーキング
DPDKによる高速コンテナネットワーキング
 
std::pin の勘所
std::pin の勘所std::pin の勘所
std::pin の勘所
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Nginx lua
Nginx luaNginx lua
Nginx lua
 
SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介SSE4.2の文字列処理命令の紹介
SSE4.2の文字列処理命令の紹介
 
DockerとPodmanの比較
DockerとPodmanの比較DockerとPodmanの比較
DockerとPodmanの比較
 

Viewers also liked

Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of AndroidTetsuyuki Kobayashi
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementationChethan Pchethan
 
Binderのはじめの一歩
Binderのはじめの一歩Binderのはじめの一歩
Binderのはじめの一歩l_b__
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction magoroku Yamamoto
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみたmagoroku Yamamoto
 
08 android multimedia_framework_overview
08 android multimedia_framework_overview08 android multimedia_framework_overview
08 android multimedia_framework_overviewArjun Reddy
 
Intentの概要
Intentの概要Intentの概要
Intentの概要l_b__
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC MechanismLihan Chen
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System ServerOpersys inc.
 
ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術
ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術
ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術Yahoo!デベロッパーネットワーク
 
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていることYahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていることYahoo!デベロッパーネットワーク
 

Viewers also liked (19)

Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
 
Inter-process communication of Android
Inter-process communication of AndroidInter-process communication of Android
Inter-process communication of Android
 
Overview of Android binder IPC implementation
Overview of Android binder IPC implementationOverview of Android binder IPC implementation
Overview of Android binder IPC implementation
 
Android ipm 20110409
Android ipm 20110409Android ipm 20110409
Android ipm 20110409
 
Binderのはじめの一歩
Binderのはじめの一歩Binderのはじめの一歩
Binderのはじめの一歩
 
Oscar compiler for power reduction
Oscar compiler for power reduction Oscar compiler for power reduction
Oscar compiler for power reduction
 
波形で見るBig.little
波形で見るBig.little波形で見るBig.little
波形で見るBig.little
 
Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5Unix v6 セミナー vol. 5
Unix v6 セミナー vol. 5
 
Understanding open max il
Understanding open max ilUnderstanding open max il
Understanding open max il
 
V6 unix in okinawa
V6 unix in okinawaV6 unix in okinawa
V6 unix in okinawa
 
自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた自動並列化コンパイラをAndroidに適用してみた
自動並列化コンパイラをAndroidに適用してみた
 
Deep learning入門
Deep learning入門Deep learning入門
Deep learning入門
 
08 android multimedia_framework_overview
08 android multimedia_framework_overview08 android multimedia_framework_overview
08 android multimedia_framework_overview
 
Intentの概要
Intentの概要Intentの概要
Intentの概要
 
Android IPC Mechanism
Android IPC MechanismAndroid IPC Mechanism
Android IPC Mechanism
 
Understanding the Android System Server
Understanding the Android System ServerUnderstanding the Android System Server
Understanding the Android System Server
 
Making Linux do Hard Real-time
Making Linux do Hard Real-timeMaking Linux do Hard Real-time
Making Linux do Hard Real-time
 
ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術
ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術
ヤフオク!の快適なカスタマー体験を支えるモバイルアプリのライブアップデート技術
 
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていることYahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
Yahoo!ブラウザーアプリのプロダクトマネージャーが考えていること
 

Similar to Android binder-ipc

【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏Developers Summit
 
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版Ryosuke MATSUMOTO
 
Dockerの利用事例
Dockerの利用事例Dockerの利用事例
Dockerの利用事例maebashi
 
OpenShift v3 Technical Overview
OpenShift v3 Technical OverviewOpenShift v3 Technical Overview
OpenShift v3 Technical OverviewNakayama Kenjiro
 
第2章アーキテクチャ
第2章アーキテクチャ第2章アーキテクチャ
第2章アーキテクチャKenta Hattori
 
Introduction of Rancher at OSC Tokyo 17 Spring
Introduction of Rancher at OSC Tokyo 17 SpringIntroduction of Rancher at OSC Tokyo 17 Spring
Introduction of Rancher at OSC Tokyo 17 SpringGo Chiba
 
コンテナ導入概要資料2018
コンテナ導入概要資料2018コンテナ導入概要資料2018
コンテナ導入概要資料2018Masahito Zembutsu
 
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果Hideaki Tokida
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介AdvancedTechNight
 
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構Ryosuke MATSUMOTO
 
1_各Atlassian製品の紹介
1_各Atlassian製品の紹介1_各Atlassian製品の紹介
1_各Atlassian製品の紹介Ricksoft
 
Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版VirtualTech Japan Inc.
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークkenjis
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介NilOne Ltd.
 
QCon北京2015 sina jpool-微博平台自动化运维实践
QCon北京2015 sina jpool-微博平台自动化运维实践QCon北京2015 sina jpool-微博平台自动化运维实践
QCon北京2015 sina jpool-微博平台自动化运维实践Weibo Corporation
 
云推送技术实现与敏捷开发
云推送技术实现与敏捷开发云推送技术实现与敏捷开发
云推送技术实现与敏捷开发kaerseng
 
130329 04
130329 04130329 04
130329 04openrtm
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4openrtm
 

Similar to Android binder-ipc (20)

【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
【17-E-2】Ruby PaaS「MOGOK」 ~ ソフトウェアエンジニアのためのクラウドサービス ~ 藤原秀一氏
 
第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版第1回 松本勉強会 2012 05 11 - 公開版
第1回 松本勉強会 2012 05 11 - 公開版
 
Dockerの利用事例
Dockerの利用事例Dockerの利用事例
Dockerの利用事例
 
Perl Ocean
Perl OceanPerl Ocean
Perl Ocean
 
OpenShift v3 Technical Overview
OpenShift v3 Technical OverviewOpenShift v3 Technical Overview
OpenShift v3 Technical Overview
 
第2章アーキテクチャ
第2章アーキテクチャ第2章アーキテクチャ
第2章アーキテクチャ
 
Introduction of Rancher at OSC Tokyo 17 Spring
Introduction of Rancher at OSC Tokyo 17 SpringIntroduction of Rancher at OSC Tokyo 17 Spring
Introduction of Rancher at OSC Tokyo 17 Spring
 
コンテナ導入概要資料2018
コンテナ導入概要資料2018コンテナ導入概要資料2018
コンテナ導入概要資料2018
 
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
OpenShift Ansbile 活用法 アプリケーションライフサイクルからみる導入効果
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
組み込みスクリプト言語Mrubyを利用したwebサーバの機能拡張支援機構
 
Angularreflex20141210
Angularreflex20141210Angularreflex20141210
Angularreflex20141210
 
1_各Atlassian製品の紹介
1_各Atlassian製品の紹介1_各Atlassian製品の紹介
1_各Atlassian製品の紹介
 
Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版Kubernetes雑にまとめてみた 2020年8月版
Kubernetes雑にまとめてみた 2020年8月版
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
 
QCon北京2015 sina jpool-微博平台自动化运维实践
QCon北京2015 sina jpool-微博平台自动化运维实践QCon北京2015 sina jpool-微博平台自动化运维实践
QCon北京2015 sina jpool-微博平台自动化运维实践
 
云推送技术实现与敏捷开发
云推送技术实现与敏捷开发云推送技术实现与敏捷开发
云推送技术实现与敏捷开发
 
130329 04
130329 04130329 04
130329 04
 
20130329 rtm4
20130329 rtm420130329 rtm4
20130329 rtm4
 

More from magoroku Yamamoto

More from magoroku Yamamoto (20)

仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に仮想記憶入門 BSD-4.3を例題に
仮想記憶入門 BSD-4.3を例題に
 
V6 unix vol.2 in okinawa
V6 unix vol.2 in okinawaV6 unix vol.2 in okinawa
V6 unix vol.2 in okinawa
 
Adk2012
Adk2012Adk2012
Adk2012
 
ぐだ生システム#2
ぐだ生システム#2ぐだ生システム#2
ぐだ生システム#2
 
ぐだ生って何
ぐだ生って何ぐだ生って何
ぐだ生って何
 
Android builders summit slide tour
Android builders summit slide tourAndroid builders summit slide tour
Android builders summit slide tour
 
第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料第4回名古屋Android勉強会資料
第4回名古屋Android勉強会資料
 
Poorman’s adk トレーナ
Poorman’s adk トレーナPoorman’s adk トレーナ
Poorman’s adk トレーナ
 
20分でわかった事にするパワーマネジメント
20分でわかった事にするパワーマネジメント20分でわかった事にするパワーマネジメント
20分でわかった事にするパワーマネジメント
 
Poormans sdk
Poormans sdkPoormans sdk
Poormans sdk
 
Ngk2011 b
Ngk2011 bNgk2011 b
Ngk2011 b
 
オレオレ家電
オレオレ家電オレオレ家電
オレオレ家電
 
V6read#4
V6read#4V6read#4
V6read#4
 
V6read#3
V6read#3V6read#3
V6read#3
 
Unixファイルシステムの歴史
Unixファイルシステムの歴史Unixファイルシステムの歴史
Unixファイルシステムの歴史
 
Pdp11 on-fpga
Pdp11 on-fpgaPdp11 on-fpga
Pdp11 on-fpga
 
V6read#2
V6read#2V6read#2
V6read#2
 
Androidの入力システム
Androidの入力システムAndroidの入力システム
Androidの入力システム
 
ぐだ生システム再構成4
ぐだ生システム再構成4ぐだ生システム再構成4
ぐだ生システム再構成4
 
20分で理解する仮想記憶
20分で理解する仮想記憶20分で理解する仮想記憶
20分で理解する仮想記憶
 

Android binder-ipc

  • 1. Android プロセス間通信の仕組み (Android IPC Mechanism) Jim Huang (黃敬群) Developer, 0xlab jserv@0xlab.org March 19, 2012 / 南台科大 http://www.slideshare.net/jserv/android-ipc-mechanism を許可を得て@magoroku15が翻訳
  • 2. Rights to copy © Copyright 2012 0xlab http://0xlab.org/ contact@0xlab.org Corrections, suggestions, contributions and translations Attribution – ShareAlike 3.0 are welcome! You are free Latest update: Mar 21, 2012 to copy, distribute, display, and perform the work to make derivative works to make commercial use of the work Under the following conditions Attribution. You must give the original author credit. Share Alike. If you alter, transform, or build upon this work, you may distribute the resulting work only under a license identical to this one. For any reuse or distribution, you must make clear to others the license terms of this work. Any of these conditions can be waived if you get permission from the copyright holder. Your fair use and other rights are in no way affected by the above. License text: http://creativecommons.org/licenses/by-sa/3.0/legalcode 2
  • 3. この資料の内容 • AndroidとBinder IPC • デザインパターン • Binderの構造 • Graphicsでの利用例 3
  • 5. Androidのタスク Process A Process B Task Activity Activity Content Activity Provider .apk package Service .apk package 5
  • 6. Component View • コンポーネントタイプ – Activity – Service – Content Provider – Broadcast Reciver 6
  • 7. Application Components System Application Components System 7
  • 8. IPC = Inter-Process Communication プロセス間通信 Activity Activity Window Alarm Manager Manager Manager Kernel 8
  • 9. なぜIPCなのか • それぞれのプロセスは固有のアドレス空間を 持ち、 分離・保護されている • 2つの異なるプロセス間が直接かかわりを 持って、問題を引き起こさないようにしている • 場合によっては2つのプロセスの間の通信が 必要となる 9
  • 10. IPCの例 • Linuxの場合 – Signal シグナル – Pipe パイプ – Socket ソケット – Semaphore セマフォ – Message queue メッセージキュー – Shared memory 共用メモリ • Androidの場合 – Binder Lightweight RPC を提供 10
  • 11. Binderの歴史 • Palm社がOpenBinderとして開発 – Dianne Hackbornが開発リーダ • Android BinderはOpenBinderのカスタマイズと再実装 – 手続きとデータを他のプロセスに送って実行する 11
  • 12. 背景 • アプリケーションとサービスはそれぞれ異なる プロセスで実行しているが、相互の通信と データの共有が必要 • IPCは処理のオーバーヘッドとセキュリティ ホールをもたらす場合がある 12
  • 13. Androidでの解決 Binder • プロセス間通信をドライバで実装 • 共用メモリを利用した高速処理 • 処理要求のためのプロセス毎にスレッドプールを用意 • 参照カウントとプロセスと超えてオブジェクトの参照 • プロセス間の同期呼び出し “In the Android platform, the binder is used for nearly everything that happens across processes in the core platform. " – Dianne Hackborn https://lkml.org/lkml/2009/6/25/3 13
  • 14. Binder: IPCの抽象化 • Intent – 高位の抽象化 • AIDL – Android InterfaceDefinition Language – プロセス間通信呼び出し More abstract • Binder Intent – カーネルドライバ • Ashmem AIDL – 共用メモリ Binder 14
  • 15. 手続きの呼び出し caller callee 同じプロセスの場合 15
  • 16. プロセス間の手続き呼び出し caller interface caller interface どうやって? callee interface callee 16
  • 17. プロセス間の手続き呼び出し caller interface Proxy caller interface Binder in kernel Binder Thread callee Stub interface callee 17
  • 20. Proxy方式 • プロキシがネットワーク接続、メモリ上の巨大オブジェ クト、ファイル、その他すべての資源を仲介 – 処理が重く、複製ができない場合がある 20
  • 21. AndroidのProxy方式 • Binder が手続き呼び出しと関連する全てのデータをLinuxが扱える レベルに分解 • 送信元のアドレス空間から、送信先のアドレス空間へ転送 • 転送後は送信先でデータを再構成して手続きを実行 システムで用意 AIDLでインタ フェースを生成 アプリで記述 リモート側 ローカル側 21
  • 24. Android: BridgeとMediatorの併用 Java と C++によるBridge方式 Mediator方式 24
  • 25. UMLでの表現 <<interface>> implements Proxy Stub 25
  • 26. UMLでの表現 caller <<interface>> calls implements Proxy Stub extends callee 26
  • 27. AIDL .aidl ファイルから自動生成 caller <<interface>> Proxy Stub callee 27
  • 28. ActivityのonPause()を呼ぶのは誰か? 2 Handlerを利用して プロセス内でメッセージ を送る Activity 3 Main threadから queue OnPause() が Looper 呼び出される Activity Manager Main Binder Thread Thread #1 Kernel 1 プロセスを跨いで ”schedulePauseActivity” を呼び出す 28
  • 29. IPC Interaction in Android 2 1 call getService interface Framework 29
  • 32. 用語 • Binder – Binder Object • Binderインターフェイスが生成するクラスのインスタンス • 1つのBinder objectは複数のBinderを実装する • Binder Protocol – IBinder インターフェイス • 事前に定義されたBinderが実装可能な手続き、プロパティ、 イベントの集合 – Binder Token • Binderを識別するユニークな数値 32
  • 33. Binderの機能 • シンプルなプロセス間メッセージング • Managing/管理 • Identifying/識別 • Calls/呼び出し • Notification/通知 • Binder as a security access token – セキュリティアクセストークン 33
  • 34. Binderの機能 • Binder framework は単純なプロセス間メッセージ以上 の機能を備えている • 遠隔の手続きをローカルな手続きと同様に呼び出す 事ができる 34
  • 36. Service Manager (SM) • あらかじめ、アドレスがわかっている特殊なBinderノード – クライアントは接続先のBinderのアドレスを知らない – Binder interfaceだけが自分のアドレスを知っている • Binder Interfaceは自分の名前とトークンをSMに登録する – クライアントは利用するサービス名をSMに問い合わせてBinder のアドレスを解決する 36
  • 37. SMからサービスの一覧を取得 $ adb shell service list Found 71 services: 0 stub_isms: [com.android.internal.telephony.ISms] 1 stub_phone: [com.android.internal.telephony.ITelephony] 2 stub_iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo] .. 5 stub_telephony.registry: [com.android.internal.telephony.ITelephonyRegistry] ... 7 stub_activity: [android.app.IActivityManager] ... 9 phone: [com.android.internal.telephony.ITelephony] … 56 activity: [android.app.IActivityManager] ... 64 SurfaceFlinger: [android.ui.ISurfaceComposer] ... 37
  • 38. ActivityManagerの手続き呼び出し $ adb shell service list ... 56 activity: [android.app.IActivityManager] ... $ adb service call activity 1598968902 Result: Parcel( 0x00000000: 0000001c 006e0061 00720064 0069006f '....a.n.d.r.o.i.' 0x00000010: 002e0064 00700061 002e0070 00410049 'd...a.p.p...I.A.' 0x00000020: 00740063 00760069 00740069 004d0079 'c.t.i.v.i.t.y.M.' 0x00000030: 006e0061 00670061 00720065 00000000 'a.n.a.g.e.r.....') public abstract interface IBinder { ... field public static final int INTERFACE_TRANSACTION = 1598968902; // 0x5f4e5446 … } Source: frameworks/base/api/current.txt 38
  • 39. Serviceとの関係 $ adb service call phone 1 s16 "123" Result: Parcel(00000000 '....') 電話アプリに”123”と表示される parameter “1” → dial() s16 "123" → String("123") $ adb shell service list Found 71 services: ... 9 phone: [com.android.internal.telephony.ITelephony] interface ITelephony { /* Dial a number. This doesn't place the call. It displays * the Dialer screen. */ void dial(String number); Source: frameworks/base/ telephony/java/com/android/internal/telephony/ITelephony.aidl 39
  • 40. Binderの実装レイヤ Javaで記述 C++で記述 Cで記述 40
  • 41. APIレイヤ • AIDLはリモートサービ スの実装を容易にする • AIDLパーサが以下を生 成しミドルウェアを隠ぺ いする – Proxy class – Stub class – Java API Wrapper 41
  • 42. AIDL • データ型 • Javaプリミティブ • コンテナ • String,List,Map,CharSequence,List<>,多次元配列、 • Parcelable • Interface Reference • 方向 in, out, inout, oneway • Android os Ibinder FLAG_ONEWAY 42
  • 43. AIDL コンパイラ // Interface • Javaのみをサポート interface IRemoteService • StubとProxyを生成 { void ping(); } Client IRemoteService mService = IRemoteService.Stub.asInterface(servic Server public class RemoteService extends Service { public IBinder onBind(Intent intent) { return mBinder; } private final IRemoteService.Stub mBinder = new IRemoteService.Stub() { public void ping() { // Nothing } }; } 43
  • 45. ParcelsとMarshalling • プロセス間メッセージの仕組み • オブジェクト指向の外観にparcelと呼ぶデータ を飛ばす • Parcelを組み立てる処理をMarshallingと呼ぶ • Parcelからobjectを生成する処理を unmarshallingと呼ぶ 45
  • 46. Parcel • Marshalling プロセスの境界を越えて、データ を転送する – ネイティブなバイナリで表現 • ほとんどのコードはAIDLが生成 • Extensible - Parclabe 46
  • 48. Parceelの定義 • IBinderを経て送 信可能なメッ セージのコンテ ナ • Parcelはフラット に展開したデー タと転送先で有 効なオブジェクト して利用可能な データを含む 48
  • 49. Parcelのrepresentation • Parcelは汎用的なserializationでは無い – 高速なIPCのためのClass API – 永続的なストレージにparcelを置く事は不適切 • 基本データ型を読み・書きする機能 –writeByte(byte) / readByte() –writeDouble(double) / readDouble() –writeFloat(float) / readFloat() –writeInt(int) / readInt() –writeLong(long) / readLong() –writeString(String) / readString() 49
  • 50. Parcelable • ParcelabeプロトコルはParcelが自身を読み書 きする効率的なプロトコル – writeParcelable(Parcelable, int) – readParcelable(ClassLoader) – writeParcelableArray(T[],int) – readParcelableArray(ClassLoader) • これらの手続きはクラスタイプとparcelへの データ書き込みの双方で用いられて、後に適 切なクラスローダを用いて復元される 50
  • 51. Bundles • 特別な型付けのないコンテナをBundleと呼び、 ヘテロジニアスな値をKey/Valueのマップで保 持 • これは、データの読み書きの性能向上に効果 があり、Parcelの中にデータをmarshallingする 際に発生する、型付け無APIが型付けに関わ るディバックの難しさを避ける 51
  • 52. ミドルウェアレイヤ • ユーザ空間に実装さ れた、C++のBinderフ レームワーク • スレッドの生成と管理 のための構造と手続き を実現している • Binderのカーネルドラ イバを呼び出す 52
  • 53. • frameworks/base/include/binder/IServiceManager.h – sp<IServiceManager> defaultServiceManager() • frameworks/base/include/binder/IInterface.h – template BpInterface 53
  • 54. Kernel Driver レイヤ • Binderドライバは次のシス テムコールをサポート – open,mmap,release,poll,ioctl • Ioctlの引数 – コマンドコード • BINDER_WRITE_READ • BINDER_SET_MAX_THREADS • BINDER_SET_CONTEXT_MGR • BINDER_THREAD_EXIT • BINDER_VERSION – データバッファ 54
  • 55. Binderドライバ • マルチスレッドに対応 – スレッド毎に内部状態を持つ • UNIXのソケットはファイルディスクリプタ毎に状態を持つ点 が異なる 55
  • 56. Binder Driver • 受け付けたIPC毎のサービスを処理するため のスレッドのプールを持つ • Binderは2つのプロセス間のオブジェクトの対 応を付けを行う • Binderはプロセスのアドレス空間内でオブジェ クトの参照を行う • 同期呼び出し、参照カウント 56
  • 57. UNIX socketとbinderの比較 socket binder 内部状態 FDで管理 PIDで管理 read&write ストリームI/O 単発のIoctl ネットワーク透過性 有 無 57
  • 58. Binder $ adb cat /sys/devices/virtual/misc/binder/uevent MAJOR=10 MINOR=47 DEVNAME=binder 58
  • 59. SMからBinder Driver Client Service Manager service list 1 登録 Server IXXX Name:Handle onTransact(…) 2 Name:Handle thread pool Handle=0 Name:Handle transact(…) 問い合わせ 3 4 5 User Space Kernel Spac Binder Driver: /dev/binder 59
  • 60. Transaction BR BinderDriverReturnProtocol BC BinderDriverCommandProtocol ioctl(fd, BINDER_WRITE_READ, &bwt ) >= 0) binder_write_read write_size write buffer write_consumed write_buffer read_size read_consumed read_buffer read buffer 60
  • 61. BinderのTransaction プロセスA とB は異なるアドレス空間を持つので、直接メモリ転送はできない Kernel Process B Process A Binder copy_from _userでメモリコピーし、Bを起こす Kernel Process B Binder Process A copy_to_userでメモリコピー Android の内部では Binderを用いてプロセス間で描画データを処理している 61
  • 62. Binder IPCの限界 • Dalvik VMはメモリを共有していないので、 Binder IPCがプロセスの境界を跨いだ通信を 行う – お互いのメモリオブジェクトを直接参照できない • Binderは大きなデータストリームの転送には 向いていない – Audio/VideoをParcelに変換して転送するのには 向かない 62
  • 63. Binderの特性 • 良い点 – コンパクトな手続きの呼び出し – バイナリデータの転送 – Ashmemのショートカット – GUIDを利用しない • 悪い点 – DalvikのParcel処理のオーバヘッド – Ioctl経由での冗長な処理 – 名前解決のオーバヘッド – 大域ロックの欠如 63
  • 64. Binderのセキュリティ • Binderのセキュリティ機能 – セキュリティはクライアント識別で行う • Binder.getCallingUid(), Binder.getCallingPid() – UNIXドメインソケットに似ている • getsockopt(…, SO_PEERCRED, …) – クライアントはInterfaceの利用状況を推測できない • Service Manager – システムサービスのディレクトリサービス • サーバがクライアントのパミッションをチェック – Context.checkPermission(permission, pid, uid) 64
  • 65. Binderのサンプルプログラム • Build binder benchmark program % cd system/extras/tests/binder/benchmarks % mm % adb push ¥ ../../../../out/target/product/crespo/data/nativebenchmark/binderAddInts ¥ /data/local/ • Execute % adb shell $ su # /data/local/binderAddInts -d 5 -n 5 & # ps ... root 17133 16754 4568 860 ffffffff 400e6284 S /data/local/binderAddInts root 17135 17133 2520 616 00000000 400e5cb0 R /data/local/binderAddInts 65
  • 66. Binder sample program • Execute # /data/local/binderAddInts -d 5 -n 5 & # ps ... root 17133 16754 4568 860 ffffffff 400e6284 S /data/local/binderAddInts root 17135 17133 2520 616 00000000 400e5cb0 R /data/local/binderAddInts #cat /sys/kernel/debug/binder/transaction_log transaction_log:3439847: call from 17133:17133 to 72:0 node 1 handle 0 size 124:4 transaction_log:3439850: reply from 72:72 to 17133:17133 node 0 handle 0 size 4:0 transaction_log:3439855: call from 17135:17135 to 17133:0 node 3439848 handle 1 size 8:0 ... 66
  • 67. Binderをsysfsで見る % adb shell ls /sys/kernel/debug/binder failed_transaction_log proc state stats transaction_log transactions 67
  • 70. Binder Transaction • Target Method – handle : Remote Interface – ptr & cookie : Local Interface – code : Method ID • Parcel - Input/Output Parameters – data.ptr.buffer – data_size • Object Reference Management – data.ptr.offsets – offsets_size • Security – sender_pid – sender_euid • No Transaction GUID – Transparent Recursion 70
  • 72. Serviceの登録と検索 • 登録 – System serviceはISserviceManager::addServiceの呼び出しで登録 – パラメータはBinder Driverのhandle • 検索 – Binder Driver Mapの中を指定された名前で検索 – IServiceManager::getService()が登録済みのサービスのhandleを返す • Android.os.Ibinder.INTERFACE_TRANSACTIONが実際の名前 72
  • 74. 実際の例 Binder IPC is used for communicating between Graphics client and server. Taken from http://www.cnblogs.com/xl19862005/archive/2011/11/17/2215363.html 74
  • 75. Surface Source: frameworks/base/core/java/android/view/Surface.java /* Handle on to a raw buffer that is being managed by the screen compositor */ public class Surface implements Parcelable { public Surface() { mCanvas = new CompatibleCanvas(); } private class CompatibleCanvas extends Canvas { /* ... */ } } Surface のinstancesはParcelとして読み書きできる 75
  • 76. 引数の受け渡し ”flatten” ”unflatte transmit 76
  • 77. Android SurfaceFlinger • 2D/3D のsurfaceを重ね合わせる • surfaceは複数のアプリケーションが生成 • surfaces はbuffers をBinder IPC callsで渡す • OpenGL ES and 2D hardware accelerator を重ね合わせ • ダブルバッファをページ切り替え 77
  • 80. Reference • Inter-process communication of Android, Tetsuyuki Kobayashi • 淺談Android系統進程間通信(IPC)機制Binder中的Server和 Client獲得Service Manager接口之路 • http://blog.goggb.com/?post=1580 • Android Binder – Android Interprocess Communication, Thorsten Schreiber • Design Patterns in the Android Framework, Prof. Sheng-De Wang 80