Android版Firefoxのユーザーは、マーケットプレイスアプリを "通常" のAndroidアプリとしてインストールすることができ、強力なOpen Web機能の恩恵を受けることが出来ます。この機能はAPK Factoryの APK作成により実現しています。インストールされたアプリはAndroid上のFirefoxに含まれるWebランタイム上で実行されます。 アプリをAndroid版Firefoxで動作するにすれば、潜在的なユーザーを拡大することができ、さらなるアプリ配布の機会を得ることが出来ます。
AndroidのOpen Web Appsとは?
Android 用 Open Web Apps は Android アプリと同じようにインストール・実行することができるAPK (Androidインストールパッケージ) にマーケットプレイスアプリをパッケージ化することが可能となります。APKパッケージは、Webコンテンツ(アプリにパッケージ化された場合) やWebコンテンツへの参照(サーバーへアップロードされた場合)で構成されます。 これらのコンテンツは薄いJava/Androidラッパーに囲まれており、Android OSとの統一性を提供しいます。 一度機器にインストールされたアプリは Android版FirefoxコンポーネントのAndroid版Webランタイム上で実行されます。
これらのパッケージはマーケットプレイスのWebサービスとして動作している APK Factory Service によって作成されています。APK Factory Service は実際のパッケージを作成するために APK Factory Library を利用し、APKにデジタル署名を付与するために APK Signer を利用しています。このサービスは自身のマーケットプレイスを作成することで利用できます。
Android開発の知識がなくても、また特別な開発ステップを踏まずとも、Android向けのOpen Web Appsを使うことはできます。単にFirefoxマーケットプレイスに提出する際に対象デバイスを指定するオプションで Firefoxモバイル・Firefoxタブレットを選択するだけです。
Note: AndroidのOpen Web AppsはAndroid版Firefox xx以上でホスト型アプリをサポートしています。Android版Firefox 29以上ではパッケージ化されたアプリに対応しています。現時点のマーケットプレイスでは、Android用のアプリは無料のもののみが入手可能です。
AndroidのWebランタイムでは、ヴァイブレーション・位置情報・バッテリー情報など機器機能にアクセスする12個のAPIをサポートしています。APIのサポートリストから確認することが出来ます。そこでは"Availability"列に"A"と表示されている箇所がAndroidの対応状況です。緑色のセルは完全に対応しているAPIです。個々のセルにマウスを合わせるとさらなる情報を含んだツールチップが表示されます。
AndroidのWebランタイムはあらたなる他のAPIを継続して追加リリースしています。計画されているものとして以下のAPIがあります。
- アラームAPI
- SimplePush API
- Web Activities
Note:Androidユーザーはより高解像度のデバイスを利用しており、既存Firefox OS端末よりもピクセル密度やスクリーンサイズが大きい可能性があります。そのためレスポンシブデザインを利用していなければユーザーエクスペリエンスが乏しくなることがあり、このことを常に考慮して設計する必要があります。レスポンシブデザインに関する情報はアプリセンターのデザインセクションを参照してください。
FirefoxマーケットプレイスからAndroid Open Web Appsを利用する
このセクションでは Firefox マーケットプレイスにある Android Open Web Appsの詳しい使い方、マーケットプレイスの利用体験にどのような影響があるのか、またアプリをアップデートするための方法について説明します。
アプリを提出する
Firefoxマーケットプレイスにアプリを提出する際のオプションとして、FirefoxモバイルまたはFirefoxタブレット対応のアプリとするかを選択することが出来ます。オプションのいずれか、または両方を選択すると、自動的にAndroid端末向けのAPKとしてアプリを提供することが出来ます。
アプリの承認
アプリはレビュー時に、レビューアーがFirefox マーケットプレイスのレビューセクションからアプリをインストールします。 レビューアーがAndroid端末にインストールすると、APK Factory Serviceの "review"インスタンスが Android デバッグモードで署名されたAPKを生成するため実行されます。このバージョンのAPKはレビューアーのデバイスにインストールされレビュープロセスを完了します。
もしアプリが承認されれば、APK Factory Serviceの "release"インスタンスが実行され、ユニークなAPK鍵で署名されたAPKを生成します。この署名済みのAPKはキャッシングされ、ユーザーがアプリをインストールするオプションを選択した時に利用されます。
アプリのインストール
ユーザーがAndroidデバイス上でマーケットプレイスからアプリを選択すると以下のインストール処理が実行されます。
- Firefox マーケットプレイスはアプリの詳細情報と通常であれば無料のインストールボタンを表示します。
- ユーザーが無料のインストールボタンをおした時、
Apps.install
またはApps.installPackage
が(アプリがホスト型か、パッケージ型かに依存します)通常どおり実行されAPK Factory Serviceに対してAPKを要求します。 - APKはAndroid端末にダウンロードされ、通常のAndroidアプリのインストールプロセスが実行されます。
- もしユーザーがセキュリティ設定の提供元不明のアプリ設定を有効になしていない場合、Androidはユーザーに対して警告を出し、インストールをキャンセルするか設定を開くかの選択を要求します。
- 一度提供元不明のアプリ設定を有効にしていれば、インストール確認ダイアログが表示されます。ダイアログではアプリが要求する権限のリストが表示されます。
- ユーザーがインストールを選択すればアプリはインストールされます。
- アプリがインストールされると、アプリを開くオプションがユーザーに提供され、Firefox マーケットプレイスの無料ボタンは起動ボタンに置き換わります。
インストール後はアプリ一覧画面にインストールしたアプリが表示されます。加えて、起動およびアンインストールの方法は他のAndroidアプリの使い方と同じです。Android版Firefoxではツールメニューのアプリからインストールされたアプリリストを見ることができます。
アプリの更新
Android版Firefoxはアプリのアップデートをインストールする仕組みを提供しています。
ホスト型アプリの場合は、サーバー上のアプリを更新すれば、ユーザーが次回アプリを起動した時に更新されます。
他の変更は、Firefox マーケットプレイスから最新アプリを追加する必要があります。
- ホスト型アプリについてはホストしているサーバーに置かれているmanifestファイルを指すリンクを更新します。
- パッケージ型アプリについてはアプリのmanifestとコンテンツを含むzipファイルを更新します。
Android版Firefox は日々アプリのmanifestに書かれているバージョン番号をチェックし、変更があれば更新を適用します。
自身のマーケットプレイスでAndroid Open Web Appsを利用する
マーケットプレイスを自身で構築することが可能です。そのマーケットプレイスを構成する内容は、Firefoxマーケットプレイスか、独自のホストされたコンテンツのディレクトリです。(アプリの説明は、ホスト型アプリの場合はメインとなるmanifestに、パッケージ型アプリの場合はZip圧縮されているミニmanifestに記述されています)
自身のマーケットプレイスではインストールされる Manifest の URL を Apps.install
/ Apps.installPackage
に渡してAPK Factory を実行します。つまり、マーケットプレイスでAndroid Open Web Appsの設定を何もする必要がないということです。ただし、Android Web ランタイムでサポートしているAPIがアプリに含まれるかだけを考慮していれば良いです。
APK Factoryの動作仕様
このセクションではAPK Factoryの動作仕様を説明します。
- APK Factoryが実行された時、上述したようにアプリのAPKファイルがキャッシュされているかどうかチェックします。もしキャッシュされていない場合、APK Factoryは以下の動きをします。
- ホストサーバーにアプリのManifestファイルを要求します(Firefox マーケットプレイスまたは、アプリがホストされているサーバーに対して)
- ホスト型アプリの場合はメインとなるManifestファイル
- パッケージ型アプリの場合はミニManifestファイル
- アプリがホスト型かパッケージ型かを検知する
- もし、パッケージ型アプリの場合、APK Factory はマーケットプレイスまたはホストサーバーに対してアプリのZip圧縮ファイルを要求します。
- アイコンやセキュリティ要件などの要素をメタデータから変換することでAPKファイルを生成します。その後、
- ホスト型アプリの場合はホストされているURLを扱うAndroid Javaコンテナをラップします。
- パッケージ型アプリの場合はアプリのコンテンツを扱うAndroid Javaコンテナをラップします。
- セキュアなAPK Signer Serviceを利用しAPKに署名を付与する
- "Review" APKはAndroidのデバッグ鍵を使い署名を付与する
- "Release" APKはAPKの署名鍵を使い署名を付与する
- 署名済みAPKをキャッシュする
- ホストサーバーにアプリのManifestファイルを要求します(Firefox マーケットプレイスまたは、アプリがホストされているサーバーに対して)
- 端末にインストールするために署名済みAPKを提供する
下図はAPK Factoryの動作仕様を表したシーケンス図です。
パッケージ命名規則とAPK署名鍵
Android端末はアプリをインストールする際に、Javaのパッケージ名と付与されている署名をチェックしています。このチェックはそのアプリが初めてインストールされる際に行われるものです(中央認証局のようなものは存在しません)。一方、アップデートの際はパッケージ名と付与した署名が、初回インストール時と同じものでなければなりません。もし、パッケージ名や付与した署名が異なる場合、Android端末はアップデートを実行しません。
パッケージ命名規則
パッケージ名はAPKがホストされているサイトとユニークなシリアル番号から構成されています。
例:
- ホスト型アプリの場合: org.mykzilla.p362b12c70d0556c124908a3c125d3d02:
- パッケージ型アプリの場合: com.firefox.marketplace.p0604c71abc0d4091829d19be9a50453c
APK署名鍵
APKが Android端末にインストール可能となるためには、APK鍵によって識別されている必要があります。APK鍵は APK Signer serviceによって生成され、保持されています。署名するための鍵はデリケートなもので、APK Singerによってセキュアに保存されています。
このサービスはアプリごとにユニークな署名鍵を生成し、初回リリースおよびアップデート時にも署名を付与します。アップデートするアプリのAPKファイルにも初回リリースと同じ鍵を付与することは重要です。もしパッケージ名や署名鍵が前回インストール時と異なるものであればAndroidはアップデートをインストールしないからです。後で自身でマーケットプレイスを構築した場合でも、APKが同じパッケージ名と署名を保っていれば、どちらのバージョンでも更新インストールすることが可能になります。
Note:Mozillaでは、APK署名鍵の信頼性について一切の責任を負いません。これは、アプリがマーケットプレイスにホストされていても、そのアプリや作者の正統性について、署名鍵では承認されたリリースであること以外の情報は分からないということです。サービスはGoogleや他の中央当局に結びついてはいません。
FAQ
ここでは、Android Open Web AppsのAPKで、定期的に質問される事をFAQとして説明しています。
ブックマークとしてインストールされているアプリの再インストール方法は?
ユーザーがAndroid版Firefoxのバージョン29またはそれ以上にアップデートした場合でも、ブックマークスタイルのアプリは機能します。そしてFirefoxはユーザーに対してそのブックマークスタイルのアプリをAndroid Open Web Appsにアップデートするよう警告を表示します。
アプリ内課金はどのように機能しますか?
アプリが信頼されたUI、mozPay、そして全てのアプリ内課金支払いプロセスのアクセスを許可されていれば、アプリ内課金は通常どおり機能します。
APKのコピーはどのようにダウンロードできますか?
以下のURL形式で、APK Factory ServiceからAPKのコピーをダウンロードできます。
https://controller.apk.firefox.com/application.apk?manifestUrl=ESCAPED_URL_TO_MANIFEST
ESCAPED_URL_TO_MANIFESTはアプリのマニフェストまたはミニマニフェストのURLをエスケープしたものです。このURLはAPKのキャッシュがあればキャッシュされたAPKを返し、キャッシュされていなければ、新たにAPKを作成します。
例
ホスト型アプリの場合:
> wget https://controller.apk.firefox.com/application.apk?manifestUrl=http%3A%2F%2Fmykzilla.org%2Fapp%2Fmanifest.webapp -O mykzilla.apk
パッケージ型アプリの場合:
> wget https://controller.apk.firefox.com/application.apk?manifestUrl=https%3A%2F%2Fmarketplace.firefox.com%2Fapp%2Fa22e0277-35bc-434d-9371-1568c75fc726%2Fmanifest.webapp -O cuttherope.apk
異なるURLから手動でAPKを生成することはできますか?
はい、マニフェストまたはミニマニフェストを指すURLを提供すれば可能です。ただし、生成されたAPKはFirefoxマーケットプレイスに提出したアプリとURLが異なるため、パッケージ名も異なることに注意してください。
そのため、Firefoxマーケットプレイスのアプリとは別にインストールされます。
APK Factoryを独自にセットアップして生成されたAPKを利用することは可能ですか?
可能です。しかし、Firefoxマーケットプレイスから生成されたAPKの署名と異なる署名鍵が付与されていることに注意してください。その結果、Androidは2つ目の(いずれにしても後にインストールしようとした方の)バージョンのインストールを拒絶します。(「ネイティブアプリと同時にAndroid端末にインストールすることは可能ですか?」も参照してください)
生成されたAPKをGooglePlayまたは他のAndroidストアに提出できますか?
APK Factoryで生成されたAPKをGoogle Playや他のAndroidストアに提出することは可能です。その際、以下の点についてはあなた自身で行う必要があります。
- 提出するストアのポリシーに準拠する必要があります。
Firefoxマーケットプレイスで承認されても、Google Playや他のストアでも承認されるとは限りません。 - アプリのアップデートする際には、アップデートしたAPKをストアにも提出してください。自動でAndroidストアなどに配信することはありません。
APK署名時とパッケージ名選択時に独自署名を付与できますか?
現状はAPK FactoryがAPKを生成するときの署名時や、パッケージ名選択するときには独自の署名鍵で署名することはできません。これは考慮されたオプションです。
もし、興味があれば、dev-marketplaceメーリングリストまたはMarketplace IRC channelで議論に参加してください。
ネイティブアプリと同時にAndroid端末にインストールすることは可能ですか?
APK Factoryが生成したパッケージ名と同じ名前をネイティブアプリで採用しない限りは両方のアプリをAndroid端末にインストールすることは可能です。
もし、同じ名前を選択した場合(独自の鍵で署名したもの)、Androidは2つ目のアプリをインストールする段階で拒絶します。これは、パッケージ名が同じでも署名した鍵が異なるためです。だからAndroidでは同じアプリだが、別ソースと判断しています。
そのため、Androidでは開発者が別のアプリを上書きできるようにならないように、アップデートを拒絶します。ユーザーにとっては最初にインストールしたアプリだけが、端末にインストールされた状態となります。
ユーザーにとって障害を引き起こす原因となるため、APK Factoryがアサインしたパッケージ名と同じパッケージ名をネイティブアプリで利用することは推奨しましません。
APKのテスト・デバッグ方法はどのようにすればいいですか?
我々はAndroid端末上でアプリのテスト・デバッグができるツールチェインを開発しています。初期バージョンには Node ベースのコマンドラインツールが含まれ、APKの生成が可能です。この APK は端末にインストールして Firefoxのリモートデバッグツールを使ってデバッグすることができます。
関連項目
- Hacks blog: Firefox OS Apps run on Android
- Hack blog: Testing Your Native Android App