SlideShare a Scribd company logo
OpenBinder
~Android IPC の 2 回目 ~
横浜 Android プラットフォーム部
第 11 回勉強会
2011/7/19
@l_b__
今日の内容
● OpenBinder のドキュメントを読んでみたら非常に興味深
かったので内容のご紹介。
● 元ネタは OpenBinder のアーカイブ
(http://www.angryredplanet.com/~hackbod/openbinder/)
 と
Introduction to OpenBinder and Interview with
Dianne Hackborn
(http://www.osnews.com/story/13674/Introduction_to_OpenBinder_and_I
nterview_with_Dianne_Hackborn)
OpenBinder って ?
●元々は Next Generation BeOS に採用される予定
だった。
●UNIX の CORBA 、 Windows の COM のように分散
コンポーネント環境を提供するフレームワーク。
 以上第 3 回の勉強会資料から。
 実はここに全部答えがありました。
今日の結論
● OpenBinder は COM です。
COM って ?
● この結論でなるほどと分かる方は今日の話は面
白くないかも。
● COM についてはあまり知らなかったので、その辺
も色々調べてみたというのが今日の内容です。
OpenBinder って ?
● The Binder could be described as a "framework
framework". It doesn't do anything itself, but is an
enabling tool for implementing other rich frameworks,
such as the view hierarchy, media framework, etc.
  (OpenBinder Binder Kit の説明から )
OpenBinder って ?
● OpenBinder was really designed as an operating
system component framework.
( インタビューから )
● つまり、 OpenBinder は OS 上に View フレームワークや
Media フレームワークなどを構築するためのコンポーネン
トフレームワークであり、
“ ”フレームワークのためのフレームワーク 。
分散コンポーネント環境
● 分散コンポーネント / 分散オブジェクトとは
● システムを機能分割し、適切に ( ネットワーク上のマシンに )
配置
● 機能をコンポーネント化して再利用性を高める
● 標準化された呼び出し規約を使用して、離れた位置に配置
された機能を簡単に利用可能にする。
● 代表的な技術に CORBA 、 JavaRMI/EJB 、 COM(COM+)
等。
分散コンポーネント / オブジェクトの仕
組み
● 以下、 @IT 「スキルアップのための分散オブジェク
ト入門」から色々抜粋
● オブジェクトインターフェースを定義
● リモートオブジェクトを呼び出すためのインターフェースを定
義する必要がある。
● CORBA 、 COM は IDL(Interface Definition Language) で
定義。
● JavaRMI は Java の Interface で定義。
分散コンポーネント / オブジェクトの仕
組み
● スタブとスケルトン
● インターフェース定義をコンパイルして、ローカルクライアン
ト側で使用するスタブと、リモート側のスケルトンを生成
する。
スタブとスケルトンの役割
スタブの役割
● スタブはリモートオブジェクトと同じメソッド、プロパティを持
ち、プロキシとして動作する。
● ローカルクライアントはスタブにアクセスすることで、あたかも
リモートオブジェクトに直接アクセスするかのように操作でき
る。
● 実際の呼び出しは、スタブと下の ORB(Object Request
Broker) ランタイムがパラメータをマーシャリング ( 共通データ
形式変換 ) してリモートにメッセージ送信する。
スケルトンの役割
● クライアントから来たメッセージをアンマーシャリン
グしてリモートオブジェクトに渡して呼び出し、結果
をマーシャリングしてクライアントに返す。
分散システムの機能の特徴
● リモートオブジェクトを bind( 登録 )
● bind されたリモートオブジェクトを lookup( 検索 )
● lookup したリモートオブジェクトを call( 呼び出し )
する仕組みを持っている。
分散システムの機能の特徴
● ブラウザと Web サーバと DNS の仕組みも同じ。
 以上の機能を代表的な技術で見てみると
CORBA の場合
● 特定 OS や言語に依存しない共通プラットフォー
ム
● IDL(Interface Definition Language) で呼び出し
先オブジェクトインターフェースを定義
● IIOP(Interner Inter-ORB Protocol) で COM や
JavaRMI 等とも通信可能
CORBA の場合
● IDL を作成し、 IDL コンパイラでコンパイルしてス
タブとスケルトンを作成。
● スタブとスケルトンをそれぞれの言語で実装。
● オブジェクトの登録はいろいろなサービスが用意
されている。 1 例としてネーミングサービス。名前
で登録して名前で検索できる。
JavaRMI の場合
● 特定 OS に依存しない Java プラットフォーム
● IDL は使わず、 Java のインターフェースでリモート
インターフェースを定義
JavaRMI の場合
● インターフェースを定義、これを実装するリモート
オブジェクトクラスを作成する。
● リモートオブジェクトクラスから rmic コンパイラで
スタブとスケルトンを生成する。
● リモートオブジェクトを RMI レジストリか JNDI
(Java Naming and Directory Interface) に登録
する。
JavaRMI の場合
● クライアントは RMI レ
ジストリ /JNDI からリ
モートオブジェクト参照
を取り出し、スタブを
使ってアクセスする。
COM/COM+ の場合
● Windows プラットフォーム上で特定言語に依存しない。
● スクリプト言語ではオートメーション (IDL コンパイラによる
事前の静的処理でなく、実行時に動的にインターフェース
を取得してリモートオブジェクトを呼び出す ) サポート。
● 複数のインターフェースをサポートするコンポーネントを
構築するための IUnknown インターフェース。
COM/COM+ の特徴
● オブジェクト登録・呼び出しにはレジストリを使用。
● 全インターフェースは IUnknown インターフェースを継承
し、 AddRef 、 Release 、 QueryInterface 関数を実装する。
● AddRef 、 Release はオブジェクトの参照カウントを増
減させるために使用される。
● QueryInterface はコンポーネントが実装する他のイン
ターフェースを取得するために使用される。
COM/COM+ の特徴
● COM+ オブジェクトは、自分を参照しているクライ
アントをカウントし、参照カウント 0 になったら自ら
を削除する。
● サーバ側は ping を使ってクライアントの生存確認
を行い、メッセージが戻らない場合は参照カウント
を減らす。
参照カウント
● ガベージコレクタの動作方法の一つ
● オブジェクトに対し、どれだけ参照されているかの
値。
● 参照カウント 0 なら参照されなくなったということ
で削除。
参照カウントの例
class A { public B b;}
class B { public A a;}
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.b = b;
b.a = a;
  }
}
参照カウントの例
●A を生成  A の参照カウント 1
●B を生成  B の参照カウント 1
●A から B を参照  B の参照カウント 2
●B から A を参照  A の参照カウント 2
Test
Object A Object B
① ②
③
④
参照カウントの問題点
● 循環参照が発生すると、到達不可能なオブジェク
トも解放できなくなる。
循環参照の例
class A { public B b;}
class B { public A a;}
public class Test {
public static void main(String[] args) {
A a = new A();
B b = new B();
a.b = b;
b.a = a;
a = null;
b = null;
  }
}
循環参照の例
●A を生成  A の参照カウント 1
●B を生成  B の参照カウント 1
●A から B を参照  B の参照カウント 2
●B から A を参照  A の参照カウント 2
●A への参照を削除  A の参照カウント 1
●B への参照を削除  B の参照カウント 1
A 、 B は到達不可能だが
参照カウントは 1 のまま
Test
Object A Object B
①
②
③
④
⑤ ⑥
弱い参照
● 循環参照を防ぐために、弱い参照を用いることが
出来る。
● 他の強参照が無くなると参照カウント 0 となって
削除される。
Test
Object A Object B
①
②
③
④
⑤ ⑥
弱い参照の例
●A を生成  A の参照カウント 1
●B を生成  B の参照カウント 1
●A から B を参照 弱参照のため B の参照カウントは増えない
●B から A を参照 弱参照のため A の参照カウントは増えない
●A への参照を削除  A の参照カウント 0
●B への参照を削除  B の参照カウント 0
A 、 B は参照カウント 0 になり、
自分を削除する。
ようやく本題
● OpenBinder を分散オブジェクト技術として見ると。
● C++ で記述、プラットフォームには依存しないが、実装は最終的に Linux
向け。
● IDL で呼び出し先オブジェクトインターフェースを定義。
● 複数のインターフェースをサポートするコンポーネントを構築するための
IInterface や IBinder インターフェース。
● リモートオブジェクトを参照カウントによって監視。
● ネットワークには非対応、 Binder カーネルドライバによる IPC をコンポー
ネント間に使用。
ソース構成
build ビルドの出力先
build_system make ベースの build システム
commands Linux のコマンドラインツール
components Binder コンポーネント
docs ドキュメント
headers OpenBinderAPI ヘッダファイル
interfaces 公開 API 中の IDL ファイル
libraries OpenBinder ライブラリ
modules Binder カーネルモジュール
samples サンプルコード
scripts Linux/Binder シェル向けスクリプト
servers Binder 実行環境向けデーモン
tools システム生成用 Linux コマンドラインツール
Binder の特徴
● フォーカスする対象が Handheld(Be InternetAppliance,
Palm) なので、ネットワーク間ではなく、プロセス間の分散
システムとして設計
● 50MHz ARM7 から 400MHz ARM9 がターゲット
● コンポーネントモデルを取り入れることでシステム構成が
柔軟に
● プロセス間で処理を分散することで Robust
Binder と COM の相違点
● COM は C ベースだが、 Binder は C++ ベースなのでよ
りオブジェクト指向な実装となっていて、またスマートポイ
ンタのような高度な機能を使用できる
● COM ではスクリプトをサポートするには IDispatch を実
装する必要があるが、全ての Binder オブジェクトはスクリ
プト実行可能
● Binder はマルチスレッド対応としてデザインされていて、
SLocker や SHandler のようなクラスが用意されている。
BinderAPI 規約から抜粋
● クラス名
● I で始まるクラスは Binder インターフェー
ス。 IBinder を除き IInterface を継承。
● B は BBinder に直接 / 間接的に由来する Binder
クラス。大体は Concrete Class 。
● S はその他のクラス。 SValue などのデータ型が多
いが、 SAtom や SHandler のようなものもある。
BinderAPI 規約から抜粋
● メモリ管理
● 通常 Stack-base と参照カウントの 2 種類のクラス
を使う。
● 参照カウントされるクラスは SAtom(SLightAtom 、
SLimAtom) 由来。 I 、 B で始まる全てのクラスは
参照カウントされる。
● 参照カウントされるクラスは必ず new で生成され、
sptr<> 、 wptr<> を用いる。
BinderAPI 規約から抜粋
● メモリ管理
● Stack-Base クラスは大体データ型クラス
● new では生成せず、スタック上や SVector<> 等の
コンテナ上で生成。
● 値渡しで使用する。 Copy-On-Wright Semantics
が使用される。
● SSharedBuffer は以上の全ての特徴を持つ。
SupportKit
● OpenBinder は SupportKit 、 BinderKit 、 StorageKit 等
から成る。
● SupportKit は便利なユーティリティや通常処理のための
スイートで構成される。
● データ型、コンテナ、メモリ管理、スレッド処理、文字列処
理等。
● SHandler 、 SMessage のようなイベントループの仕組み
も。
BinderKit
● OpenBinder の本体。分散オブジェクトを使った
framework のための Framework 。
● ネットワークを使う COM や CORBA と違い、 Binder IPC
Mechanism を使用したメッセージング。
● manifest ファイルベースのコンポーネント登録
Binder サービス呼び出し
#include <services/Informant.h>
sptr<IBinder> informantBinder
= Context().LookupService(SString("informant"));
sptr<IInformant> informant
= interface_cast<IInformant>(informantBinder);
if (informant != NULL) {
informant->Inform( SValue::String("myMessage"),
SValue::String("myData") );
}
Binder オブジェクト作成
#include <services/Informant.h>
class MyWatcher : public BnInformed, public SPackageSptr
{
public:
MyWatcher(const SContext& context)
: BnInformed(context)
{}
void OnInform( const SValue& information,
const SValue& cookie, const SValue& key)
{
bout << "Got informed: " << information << endl;
}
};
SPackageSptr は PackageManag-
er のクラス。参照がある限りロードさ
れたままにする。
BnInformed は IInformant.idl から
IDL コンパイラで生成されたクラス
Binder オブジェクトをサービスに
#include <services/Informant.h>
sptr<IInformant> informant =
interface_cast<IInformant>(
Context().LookupService(SString("informant")));
sptr<IBinder> informed = new MyWatcher;
if (informant != NULL && informed != NULL)
{
informant->RegisterForCallback(
SValue::String("myMessage"), informed,
SValue::String("OnInform"));
}
Binder コンポーネント作成
● コンポーネント化するには以下が必要。
● Manifest の作成
● PackageManager がインスタンス生成時に呼ぶ
Factory メソッドの追加
● Manifest
<manifest>
   <component>
     <interface name="org.openbinder.services.IInformed" />
   </component>
</manifest>
Binder コンポーネント作成
● Factory メソッド
#include <support/InstantiateComponent.h>
sptr<IBinder>
InstantiateComponent( const SString& component,
const SContext& context,
const SValue &args)
{
if (component == "")
return static_cast<BnInformed*>(new MyWatcher(context));
return NULL;
}
コンポーネント Makefile
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
BASE_PATH:= $(LOCAL_PATH)
PACKAGE_NAMESPACE:= org.openbinder.samples
PACKAGE_LEAF:= MyWatcher
SRC_FILES:= 
MyWatcher.cpp
include $(BUILD_PACKAGE)
BinderShell
● Binder コンポーネントをコマンドライン操作できる Binder
Shell が用意されている。
● C++ を使わなくても Binder コンポーネントにアクセス可
能。
● 詳細は割愛。
Binder 用語解説
● Binder
● "The Binder” は Binder アーキテクチャ全般を指
す。
● "a Binder” は BinderInterface の実装を指す。
● Binder Object
● IBinder の実装エンティティ。大抵は BBinder を継
承するクラスのこと。
Binder 用語解説
● Component
● PackageManager に公開された Binder オブジェ
クト。 Java ライクな NamingScheme を使用。
● Package
● 1 つ以上のコンポーネント実装を含む。
● コンポーネント実装、 Manifest から成る。
● COM と違い、コンポーネント情報は静的に扱われ
る。
Binder 用語解説
● PackageManager
● 使用可能なコンポーネントを追跡管理する。
● コンポーネントを動的に生成し、管理する。
● /packages/components 以下に配置されたコン
ポーネントを Binder の名前空間を使ってロード、
インスタンス生成できるようにする。
Binder 用語解説
● Interface
● Binder オブジェクトが実装するメソッド、プロパ
ティ、イベントなどの定義、 IDL として記述さ
れ、 Pidgen(IDL コンパイラ ) で C++ のヘッダと
実装に変換される。
● Bn* クラスが Pidgen で生成されるので、 BBinder
ではなくこちらを継承してクラスを実装する。
Binder 用語解説
● Context
● 各 Binder オブジェクトは SContext で表され
る "context” 中に生成される。
● context はオブジェクトがアクセスできるサービス、
設定等の Global な状態を保持している。
Binder 用語解説
● Service
● /service に公開され、事前に生成される Binder オ
ブジェクト。大抵システム起動時に起動される。
Binder IPC メカニズム
● カーネルモジュールを使用したプロセス間通信の仕組
み。
● 標準 LinuxIPC の代わりに使われ、効率的に「スレッド移
送」として IPC 操作を行うことが出来る。
● ioctl() を使っての read-write として実装されている。
まとめ
● OpenBinder ドキュメントには他ではあまり見ない Binder
の設計思想が書かれている。
● Binder は分散オブジェクトプラットフォームの事であ
り、 IPC はあくまでオブジェクト間のメッセージングに特化
した部分に過ぎない。
最後に
● Binder を理解するためには、 OpenBinder ドキュメントの
● Binder Overview
● API Conventions
● SHandler Patterns
● Binder Recipes
● Binder Terminology
● Binder IPC Mechanism
あたりを読むことをお勧めします。

More Related Content

PDF
Low Level View of Android System Architecture
PPTX
Overview of Android binder IPC implementation
PPTX
Android Binder: Deep Dive
PPTX
Binder: Android IPC
PPTX
Android AIDL Concept
PDF
Android IPC Mechanism
PDF
Explore Android Internals
PDF
From Android NDK To AOSP
Low Level View of Android System Architecture
Overview of Android binder IPC implementation
Android Binder: Deep Dive
Binder: Android IPC
Android AIDL Concept
Android IPC Mechanism
Explore Android Internals
From Android NDK To AOSP

What's hot (20)

PDF
Android binder-ipc
PPT
Android™組込み開発基礎コース BeagleBoard編
PPTX
Android組込み開発基礎コース Armadillo-440編
PDF
Android起動周りのノウハウ
PDF
Android カスタムROMの作り方
PDF
AndroidとSELinux
PDF
Android Camera
PDF
Binderのはじめの一歩とAndroid
PDF
A quick tour of the Cysharp OSS
PDF
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
PDF
Androidのリカバリシステム (Androidのシステムアップデート)
PDF
The Android graphics path, in depth
PDF
カスタムROM開発者の視点から見たAndroid
PDF
Androidの新ビルドシステム
PDF
Understanding the Android System Server
ODP
Q4.11: Porting Android to new Platforms
PDF
0章 Linuxカーネルを読む前に最低限知っておくべきこと
PPT
Learning AOSP - Android Linux Device Driver
PPTX
リアルタイムOSの必要性とTOPPERS/SSPの紹介
PDF
게임 애셋 스트리밍 패치
Android binder-ipc
Android™組込み開発基礎コース BeagleBoard編
Android組込み開発基礎コース Armadillo-440編
Android起動周りのノウハウ
Android カスタムROMの作り方
AndroidとSELinux
Android Camera
Binderのはじめの一歩とAndroid
A quick tour of the Cysharp OSS
【Unite Tokyo 2019】運用中超大規模タイトルにおけるUnityアップデート課題の解決手法と事例
Androidのリカバリシステム (Androidのシステムアップデート)
The Android graphics path, in depth
カスタムROM開発者の視点から見たAndroid
Androidの新ビルドシステム
Understanding the Android System Server
Q4.11: Porting Android to new Platforms
0章 Linuxカーネルを読む前に最低限知っておくべきこと
Learning AOSP - Android Linux Device Driver
リアルタイムOSの必要性とTOPPERS/SSPの紹介
게임 애셋 스트리밍 패치
Ad

Viewers also liked (10)

ODP
Stagefright入門
PDF
Eclipseを使ったandroid nativeデバッグ
ODP
Yapf2013
PDF
JellyBeanのソースをとりあえず眺めてみた(手抜き)
PDF
ABS2015 のセッション紹介
PDF
PF開発に使えるAOSPのツール達
PDF
Stagefright入門
ODP
Intentの概要
ODP
Android デバッグ小ネタ
PDF
Android,Brillo,ChromeOS
Stagefright入門
Eclipseを使ったandroid nativeデバッグ
Yapf2013
JellyBeanのソースをとりあえず眺めてみた(手抜き)
ABS2015 のセッション紹介
PF開発に使えるAOSPのツール達
Stagefright入門
Intentの概要
Android デバッグ小ネタ
Android,Brillo,ChromeOS
Ad

Similar to Open binder (20)

PDF
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
PPTX
T93 com入門
PDF
Binderのはじめの一歩
KEY
関ジャバ JavaOne Tokyo 2012報告会
PDF
Spring3.1概要x di
PDF
Pfi Seminar 2010 1 7
PDF
NPAPIを使ったandroid標準ブラウザの拡張方法
PDF
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
PDF
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
PPT
Android Hacks - 合宿 Service
PDF
//publish/ MSPTutorial 応用編
PPT
オブジェクト指向入門7
PDF
サーバーサイドでの非同期処理で色々やったよ
PDF
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
PPTX
かけ算で使いこなす Xamarin
PPTX
Bindingからframework elementを見つける
KEY
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
PDF
R5 3 type annotation
PPTX
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 2
T93 com入門
Binderのはじめの一歩
関ジャバ JavaOne Tokyo 2012報告会
Spring3.1概要x di
Pfi Seminar 2010 1 7
NPAPIを使ったandroid標準ブラウザの拡張方法
メディア・アートII 第3回 openFrameworks基礎 OOoF : オブジェクト指向 oF
BNN CAMP vol.3  インタラクションデザインの現在―プログラミング初心者のためのopenFrameworks入門 1
Android Hacks - 合宿 Service
//publish/ MSPTutorial 応用編
オブジェクト指向入門7
サーバーサイドでの非同期処理で色々やったよ
成長できるエンタープライズシステムを目指して-OSGiによるモジュール型アーキテクチャの実現-
かけ算で使いこなす Xamarin
Bindingからframework elementを見つける
軽量EvernoteクライアントSmartEverにおけるアプリ高速化の工夫と課題
R5 3 type annotation
JavaFX + NetBeans環境におけるJenkinsの活用(Jenkins第六回勉強会)

Open binder