Contenu connexe Similaire à NPAPIを使ったandroid標準ブラウザの拡張方法 Similaire à NPAPIを使ったandroid標準ブラウザの拡張方法 (20) Plus de Naruto TAKAHASHI (11) NPAPIを使ったandroid標準ブラウザの拡張方法2. Naruto TAKAHASHI(@TNaruto)
◦ tnaruto@gmail.com
◦ http://eflmemo.hatenablog.com
Tizen 推し
Android も触ります
仕事歴も Android の方が長いよ(´・ω・`)
3. Tizen や Firefox OS
◦ HTML5 Platform
◦ Javascript でデバイスを触れる。
Telephony
Bluetooth
NFC
Etc, etc
Android
◦ non-HTML5 Platform
◦ Javascript でデバイスは触れない。
◦ 世界で1,2のシェアを誇るプラットフォームがそのザマか!
◦ ないなら作っちゃえ
4. What’s NPAPI?
◦ NPAPI とはなにかのご紹介
NPAPI Usage
◦ NPAPI の使い方、作り方のご紹介
Android NPAPI
◦ Andorid の NPAPI の独自拡張についてご紹介
◦ Android で NPAPI 開発時の注意点など
6. Netscape Plugin のフレームワーク
◦ ブラウザの機能拡張
実装例
◦ Adobe Flash Player
◦ Gecko Media Player
◦ VLC Media Player
◦ Isis(web browser of WebOS)
フル HTML で UI が作られている web browser
UI 部分と HTML 描画部分のプロセス切り分けに使用
7. Scripting をサポート
◦ JavaScript から Netscape Plugin のオブジェクトのメソッド
を実行することができる
C/C++ で実装
◦ OS のリソースを使用、参照可能
システムコールの実行
ファイルシステムの参照、変更
デバイスを触れる
NPAPI を使えば OS のリソースを参照、変更する
Javascript API を拡張可能!
9. 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());
11. プラグイン作成手順を書くには狭すぎる…
JavaScript メソッド のつくり方について紹介
例として Kernel のバージョンを返すメソッド
version() を作成します。
プラグインのつくり方については下記を参照
◦ NPAPI document
https://developer.mozilla.org/en-US/docs/Plugins
12. NPObject の二つのコールバック関数へ処理を追加
hasMethod コールバック関数
◦ メソッド名を追加する。
Invoke コールバック関数
◦ メソッドの処理を実装する。
13. “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;
}
14. “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);
16. Android のシステムは Java 実装
◦ ブラウザも Java 実装
NPAPI は C/C++ 実装
NPAPI から Android のリソースへのアクセス方法は
どうなってんの?
17. Android のリソースにアクセスする方法は二つ
◦ android_npapi.h を使用する
◦ JNI でアクセスする
18. Android の API のラッパー
◦ 実行API
◦ 取得API
◦ 設定API
例: ログ
ブラウザのライフサイクルイベント定義
ブラウザや WebView の Context の取得
19. Android での JNI の普通な使い方
◦ アプリの特定の部分をCやアセンブラで実装して高速化
◦ ハードへのアクセスをJava側に提供する
センサ Java から C を実
OS 内部 行する
Application(Java)
JNI
Native Code(C)
20. Plugin は C/C++ から Java を実行します。
◦ Android Framework のリソースを取得
◦ サービスとやりとりする
C から Java を実
行する
Plugin(Native Code)
JNI
Android Frameworks(Java)
21. 例: FeliCa リーダのFD(ファイルディスクリプタ)が欲し
い
◦ FeliCa リーダのデバイスファイルを open() すれば?
/dev/bus/usb/xxx/xxx
2.3 以降から Android USB 機能が搭載
◦ USB Accessor でユーザから許可取らないと
/dev/bus/usb 以下を触れない仕様
◦ 許可取ってからじゃないと FD も取得できない…
22. Android のリソース
◦ Java でしか触れない。
◦ 郷に入れば郷に従え
C から Java を実行
◦ USB のアクセス許可+FDを返すクラスを実装
Plugin の中でクラスをインスタンスを管理
25. ブラウザが USB のアクセス許可のダイヤログを表示
27. デバイスへアクセ
ス!
Browser
Plugin
JNI
Android Framework
kernel
Device
28. Android では Plugin のロードを制限している。
◦ セキュリティホールになるため
ロードするための二つの解決方法
◦ PluginManager.java へ公開署名のシグネチャを追加
◦ insecure boot で起動
29. 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;}
31. What’s NPAPI?
◦ ブラウザの機能を拡張できます。
◦ javascript から OS のリソースを参照、変更する API を作
成できます。
NPAPI Usage
◦ 使うには DOM のメソッドを実行
◦ メソッドは hasMethod と Invoke へ処理を追加
32. Android NPAPI
◦ android_npapi.h でリソースへ触れる。
◦ android_npapi.h 外の触りたい場合は JNI(C->Java)
触る機能について完全把握すること
例として
Android での USB のリソースの持ち方
Android での NFC の動作の仕様
C から Java の呼び出しを使いこなせるように。
◦ デフォルトだとプラグインはロードできない。
PluginManager へ公開署名のシグネチャを追加できる人でな
いと使うのは難しい。
あるいは insecure boot…
33. 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