34
横浜Androidプラットフォーム部 24回勉強会 Naruto TAKAHASHI 2012/09/29

NPAPIを使ったandroid標準ブラウザの拡張方法

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: NPAPIを使ったandroid標準ブラウザの拡張方法

横浜Androidプラットフォーム部 第24回勉強会 Naruto TAKAHASHI

2012/09/29

Page 2: NPAPIを使ったandroid標準ブラウザの拡張方法

Naruto TAKAHASHI(@TNaruto) ◦ [email protected]

◦ http://eflmemo.hatenablog.com

Tizen 推し

Android も触ります

仕事歴も Android の方が長いよ(´・ω・`)

Page 3: NPAPIを使ったandroid標準ブラウザの拡張方法

Tizen や Firefox OS ◦ HTML5 Platform

◦ Javascript でデバイスを触れる。 Telephony

Bluetooth

NFC

Etc, etc

Android ◦ non-HTML5 Platform

◦ Javascript でデバイスは触れない。 ◦ 世界で1,2のシェアを誇るプラットフォームがそのザマか! ◦ ないなら作っちゃえ

Page 4: NPAPIを使ったandroid標準ブラウザの拡張方法

What’s NPAPI? ◦ NPAPI とはなにかのご紹介

NPAPI Usage ◦ NPAPI の使い方、作り方のご紹介

Android NPAPI ◦ Andorid の NPAPI の独自拡張についてご紹介

◦ Android で NPAPI 開発時の注意点など

Page 5: NPAPIを使ったandroid標準ブラウザの拡張方法

What’s Netscape Plugin API?

Page 6: NPAPIを使ったandroid標準ブラウザの拡張方法

Netscape Plugin のフレームワーク ◦ ブラウザの機能拡張

実装例 ◦ Adobe Flash Player

◦ Gecko Media Player

◦ VLC Media Player

◦ Isis(web browser of WebOS)

フル HTML で UI が作られている web browser

UI 部分と HTML 描画部分のプロセス切り分けに使用

Page 7: NPAPIを使ったandroid標準ブラウザの拡張方法

Scripting をサポート ◦ JavaScript から Netscape Plugin のオブジェクトのメソッドを実行することができる

C/C++ で実装 ◦ OS のリソースを使用、参照可能

システムコールの実行

ファイルシステムの参照、変更

デバイスを触れる

NPAPI を使えば OS のリソースを参照、変更する Javascript API を拡張可能!

Page 8: NPAPIを使ったandroid標準ブラウザの拡張方法

How to use plugin and develop plugin.

Page 9: NPAPIを使ったandroid標準ブラウザの拡張方法

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());

Page 10: NPAPIを使ったandroid標準ブラウザの拡張方法
Page 11: NPAPIを使ったandroid標準ブラウザの拡張方法

プラグイン作成手順を書くには狭すぎる…

JavaScript メソッド のつくり方について紹介

例として Kernel のバージョンを返すメソッド version() を作成します。

プラグインのつくり方については下記を参照 ◦ NPAPI document

https://developer.mozilla.org/en-US/docs/Plugins

Page 12: NPAPIを使ったandroid標準ブラウザの拡張方法

NPObject の二つのコールバック関数へ処理を追加

hasMethod コールバック関数 ◦ メソッド名を追加する。

Invoke コールバック関数 ◦ メソッドの処理を実装する。

Page 13: NPAPIを使ったandroid標準ブラウザの拡張方法

“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; }

Page 14: NPAPIを使ったandroid標準ブラウザの拡張方法

“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);

Page 15: NPAPIを使ったandroid標準ブラウザの拡張方法

Android is complex platform

Page 16: NPAPIを使ったandroid標準ブラウザの拡張方法

Android のシステムは Java 実装 ◦ ブラウザも Java 実装

NPAPI は C/C++ 実装

NPAPI から Android のリソースへのアクセス方法はどうなってんの?

Page 17: NPAPIを使ったandroid標準ブラウザの拡張方法

Android のリソースにアクセスする方法は二つ ◦ android_npapi.h を使用する

◦ JNI でアクセスする

Page 18: NPAPIを使ったandroid標準ブラウザの拡張方法

Android の API のラッパー ◦ 実行API

◦ 取得API

◦ 設定API

例: ログ

ブラウザのライフサイクルイベント定義

ブラウザや WebView の Context の取得

Page 19: NPAPIを使ったandroid標準ブラウザの拡張方法

Android での JNI の普通な使い方 ◦ アプリの特定の部分をCやアセンブラで実装して高速化

◦ ハードへのアクセスをJava側に提供する

センサ

OS 内部

Application(Java)

JNI

Native Code(C)

Java から C を実行する

Page 20: NPAPIを使ったandroid標準ブラウザの拡張方法

Plugin は C/C++ から Java を実行します。 ◦ Android Framework のリソースを取得

◦ サービスとやりとりする

Android Frameworks(Java)

JNI

Plugin(Native Code)

C から Java を実行する

Page 21: NPAPIを使ったandroid標準ブラウザの拡張方法

例: FeliCa リーダのFD(ファイルディスクリプタ)が欲しい ◦ FeliCa リーダのデバイスファイルを open() すれば?

/dev/bus/usb/xxx/xxx

2.3 以降から Android USB 機能が搭載 ◦ USB Accessor でユーザから許可取らないと

/dev/bus/usb 以下を触れない仕様

◦ 許可取ってからじゃないと FD も取得できない…

Page 22: NPAPIを使ったandroid標準ブラウザの拡張方法

Android のリソース ◦ Java でしか触れない。

◦ 郷に入れば郷に従え

C から Java を実行 ◦ USB のアクセス許可+FDを返すクラスを実装

Plugin の中でクラスをインスタンスを管理

Page 23: NPAPIを使ったandroid標準ブラウザの拡張方法

Browser

Plugin

Android Framework

kernel

JNI

Device

Page 24: NPAPIを使ったandroid標準ブラウザの拡張方法

Browser

Plugin

Android Framework

kernel

JNI

Device

USB アクセス許可を取得

Page 25: NPAPIを使ったandroid標準ブラウザの拡張方法

ブラウザが USB のアクセス許可のダイヤログを表示

Page 26: NPAPIを使ったandroid標準ブラウザの拡張方法

Browser

Plugin

Android Framework

kernel

JNI

Device

FD を取得

Page 27: NPAPIを使ったandroid標準ブラウザの拡張方法

Browser

Plugin

Android Framework

kernel

JNI

Device

デバイスへアクセス!

Page 28: NPAPIを使ったandroid標準ブラウザの拡張方法

Android では Plugin のロードを制限している。 ◦ セキュリティホールになるため

ロードするための二つの解決方法 ◦ PluginManager.java へ公開署名のシグネチャを追加

◦ insecure boot で起動

Page 29: NPAPIを使ったandroid標準ブラウザの拡張方法

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;}

Page 30: NPAPIを使ったandroid標準ブラウザの拡張方法
Page 31: NPAPIを使ったandroid標準ブラウザの拡張方法

What’s NPAPI? ◦ ブラウザの機能を拡張できます。

◦ javascript から OS のリソースを参照、変更する API を作成できます。

NPAPI Usage ◦ 使うには DOM のメソッドを実行

◦ メソッドは hasMethod と Invoke へ処理を追加

Page 32: NPAPIを使ったandroid標準ブラウザの拡張方法

Android NPAPI ◦ android_npapi.h でリソースへ触れる。 ◦ android_npapi.h 外の触りたい場合は JNI(C->Java)

触る機能について完全把握すること 例として

Android での USB のリソースの持ち方

Android での NFC の動作の仕様

C から Java の呼び出しを使いこなせるように。

◦ デフォルトだとプラグインはロードできない。 PluginManager へ公開署名のシグネチャを追加できる人でないと使うのは難しい。

あるいは insecure boot…

Page 33: NPAPIを使ったandroid標準ブラウザの拡張方法

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

Page 34: NPAPIを使ったandroid標準ブラウザの拡張方法

Android with NPAPI で面白いことできませんかね