Upload
naruto-takahashi
View
5.641
Download
0
Embed Size (px)
DESCRIPTION
Citation preview
横浜Androidプラットフォーム部 第24回勉強会 Naruto TAKAHASHI
2012/09/29
Naruto TAKAHASHI(@TNaruto) ◦ [email protected]
◦ http://eflmemo.hatenablog.com
Tizen 推し
Android も触ります
仕事歴も Android の方が長いよ(´・ω・`)
Tizen や Firefox OS ◦ HTML5 Platform
◦ Javascript でデバイスを触れる。 Telephony
Bluetooth
NFC
Etc, etc
Android ◦ non-HTML5 Platform
◦ Javascript でデバイスは触れない。 ◦ 世界で1,2のシェアを誇るプラットフォームがそのザマか! ◦ ないなら作っちゃえ
What’s NPAPI? ◦ NPAPI とはなにかのご紹介
NPAPI Usage ◦ NPAPI の使い方、作り方のご紹介
Android NPAPI ◦ Andorid の NPAPI の独自拡張についてご紹介
◦ Android で NPAPI 開発時の注意点など
What’s Netscape Plugin API?
Netscape Plugin のフレームワーク ◦ ブラウザの機能拡張
実装例 ◦ Adobe Flash Player
◦ Gecko Media Player
◦ VLC Media Player
◦ Isis(web browser of WebOS)
フル HTML で UI が作られている web browser
UI 部分と HTML 描画部分のプロセス切り分けに使用
Scripting をサポート ◦ JavaScript から Netscape Plugin のオブジェクトのメソッドを実行することができる
C/C++ で実装 ◦ OS のリソースを使用、参照可能
システムコールの実行
ファイルシステムの参照、変更
デバイスを触れる
NPAPI を使えば OS のリソースを参照、変更する Javascript API を拡張可能!
How to use plugin and develop plugin.
html で <object> タグで MIME を指定
getElementById() で DOM を取得する
DOM のメソッドを実行する!
<object id=‘plugin‘ type="application/x-tss-nfc-access-plugin“ height=0 width=0></object>
// プラグインの DOM を取得 var nfc_obj = document.getElementById(‘plugin’);
// プラグインのメソッドを実行 alert(nfc_obj.version());
プラグイン作成手順を書くには狭すぎる…
JavaScript メソッド のつくり方について紹介
例として Kernel のバージョンを返すメソッド version() を作成します。
プラグインのつくり方については下記を参照 ◦ NPAPI document
https://developer.mozilla.org/en-US/docs/Plugins
NPObject の二つのコールバック関数へ処理を追加
hasMethod コールバック関数 ◦ メソッド名を追加する。
Invoke コールバック関数 ◦ メソッドの処理を実装する。
“version” という文字列がきたら true を返す
bool plugin_has_method(NPObject *obj __UNUSED__, NPIdentifier methodName) {
// NPIdentifier を文字列へ変換 NPUTF8 *name = NPN_UTF8FromIdentifier(methodName); bool ret = false;
// version であれば true if(strcmp(name,”version”) == 0) { ret = true; }
// 文字列の解放 NPN_MemFree(name); return ret; }
“version” の文字列がきたら実行
/proc/version の中身を文字列として返す
char buf[256];
// /proc/version をオープン FILE *fp = fopen("/proc/version", "r"); if(!fp) goto end;
// /proc/version を読み込んで buf 格納する memset(buf, 0, sizeof(buf)); fread(buf, 256, 1, fp); fclose(fp);
// buf を NPVARIANT 型として返す STRINGZ_TO_NPVARIANT(strdup(buf), *result);
Android is complex platform
Android のシステムは Java 実装 ◦ ブラウザも Java 実装
NPAPI は C/C++ 実装
NPAPI から Android のリソースへのアクセス方法はどうなってんの?
Android のリソースにアクセスする方法は二つ ◦ android_npapi.h を使用する
◦ JNI でアクセスする
Android の API のラッパー ◦ 実行API
◦ 取得API
◦ 設定API
例: ログ
ブラウザのライフサイクルイベント定義
ブラウザや WebView の Context の取得
Android での JNI の普通な使い方 ◦ アプリの特定の部分をCやアセンブラで実装して高速化
◦ ハードへのアクセスをJava側に提供する
センサ
OS 内部
Application(Java)
JNI
Native Code(C)
Java から C を実行する
Plugin は C/C++ から Java を実行します。 ◦ Android Framework のリソースを取得
◦ サービスとやりとりする
Android Frameworks(Java)
JNI
Plugin(Native Code)
C から Java を実行する
例: FeliCa リーダのFD(ファイルディスクリプタ)が欲しい ◦ FeliCa リーダのデバイスファイルを open() すれば?
/dev/bus/usb/xxx/xxx
2.3 以降から Android USB 機能が搭載 ◦ USB Accessor でユーザから許可取らないと
/dev/bus/usb 以下を触れない仕様
◦ 許可取ってからじゃないと FD も取得できない…
Android のリソース ◦ Java でしか触れない。
◦ 郷に入れば郷に従え
C から Java を実行 ◦ USB のアクセス許可+FDを返すクラスを実装
Plugin の中でクラスをインスタンスを管理
Browser
Plugin
Android Framework
kernel
JNI
Device
Browser
Plugin
Android Framework
kernel
JNI
Device
USB アクセス許可を取得
ブラウザが USB のアクセス許可のダイヤログを表示
Browser
Plugin
Android Framework
kernel
JNI
Device
FD を取得
Browser
Plugin
Android Framework
kernel
JNI
Device
デバイスへアクセス!
Android では Plugin のロードを制限している。 ◦ セキュリティホールになるため
ロードするための二つの解決方法 ◦ PluginManager.java へ公開署名のシグネチャを追加
◦ insecure boot で起動
Webkit の Plugin のロードを管理しているところ ◦ ${ANDROID_SRC}/frameworks/base/core/java/andr
oid/webkit/PluginManager.java
◦ 噂によると SIGNATURE_1 は Adobe さんの公開署名?
Flash Player って無条件にロードできるよね…
private static final Signature[] SIGNATURES = new Signature[] { new Signature(SIGNATURE_1) }; boolean signatureMatch = false; for (int i = 0; i < SIGNATURES.length; i++) { if (SIGNATURES[i].equals(signature)) { signatureMatch = true; break; }} if (!signatureMatch) {return false;}
What’s NPAPI? ◦ ブラウザの機能を拡張できます。
◦ javascript から OS のリソースを参照、変更する API を作成できます。
NPAPI Usage ◦ 使うには DOM のメソッドを実行
◦ メソッドは hasMethod と Invoke へ処理を追加
Android NPAPI ◦ android_npapi.h でリソースへ触れる。 ◦ android_npapi.h 外の触りたい場合は JNI(C->Java)
触る機能について完全把握すること 例として
Android での USB のリソースの持ち方
Android での NFC の動作の仕様
C から Java の呼び出しを使いこなせるように。
◦ デフォルトだとプラグインはロードできない。 PluginManager へ公開署名のシグネチャを追加できる人でないと使うのは難しい。
あるいは insecure boot…
NPAPI document ◦ https://developer.mozilla.org/en-US/docs/Plugins
◦ Mozilla さんに NPAPI のドキュメントがたくさんあります
NPAPI SDK ◦ http://code.google.com/p/npapi-sdk/
◦ まずは気軽に PC で Netscape Plugin を作ってみよう
Andorid 用 NPAPI サンプル ◦ ${ANDROUD_SOURCE}/development/samples/Brows
erPlugin
Android with NPAPI で面白いことできませんかね