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

5,602 views
5,436 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,602
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
15
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

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

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

×