Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

5,897 views

Published on

Published in: Technology
  • Be the first to comment

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 で面白いことできませんかね

×