デバイスフィルタリングと互換性


デバイスフィルタリングと互換性

アプリをインストールできるデバイスの種類は、AmazonアプリストアにAPKを申請した際のアプリのマニフェストの属性によって決まります。マニフェストとデバイスの機能に互換性がないと、APKファイルでそのデバイスをサポートできません。以下のセクションでは、デバイスのサポートに影響を与えるフィルターについて説明します。サポート対象のデバイスについては、手動で編集することもできます。

概要

Fire OSはAndroidをベースにしているため、Amazonは可能な限りAndroid開発と同等性を維持するようにしています。したがって、ここではAndroidで提供されている情報を繰り返すのではなく、AmazonやFire OSに固有の点を説明します。概念の理解を深めるのに役立つAndroidの基本的なドキュメントトピックには次のものがあります。

頻出用語についてはこちらを参照してください。

その他の用語の定義については、アプリの申請に関する用語集を参照してください。

APKのマニフェストで指定されるデバイスの互換性

Androidの標準的な方法と同じように、APKマニフェストとbuild.gradleファイルの属性を使って、アプリと互換性のあるデバイスを指定します。次に例を示します。

  • アプリのマニフェストでminSdkVersion=4smallScreens=falseを設定した場合、それらの要件を満たしていないデバイスにAmazonアプリストアからアプリをインストールすることはできません。 
  • マニフェストでカメラ機能の要件(<uses-feature android:name="android.hardware.camera" />)を宣言している場合、カメラを搭載していないデバイスと互換性を持つことはできません。互換性のないデバイスを使用するユーザーには、そのアプリがインストール可能なアプリとして表示されることはありません。

Amazonアプリストアは、APKマニフェストのフィルターを使用して、ユーザーのデバイスのハードウェアおよびソフトウェア要件や、通信事業者、場所、その他の特性をチェックします。また、Amazonはアプリのメタデータで指定されている地理的な利用条件も確認します(これはアプリの公開時に選択します)。

フィルターのルールに照らしてデバイスと互換性がある場合に、アプリはユーザーに提供可能な状態になります。互換性がないとみなされたアプリは、そのユーザーのデバイスで検索結果やカテゴリーに表示されません。

次の表に、フィルターの例を示します。 

フィルターの種類
デバイスの互換性に基づいたフィルタリング アプリのマニフェストでGPSをアプリの要件に指定すると、Amazonアプリストアでは、GPSを搭載していないデバイスにそのアプリは表示されません。
アプリの提供状況に基づいたフィルタリング 開発者ポータルでアプリの配信地域を北米のみに指定すると、北米以外のAmazonアプリストアでは、そのアプリはデバイスに表示されません。

サポートされているマニフェストフィルターの詳細については、Amazonアプリストアでサポートされているフィルターを参照してください。

Amazonデバイスのサポートに加えて、Amazonアプリストアでは、同じフィルターロジックを使用してAmazon以外のデバイスにアプリを提供することもできます。Android用Amazonアプリストアから、ユーザーは自分のAndroidデバイスにアプリをインストールできます (これは、Amazonアプリストアでアプリを購入済みのユーザーがGoogle Playから同じアプリを購入するのを避けたい場合や、Amazonの定期購入型アイテムやコインを持つユーザーが別のデバイスに同じアプリをインストールしてそれを使いたい場合に役立つ可能性があります)。

AmazonとAndroidのAPIレベル

Fireデバイスでは、オペレーティングシステムにFire OSを使用しています。Fire OSは、Androidのカスタムバージョンです。そのため、Fire OSの各バージョンは、単一のAndroid APIレベルに対応しています。したがって、アプリのマニフェストを作成する最初の手順として、android:minSdkVersion属性でターゲットとするFireデバイスに適したAndroid APIレベルを指定します。

各種Amazon Fireデバイスに適したAndroidとAmazonのAPIレベルについては、Fireタブレットのデバイス仕様Fire TVのデバイス仕様を参照してください。たとえば、2013年以降のすべてのタブレットをターゲットにするには、マニフェストに次のようなエントリを含めます。

<uses-sdk android:minSdkVersion="17" />

Androidデバイスと同様、Fireデバイスの種類によってAPIレベルは異なります。たとえば、Fire OS 6で動作するFire TVデバイスはAndroid APIレベル25をベースとしており、Fire OS 5で動作するデバイスはAPIレベル22をベースとしています。Fireタブレットには、さらに多くのAPIレベルがあります。Fire OSのバージョンと機能に関する詳細については、以下のトピックをご覧ください。

以下に注意してください。

  • デバイスのAndroid APIレベルは、Fire OSアップデートの展開に応じて随時変更されます。たとえば、2014年のFireタブレットは、Android APIレベル19のFire OS 4.5で動作します。これらのデバイスが(無線「OTA」による更新プロセスを経て)Fire OS 5.0に更新された場合、Android APIレベルは22に更新されます。APKがFire OSのいずれのバージョンとも互換性がある場合(ほとんどがこれに該当)、マニフェストの<uses-sdk>要素で、デバイスがサポートする最低のAPIレベルにminSdkVersionを設定して、デバイスとの互換性を最大限に確保するようにします (minSdkVersionを22に設定した場合、レベル19以下のみをサポートするデバイスとの互換性がなくなります)。
  • Amazonアプリストアでは、android:maxSdkVersion属性もサポートしています。ただし、アプリが特定のデバイスで利用できるかどうかを確認する場合に限られます。ユーザーがFire OSを新しいバージョンに更新した場合は、効果がありません。通常、より高いAPIレベルと互換性がない場合を除き、この属性を使用する必要はありません。

ハードウェアとソフトウェアの一般的な機能

minSdkVersionを指定したら、<uses-permission><uses-features>要素がアプリと互換性を持たせたいデバイスに適していることを確認します。ハードウェアおよびソフトウェアの特定の機能については、FireタブレットまたはFire TVの仕様を参照してください。

暗黙の機能

多くの開発者は、暗黙の機能でつまずきます。Androidの<uses-feature>の説明によると、特定の機能に対して<uses-permission>を指定すると1つ以上の<uses-feature>要素が暗に指定され、android:required="true"が前提になります。暗黙の機能は必須となるため、機能が存在しないときに適切な制限がかかるようアプリが設計されている場合でも、APKは機能を備えていないデバイスと互換性がないと見なされます。

次のようなシナリオで考えてみます。 アプリでは、近くのガソリンスタンドを検索するために、デバイスの現在位置を使用します。アプリはデバイスのGPSから現在位置を取得できますが、GPSを利用できない場合、ユーザーは住所や場所を入力することができます。GPSを使用するには、マニフェストに次の要素を含める必要があります。

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

機能要件を明示的に定義していない場合、これらの要素は暗黙的に定義されます。

<uses-feature android:name="android.hardware.location" android:required="true" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />

このAPKをAmazonアプリストアに申請した場合、互換性があるのはFireタブレットのWANモデルのみになります。それらのFireデバイスだけがGPS機能を備えているためです。他のFireデバイスとも互換性を持たせるには、マニフェストに次の要素を含め、必須ではないと指定する必要があります(ただし、GPSがなくてもアプリが正常に機能する場合に限ります)。

<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />

暗黙の機能を指定する権限の全リストは、機能要件を伴うパーミッションを参照してください。

Fire TVデバイスのデバイスフィルタリング

Fire TVデバイスでは、次のマニフェスト属性でFire TVのサポートを特定できます。

  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />

この属性を使用するのは、 Fire TVデバイスでタッチスクリーンとマルチタッチ機能がサポートされておらず、スマートフォンやタブレットではサポートされているためです。

Fire TVデバイス用に設計されたAPKをアップロードする場合、APKと互換性のあるデバイスを手動で変更することもできます。詳細については、APKのデバイスサポートを調整するを参照してください。

ウェブアプリのデバイスフィルタリング

Androidマニフェストに基づくデバイスフィルタリングはウェブアプリで利用できませんが、申請プロセスの際にチェックボックスを使ってサポート対象のデバイスを制御することができます。ウェブアプリの場合、ウェブサイトへのURLやウェブファイルを含むZIPパッケージを申請しても、申請プロセス中に、Amazonアプリストアがウェブアプリを取得し、Corodvaエンジンを使ってAndroidアプリを生成します。そのため、ユーザーがダウンロードしてデバイスにインストールするのはAndroidアプリとなります。

ウェブアプリは、非常に基本的なAndroid APIを採用しているため、あらゆるデバイスと互換性があります。WebViewによる1つのアクティビティでウェブファイルやURLがロードされます。APIレベルは10に設定されており、最大限に広範な互換性を実現します。

アプリのインストール場所を指定

Androidマニフェストファイルで、Fireデバイスでのアプリのインストール場所を指定します。ほとんどのアプリで、この値を外部ストレージ(preferExternal)に設定しておけば、デバイスの内部ストレージに空き容量がないためアプリをインストールできないという事態を回避し、ユーザーエクスペリエンスを向上できます。詳細については、アプリのインストール場所を指定を参照してください。

アプリのマニフェストからuses-amzn-sdkを削除

アプリのマニフェストに<uses-amzn-sdk>というタグがある場合は削除します。このタグは、古いFire OS SDKアドオンに関連しており、Fire TVのアプリでは使用されません。

マニフェストにこのタグが残っている状態でも、(ほとんどの場合)アプリは動作しますが、削除することによって、今後の非互換性の発生を回避できます。古いFire OS SDKアドオンのコンポーネントはいずれも、Fireデバイス用アプリの開発には不要です。代わりに、標準のAndroid APIおよびAmazonアプリ・ゲームサービスSDKを使用してください。

APKをアップロード

AmazonのアプリストアにAPKをアップロードする方法の詳細については、手順7、オプション1: APKファイルをアップロードするを参照してください。

同じ公開アプリに対する複数のAPK

1つのAPK内で複数のデバイスをサポートすることもできますが(ランタイム時のパーミッションリクエストの確認や、デバイスが機能をサポートしていない場合のグレースフルデグレデーションなどによる)、同じ公開アプリ用に複数のAPKを作成する方がさらに簡単な場合があります。各APKには、さまざまなデバイス向けに異なるソフトウェア/ハードウェア機能とコンポーネントを含ませることができます。

複数のAPKで調整可能なデバイスの違いには、APIレベル、OpenGL圧縮形式、CPU、画面サイズと密度、デバイス機能、さらに地理的な位置などの要素があります。場合によっては、Fireタブレット向けのAPKに加えて、Fire TV向けのAPKやAmazon以外のAndroidデバイス向けのAPKが必要になることも考えられます。このため、Amazonアプリストアでは同じアプリのAPKを複数アップロードすることができます。

アップロードするAPKの数にかかわらず、Amazonアプリストアでユーザーに表示されるアプリは1つだけです。ダウンロードされるAPKは、ユーザーのデバイスによって決まります。たとえば、「Stream Sports Everywhere(どこでもスポーツをストリーミング)」というアプリを開発したとします。 スマートフォン、タブレット、TVの枠を超えてシームレスにアプリを動作させたいところですが、これらすべてのデバイスで同じAPKを使用するのは簡単ではありません。この場合、スマートフォン/タブレット用とTV用の2つのAPKを作成することになります。

2つ作成しても、Amazonアプリストアでユーザーに表示される「Stream Sports Everywhere(どこでもスポーツをストリーミング)」アプリは1つだけです。ユーザーがTVデバイスからアプリをインストールすると、TV用のAPKがインストールされます。ユーザーがスマートフォンまたはタブレットからアプリをインストールすると、スマートフォン/タブレット用のAPKがインストールされます。

アプリを有料にした場合、アプリを購入済みのユーザーに対して別のデバイスで同じアプリを再購入するよう案内されることはありません。ユーザーはアプリを一度だけ購入すればよく、購入後は使用するデバイスに最適なバージョンが自動的に配信されます。アプリの購入に関してデバイスに最適なアプリを判断できるようにして、ユーザーの安心感を高めます。これにより、アプリのブランドメッセージを強化したり、ユーザーからの信頼やロイヤリティを構築したり、カタログの断片化を減らしたりすることができます。

また、同じアプリに関連するすべてのAPKを対象にレポート、メトリック、レビューが集約されます。この集約によって、アプリの検索ランキングと関連性ランキングが上昇します。

複数のAPKに関する要件

同じアプリで複数のAPKを申請する場合、次の点を確認してください。

1. APKごとに固有のバージョンコードを指定する。

versionCodeとは内部ナンバリングスキームであり、ユーザーには表示されません (versionNameのみがユーザーに表示されます)。 バージョンコードは、選択した任意の整数です(例:11254)。versionCode(およびversionName)はアプリのbuild.gradleファイルで指定されます。詳細については、アプリのバージョン情報の設定を参照してください。

versionCodeはアプリの連続したバージョンを示すために使用します。複数のAPKを作成してアップデートを公開した場合、各デバイスはversionCodeによって、そのアップデート版のAPKが必要かどうかを判断します。versionCodeの番号が大きいほど、新しいバージョンということです。APKと互換性のあるデバイスは、更新されたAPKのversionCodeがインストールされているAPKのversionCodeより大きい場合にのみアプリのアップデートを受信します。

たとえば、1つのアプリに対して、versionCode 10の「ハム」とversionCode 20の「エッグ」という2つのAPKを作成したとします。ユーザーのデバイスには「エッグ」がインストールされています。開発者は、APKのアップデートによってすべてのデバイスから「エッグ」を削除し、今後「ハム」のみを使用するつもりです。しかし、ハムのversionCodeを11に更新したのでは、エッグのversionCodeがもともとそれより大きいため、エッグをインストール済みのユーザーにアップデートがインストールされません。したがって、アップデートを申請する前に、versionCodeを21以上に設定しておく必要があります。

2. 同じ公開アプリでは各APKに同じパッケージ名を使用する。

同じ公開アプリでは各APKのマニフェストで同じパッケージ名を使用する必要があります。詳細については、package(パッケージ)を参照してください。

Amazonアプリストアの各アプリはパッケージ名で識別されます。各アプリには一意のパッケージ名を指定する必要があります。また、カタログの統合の視点から、パッケージ名にamazonという言葉を入れることはできません。

APKでよくある不具合の原因に、異なるアプリに対して同じパッケージ名を使用しているということがあります(同じ公開アプリ用の複数のAPKに対して同じ名前という意味ではありません)。アプリが異なれば別のパッケージ名が必要です。ただし、同じアプリに複数のAPKを作成した場合は、各APKに同じパッケージ名を使用する必要があります。また、既存のAPKの新バージョンを申請する場合、パッケージ名を変更することはできません。

複数のAPKによるversionCodeの例

APKが複数ある場合のパッケージ名とversionCodeの例を見てみましょう。同じアプリに対して、Fireタブレット用のAPKとAmazon Fire TVデバイス用のAPKを1つずつ作成しているとします。最初のAPKのマニフェストでは次のような属性が考えられます。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp"
                ...
</manifest>

APKのbuild.gradleファイルは次のとおりです。

...
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 23
        versionCode 13
        versionName "1.0.6"
        ...
    }

2番目のAPKのマニフェストは、次のようになるでしょう。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp"
                ...
</manifest>

アプリのbuild.gradleは次のようになります。

...
    defaultConfig {
        minSdkVersion 22
        targetSdkVersion 23
        versionCode 14
        versionName "1.0.6"
        ...
    }

唯一の違いはversionCodeです。種類によってはminSdkVersionも異なります。パッケージ名は同じです。各アプリのマニフェストとbuild.gradleファイルはその他の点で異なる場合があります(異なる機能やインテントの宣言など)。ただし、パッケージ名は、各versionCodeが一意の値を使用しているときは同じにする必要があります。

(Amazonアプリストアでは、各APKが適切に異なったかたちになっていることを確認するためのロジックチェックは実行していません。)

複数APKに対するAmazonとGoogle Playのサポートの違い

複数のAPKに対するAmazonの違いの1つは(Google Playとの比較)、Amazonアプリストアで複数のAPKをアップロードした場合、各APKのサポート対象のデバイスを手動で選択することです。

たとえば、同じデバイスに対して複数のAPKで互換性があるとします。サポート対象のデバイスは、Google Playが使用するのと同じロジックに基づいて自動的に選択されるわけではありません(Google Playでは、そのデバイスでサポートされる最高のAPIレベルが自動的に選択されるか、versionCodeの高さによってデバイスのサポートが決められます)。

一方Amazonのアプリストアでは、最初のAPKをアップロードした後、フィルターロジックに基づいてサポート対象のデバイスが自動的に選択されます。2番目のAPKで異なるデバイスをサポートさせたい場合は、最初のAPKからサポート対象のデバイスを手動で削除する必要があります。2番目のAPKをアップロードした後に、そのAPKでサポートするデバイスを選択できます。Amazonアプリストアでは、複数のAPKで同じデバイスをサポートできません (デバイスごとに1つのAPKという概念はGoogle Playと同じですが、Amazonではこの選択プロセスが手動になります)。

デバイスが2番目のAPKを利用できない場合

多くの開発者がこの問題を経験します。2番目のAPKをアップロードした後、すべてのデバイスが互換性なしと表示されたり、どのデバイスも選択できないことがあります。この原因は、デバイスが最初のAPKで選択されているためです。2番目のAPKを使用するには、最初のAPKでデバイスの選択を解除する必要があります。