開発者コンソール

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


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

アプリをインストールできるデバイスの種類は、AmazonアプリストアにAPKを申請した際のアプリのマニフェストbuild.gradleファイルの属性によって決まります。これらのファイルとデバイスの機能に互換性がない場合、そのデバイスでは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アプリストアはAmazon以外のデバイスもサポートしています。マニフェストとbuild.gradleファイルによって、これらのデバイスのサポート状況とフィルタリングロジックも決まります。

Amazon以外のデバイスにAmazonアプリをインストールする場合は、Amazon Androidアプリストアからインストールを行います。ユーザーがAmazon以外のデバイスにAmazonアプリをインストールするのは、Amazonアプリストアで既に購入しているアプリをGoogle Playで再び購入したくない場合や、Amazonで購入したコインや定期購入型アイテムを持っており、別のデバイス(Androidタブレットなど)に同じアプリをインストールして使用したい場合などです。

Fire OSとAndroidのAPIレベル

Fireデバイスでは、オペレーティングシステムにFire OSを使用しています。Fire OSは、Androidのカスタムバージョンです。そのため、Fire OSの各バージョンはAndroid APIレベルに対応しています。アプリのマニフェストを作成する最初の手順として、ターゲットとするFireデバイスに適したAndroid APIレベルをandroid:minSdkVersion属性で指定します。たとえば、2013年以降のすべてのタブレットをターゲットにするには、マニフェストに次のようなエントリを含めます。

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

Androidデバイスと同様に、Fireデバイスの種類によってAPIレベルは異なります。たとえば、Fire TVデバイスには、Fire OS 7(Android APIレベル28ベース)で動作するもののほか、Fire OS 6(Android APIレベル25ベース)で動作するもの、Fire OS 5(APIレベル22ベース)で動作するものがあります。Fireタブレットには、さらに多くのAPIレベルがあります。Fireデバイスごとの具体的なAPIレベルについては、以下を参照してください。

APIレベル間の下位互換性と上位互換性

通常、Android APIは下位互換性があります。つまり、Androidレベル28をサポートするデバイスは、レベル1~27もサポートします。ただし、Android APIには上位互換性はありません。つまり、レベル28で導入された機能はすべて、レベル27でサポートされるとは限りません。そのため、Fire OS 7で利用可能な一部の機能は、Fire OS 6ではサポートされない場合があります。同様に、Fire OS 6の一部の機能は、Fire OS 5ではサポートされない場合があります。Fire OS 6およびFire OS 7向けの開発で特に考慮すべき事項については、以下を参照してください。

APIレベルの更新

デバイスのAndroid APIレベルは、Fire OSアップデートのデプロイに応じて随時変更される場合があります。たとえば、Fireタブレットのバージョンによっては、当初Fire OS 6でリリースされましたが、無線(「OTA」)によるアップデートプロセスを通じて、後からFire OS 7にアップグレードされたものもあります。

APKがFire OSの複数のバージョンと互換性がある場合、マニフェストの<uses-sdk>要素で、デバイスがサポートする最低のAPIレベルにminSdkVersionを設定して、デバイスとの互換性を最大限に確保するようにします。minSdkVersionを22に設定した場合、レベル19以下のみをサポートするデバイスとの互換性がなくなります。

Amazonアプリストアでは、デバイスで許可される最大のAPIレベルを指定するandroid:maxSdkVersion属性もサポートしています。通常、より高い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アプリストアに申請した場合、互換性があるのは、GPS機能が組み込まれたFireタブレット(つまり、WAN(ワイヤレスアクセスネットワーク)に対応したモデル)のみになります。ほかの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" />

この属性は、タッチスクリーン機能が必須ではない(falseである)ことを示します。Fire TVデバイスでタッチスクリーンとマルチタッチ機能がサポートされておらず、スマートフォンやタブレットではサポートされているためです。そのため、このアプリがFire TVデバイスと互換性があるアプリとしてAmazonアプリストアで分類されるようにするには、このandroid.hardware.touchscreen属性をfalseと宣言する必要があります。

ただし、この分類は自動的には行われません。Fire TVデバイス用に設計されたAPKをアップロードする場合にも、開発者コンソールでAPKと互換性のあるデバイスを手動で選択する必要があります。詳細については、APKのデバイスサポートの調整を参照してください。

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

Androidマニフェストに基づくデバイスフィルタリングはウェブアプリには利用できませんが、申請プロセスの際にチェックボックスを使用してサポート対象のデバイスを制御することができます。ウェブアプリの場合、ウェブサイトへのURLの申請や、ウェブファイルを含むzipパッケージのアップロードを行っても、Amazonアプリストアがウェブアプリを取得し、Cordovaラッパーを使用してAndroidアプリを生成します。このCordovaパッケージアプリは、ユーザーがダウンロードしてデバイスにインストールする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 APIAmazon SDKを使用してください。

同じ公開アプリに対する複数の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が複数ある場合のversionCodeの例

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

APK 1のマニフェスト

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

</manifest>

APK 1のbuild.gradleファイル

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

APK 2のマニフェスト

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

</manifest>

APK 2のbuild.gradleファイル

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

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

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

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

複数のAPKに関してAmazonがGoogle Playと異なる点の1つは、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でデバイスの選択を解除する必要があります。