Windows互換性ガイド
既存のアプリについて特定の問題の修正を検討している場合は、Windows向けトラブルシューティングインデックスを参照してください。
新規または既存のアプリのAndroid™用Windowsサブシステムとの互換性を確認する場合、またはAmazonアプリストアを初めて使用してWindows 11デバイスにアプリを移植することを検討している場合は、以下のトピックを参照してください。
AndroidアプリをWindows 11に移植するには、まず以下のトピックを参照してください。
Android 12へのアップグレード:Android用WindowsサブシステムはAndroid 12をベースにしています。Android 12の要件に合わせてアプリを更新してください。
トピック: 対象範囲別ストレージ | 無効なファイル名
Windows向けのアプリ構築:Windows固有のユースケースを処理する方法を説明します。
トピック: 入力コントロール | グラフィック | ウィンドウの管理とサイズ変更 | カメラ機能 | x86 ABIアーキテクチャのサポート
サポートされていない機能の処理:ハードウェアやソフトウェアのサービスの依存関係など、サポートされていない機能の処理方法を説明します。
トピック: サポートされていない共通機能 | サポートが制限されている共通機能 | サポートされていない広告SDKの無効化 | サポートされていないGoogle Playサービスの処理 | サポートされていない機能の条件付き無効化 | サポートされていない機能の表

Android 12へのアップグレード
トピック: 対象範囲別ストレージ | 無効なファイル名
Android用Windowsサブシステムは、Android 12をベースにしています。古いバージョンのAndroidをターゲットとして構築されているアプリは、Android 12の機能に対応するようにアップグレードしてください。
Androidのバージョン間の変更点については、Androidデベロッパードキュメントに重要な情報が記載されています。Android 12への移行については、以下のガイドを参照してください。
アプリにファイルアクセスが必要な場合、新しいバージョンのAndroidでは、特定の機能がWindowsでのアプリの動作に影響を与える可能性があります。ファイルアクセスに関する問題は、通常、対象範囲別ストレージや無効なファイル名が原因です。アプリにファイルアクセスの問題が発生しないようにするには、次のガイドラインに従ってください。
対象範囲別ストレージ
Android用Windowsサブシステムでテストされたアプリで発生するファイルストレージの問題は、多くの場合、対象範囲別ストレージが原因です。対象範囲別ストレージは、Android 10で導入され、Android 11で強化されたAndroidの機能です。対象範囲別ストレージでは、アプリは外部ストレージとアプリが作成したメディアのアプリ固有のディレクトリにのみアクセスできます。対象範囲別ストレージの詳細については、AndroidデベロッパーガイドのAndroidストレージユースケースとベストプラクティスを参照してください。
無効なファイル名
Windows上のAndroidアプリでよく見られるもう1つの問題は、無効なファイル名です。Androidでは、ファイル名に無効な文字が含まれているとファイルが保存されないよう変更が加えられました。以前のバージョンのAndroidでは、無効な文字が置き換えられていましたが、新しいバージョンのAndroidでは、名前に無効な文字を含むファイルを保存しようとすると失敗します。たとえば、名前にタイムスタンプが含まれ、そのタイムスタンプにコロン:
が含まれているファイルは、保存に失敗します。

Windows向けのアプリ構築
トピック: 入力コントロール | グラフィック | ウィンドウの管理とサイズ変更 | カメラ機能 | x86 ABIアーキテクチャのサポート
アプリが快適なユーザーエクスペリエンスを提供するには、モバイルデバイスにはないWindowsデバイス固有の機能に対応する必要があります。たとえば、以下のような機能があります。ここに記載されていない問題については、Amazon開発者フォーラム(英語のみ)にアクセスして、開発者コミュニティのサポートを利用してください。
入力コントロール
Androidなどのタッチスクリーンモバイルデバイス向けにネイティブに設計されたアプリは、キーボードおよびマウスの入力を効果的に処理できないことがあります。タッチスクリーン非対応のWindowsデバイスの入力コントロールにアプリを対応させるは、このセクションのガイドラインに従ってください。
キーボード入力
キーボードでの操作性を高めるために、デバイスにキーボードが搭載されているかどうかを確認するには、次のコードを使用します。
private boolean isKeyboardConnected() {
return getResources().getConfiguration().keyboard == Configuration.KEYBOARD_QWERTY;
}
private fun isKeyboardConnected(): Boolean {
return resources.configuration.keyboard == Configuration.KEYBOARD_QWERTY
}
アプリは、Androidフレームワークによって自動的に処理されない可能性のあるWindowsアプリとゲームの共通コントロールを処理する必要があります。Windowsデバイスと互換性のあるモバイルアプリを構築する際には、以下のキーボード入力を処理する方法を検討してください。
- Enterキー
- 矢印キーナビゲーション
- タブキーナビゲーション
- Ctrlベースのショートカットキー(Ctrl-Cでコピー、Ctrl-Vで貼り付けなど)
- 選択項目のハイライトカラーの変更
- 右クリックでのコンテキストメニューの表示
- W、A、S、Dキーによるゲーム内の移動
- スペースバーによるゲームでのジャンプ
例: プレーヤーがCtrl-Jキーを押すと、ゲーム内で特別な移動ができるようにします。
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
switch (keyCode) {
...
case KeyEvent.KEYCODE_J:
if (event.isCtrlPressed()) {
superJumpCombo();
}
...
default:
return super.onKeyUp(keyCode, event);
}
}
override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
return when (keyCode) {
...
KeyEvent.KEYCODE_J -> {
if (event.isCtrlPressed) {
superJumpCombo()
}
true
}
...
else -> super.onKeyUp(keyCode, event)
}
}
入力設計に関するその他の留意事項については、Androidデベロッパーガイドの入力サポートを参照してください。キーボード入力処理方法の詳細については、次のAndroidデベロッパーガイドを参照してください。
マウス入力
デフォルトでは、Android用Windowsサブシステムはマウスの左クリックを仮想タッチイベントに変換し、マウスホイールのスクロールをスワイプイベントに変換します。これは、マウス入力を処理しないタッチスクリーン向けに構築されたほとんどのアプリの互換性を確保するためです。ほかのマウス操作については、コードを更新して特定の入力を処理します。次のアクションに対処することを検討してください。
- 右クリック
- ドラッグアンドドロップ
- ツールチップとホバーテキスト
- ホバー効果
次のAndroidデベロッパーガイドに従って、マウス入力の処理を学びましょう。
グラフィック
Windowsコンピューターでアプリを実行しているユーザーに最適なエクスペリエンスを提供するには、大きい画面をサポートし、高度なグラフィックを使用します。次の推奨事項に基づいて、Windowsでのアプリのユーザーエクスペリエンスを改善してください。
OpenGL ESのバージョン: Android用Windowsサブシステムは、OpenGL ES 1.1、2.0、3.0をサポートしています。OpenGL ES 3.1以降は現在サポートされていません。
最大フレームレート: 通常、Windowsコンピューターでは、モバイルデバイスよりも高いフレームレートでアプリを実行できます。Windowsで最適なエクスペリエンスを提供するために、最大フレームレートを60fps以上に設定するか、最大フレームレートの制限を取り除いてください。
UIスケーリング: すべてのUI要素が、大きい画面に合わせて適切なサイズに設定されていることを確認します。HUDは画面の20%未満にすることをお勧めします。
縦横比: サイズの大きいデバイスでのエクスペリエンスを最適化するために、16:9、16:10、3:2など、複数の縦横比をサポートしてください。
ウィンドウ管理: Android用Windowsサブシステムでは、アプリは常にマルチウィンドウモードで開き、ユーザーがサイズを変更できます。
- アプリが
android:screenOrientation
で縦向きモードに設定されているか、ウィンドウサイズと一致しない縦横比の場合、Windowsではレターボックスまたはピラーボックスを使用してレンダリングされます。 - サイズ変更中にアプリが機能しない場合は、アプリのマニフェストの
activity
要素にandroid:resizeableActivity="false"
を追加します。これにより、アプリが互換性モードで実行され、レターボックスまたはピラーボックスを使用してレンダリングされます。 - ウィンドウ管理の詳細については、次のセクションを参照してください。
ウィンドウ管理とサイズ変更
モバイルデバイスとは異なり、Windowsコンピューターで実行されるAndroidアプリはサイズを自由に変更できます。ユーザーは、Windowsの操作で、アプリのウィンドウを画面の端や隅にスナップすることもできます。これらの機能により、Windowsではアプリのユーザーエクスペリエンスが異なる可能性があります。次の点に留意してください。
レターボックスとピラーボックス
コンテンツの縦横比がそれを含むディスプレイに揃っていないと、レターボックスまたはピラーボックスが表示されることがあります。レターボックスでは、元のコンテンツの幅が、それを表示するディスプレイよりも広くなるため、コンテンツの縦横比を維持しながら全幅を表示するために、コンテンツの上下にバーが追加されます。

ピラーボックスでは、元のコンテンツの幅が、それを表示するディスプレイよりも狭くなるため、縦横比を維持するために、左右にバーが追加されます。

追加されるバーは、システム設定に応じて明るい色または暗い色になります。★レターボックスとピラーボックスは、アプリがスナップ、最大化、または手動でサイズ変更されると表示されます。
マルチウィンドウモード
Android用Windowsサブシステムで実行されると、アプリはマルチウィンドウモードで開きます。そのため、アプリが最小化されたとき、デバイス画面がロックされたとき、またはコンピューターがスリープ状態から復帰したときに問題が発生する可能性があります。
問題を回避するには、適切なウィンドウメカニズムを使用することが重要です。ウィンドウメカニズムをサポートする方法の詳細については、Androidデベロッパーガイドのマルチウィンドウのサポートを参照してください。また、マルチウィンドウモードに関連するアクティビティのライフサイクルを処理して、アプリの状態の保存および読み込みが正しく行われるようにする必要があります。詳細については、Androidデベロッパーガイドのマルチウィンドウモードでのアクティビティのライフサイクルを参照してください。
サイズ変更に関するその他の留意事項
モバイルアプリをWindowsデバイスのウィンドウ管理機能とサイズ変更機能に対応させるには、次のことに留意してください。
- 初回起動時のサイズ:アプリが起動したときのディスプレイのサイズと向きを設定します。
- ウィンドウの寸法
- コンテンツの範囲:コンテンツの切り捨てやアクセスできないコンテンツを避けます。
- 自由なサイズ設定:ウィンドウのサイズ変更をサポートします。
- 画面の向き:縦向きモードと横向きモードのサポートを検討してください。
各トピックの詳細については、Androidデベロッパーガイドのウィンドウ管理を参照してください。
カメラ機能
アプリがカメラを使用し、Windowsデバイスをターゲットにしている場合は、次のガイドラインに従ってください。
- デバイスのカメラを使用する前に、Androidの
CameraManager
APIを使用して利用可能なカメラデバイスを確認してください。モバイルデバイスとは異なり、Windowsデバイスでは、単一または複数のカメラが搭載されている場合、カメラがない場合、外部カメラを使用する場合があります。Amazonアプリストアでは、考えられるケースそれぞれに対応することを推奨しています。 - Windowsデバイスのカメラでサポートされているプレビューサイズを確認し、写真の撮影やプレビューの表示に使用します。
- ノートパソコンなどの横向きデバイスでアプリの向きをテストし、それに応じて回転を調整します。
- 「お使いのハードウェアはこのアプリに対応していません」というエラーが表示された場合は、Assets/Plugins/Android/lib/armeabiフォルダにレガシーネイティブライブラリが存在している可能性があります。ネイティブライブラリを構築すると、x86、armeabi、armeabi-v7aなどの出力がデフォルトで作成されます。Unity 5.xではarmeabiのサポートが廃止されました。このエラーを回避するために、Unity 5.x以降ではarmeabiを使用しないでください。
アプリでカメラをサポートする方法の詳細については、AndroidデベロッパードキュメントのCamera orientations(英語のみ)を参照してください。
x86 ABIアーキテクチャのサポート
ほとんどのWindowsデバイスは、x86ベースのIntelまたはAMDプロセッサを使用しています。Android用Windowsサブシステムでは、Intel Bridge Technologyを使用して、x86ベースのプロセッサでArm®アプリをエミュレートします。エミュレーションレイヤーはパフォーマンスのオーバーヘッドを招くため、パフォーマンスを最適化するには、x86-64とArm64の両方のアーキテクチャでアプリを申請してください。x86 ABIアーキテクチャのサポート方法の詳細については、Androidデベロッパーガイドのx86 ABIアーキテクチャを含めるを参照してください。

サポートされていない機能の処理
トピック: サポートされていない共通機能 | サポートが制限されている共通機能 | サポートされていない広告SDKの無効化 | サポートされていないGoogle Playサービスの処理 | サポートされていない機能の条件付き無効化 | サポートされていない機能の表
モバイルデバイスで利用できる機能やサービスには、Android用Windowsサブシステムでは利用できないものや、サポートが限られているものがあります。アプリがWindowsで実行されている場合、サポートされていない機能やサービスを使用するためのリクエストは失敗します。このセクションでは、アプリでサポートされていない機能を処理する方法について説明します。
機能やAPIがサポート対象外かどうかは、以下のサポートされていない機能の表で確認してください。
Wi-Fi管理、輝度、サウンドコントロールなどのシステム機能は、Android用Windowsサブシステムでは現在サポートされていません。アプリにこれらの機能のいずれかがあり、Windowsでテストした場合、その機能の制御やアクセス時に問題が発生する可能性があります。機能がサポート対象外かどうかを確認するには、サポートされていない機能を参照してください。
Android用Windowsサブシステムのアプリでは、Windowsのシステム設定を変更することはできません。アプリがデバイスのWi-Fiまたはサウンドを切り替えようとすると、失敗します。
このようなシステム依存関係がアプリのプライマリ機能である場合、Amazonアプリストアでは、これらの機能がサポートされるのを待ってからWindowsデバイスをターゲットにすることを推奨しています。これらがアプリのセカンダリ機能である場合は、例外が適切に処理されることを確認してからWindowsデバイスをターゲットにします。
サポートされていない機能を処理する場合は、次の推奨事項に従ってください。
- Android用Windowsサブシステムでサポートされていないすべての機能については、アプリのマニフェストの
<uses-feature>
宣言にandroid: required="false"
を追加します。これは、アプリのマニフェストで既に宣言されている機能にのみ適用されます。たとえば、NFCを無効にするには、コードは次のようになります。<uses-feature android:name="android.hardware.nfc" android:required="false"/>
- Android用Windowsサブシステムでサポートされていないハードウェア機能とソフトウェア機能に依存するアプリの機能を無効にします。モバイルアプリに同じAPKを使用している場合は、条件付きロジックを使用して、Android用Windowsサブシステムでサポートされていない機能を無効にします。詳細については、サポートされていない機能の条件付き無効化を参照してください。
サポートされていない共通機能
以下の機能は、Android用Windowsサブシステムでは現在サポートされていません。
カスタムWi-Fiホットスポット: アプリがLANベースのゲームのホストやファイル転送を行うカスタムホットスポットを作成した場合、Android用WindowsサブシステムではWi-Fiホットスポットがサポートされていないため、機能が想定どおりに動作しないことがあります。ただし、アプリを実行するデバイスが同じネットワーク上にある場合は、アプリがホストを作成できる必要があります。
接続されたオーディオデバイス: 接続されたオーディオデバイス(イヤホンやヘッドホンなど)は、Android用Windowsサブシステムのアプリでは検出できません。アプリにイヤホンが必要で、必須の検証にisAudioConnected
メソッドを使用する場合は、Android用Windowsサブシステムのアプリに対するこの必須の検証をスキップするか無視します。
システムサウンド設定: システムサウンド設定(音量など)のアプリ内からの制御は、Android用Windowsサブシステムでは現在サポートされていません。アプリのサウンド設定を最適化するには、Androidデベロッパーガイドの固定音量デバイスへの対応を参照してください。
ピクチャーインピクチャー: ピクチャーインピクチャー(PiP)モードは、Android用Windowsサブシステムではサポートされていません。
サポートが制限されている共通機能
以下の機能は、Android用Windowsサブシステムでは現在サポートが制限されています。
Wi-Fi: Android用Windowsサブシステムは仮想Wi-Fiインターフェイスを使用するため、Wi-Fi信号を直接確認できません。Wi-Fi信号をスキャンするアプリには、利用可能なWi-Fiネットワークは表示されません。Wi-FiホットスポットやWi-Fiダイレクトなど、そのほかのWi-Fi機能は、Android用Windowsサブシステムでは現在サポートされていません。アプリがWi-FiスキャンなどのWi-Fi管理機能に依存している場合、これらの機能が失敗するため、Windowsデバイスをターゲットにしないでください。
ローカルネットワーク接続: アプリが同じネットワーク上でアプリを実行しているほかのデバイスに接続できる場合、この機能はサポートされますが、Android用Windowsサブシステムでネットワークの詳細設定を有効にする必要があります。
ビデオDRM: Widevine L3 DRMとClearkey DRMがサポートされています。Widevine L1、L2、およびその他のビデオDRM形式(PlayReadyなど)は、Android用Windowsサブシステムではサポートされていません。
オーディオ録音: Android用Windowsサブシステムではマイク録音がサポートされています。ただし、システムオーディオの録音は現在サポートされていません。
サポートされていない広告SDKの無効化
アプリが広告SDKを使用する場合、Windowsでアプリをテストすることが重要です。Windowsでのアプリのテスト手順は、Microsoftのテストとデバッグガイドに従ってください。
一部の広告SDKは、Android用Windowsサブシステムと互換性がありません。広告SDKに互換性がない場合、広告の付与や配信ができず、アプリに問題が発生する可能性があります。広告SDKが原因で予期しない動作が発生した場合は、次のガイドラインに従って広告SDKを無効にします。
-
バナー、インタースティシャル、広告リワード(広告視聴に対するリワードをユーザーに付与)を含む、すべてのモバイル広告ユニットを無効にします。次の例は、広告の利用可否に基づいてレイアウトを条件付きで設定する方法の1つを示しています。
boolean adsDisabled = "Subsystem for Android(TM)".equals(Build.MODEL); if (adsDisabled) { setContentView(R.layout.layoutNoAds); } else { setContentView(R.layout.layoutWithAds); }
val adsDisabled = "Subsystem for Android(TM)" == Build.MODEL if (adsDisabled) { setContentView(R.layout.layoutNoAds) } else { setContentView(R.layout.layoutWithAds) }
- 広告リワードに依存するアプリの機能を無効にします。たとえば、リワード広告の視聴にボタンのクリックが必要な場合は、そのボタンを無効にするか削除してください。
- モバイルアプリに同じAPKを使用している場合は、条件付きロジックを使用して、Android用Windowsサブシステムにのみ変更を加えます。
サポートされていないGoogle Playサービスの処理
WindowsでアプリをテストするとGoogle Playサービスにリダイレクトされることがありますが、これは、デバイスの製造元IDから製造元がAmazon以外であることが確認されるとGoogle Playサービスにリダイレクトされるためである可能性があります。Windowsの製造元はAmazonではなくMicrosoftであるため、このリダイレクトはアプリがWindowsデバイスで実行されるときに発生します。この問題を解決するには、デバイスの検出に製造元IDを使用せず、代わりに特定のサービスを確認します。次のガイドラインに従ってください。
クラウドメッセージング: アプリにFirebase Cloud Messaging(FCM)とAmazon Device Messaging(ADM)の両方を実装している場合は、ロジックを使用して、ADMが利用できるかどうかを確認し、利用できるときにはADMを利用します。詳細については、ADMドキュメントのADMを使用できない場合の適切な機能制限を参照してください。
アプリ内課金: アプリにGoogleアプリ内課金(IAB)とAmazonアプリ内課金(IAP)の両方を実装している場合は、ロジックを使用して、Amazon IAPが利用できるかどうかを確認し、利用できるときにはAmazon IAPを利用します。詳細については、Google Play請求サービスとIAPを仲介するロジックの実装方法を参照してください。
マップ: Amazonデバイスでは、アプリがGoogleマップAPIを使用している場合、Amazonアプリストアを使用してAmazon Mapsにリダイレクトできます。ただし、Android用WindowsサブシステムではAmazon Mapsを利用できません。Windowsの場合は、機能が適切に制限されるようにアプリを更新してください。
サポートされていない機能の条件付き無効化
サポートされていない機能を条件付きで無効にする場合は、デバイス検出を使用するのではなく、機能を使用できるかどうかを確認します。これにより、アプリに複数のデバイスタイプをサポートさせながら、共通のコードベースを維持することができます。
ハードウェアまたはソフトウェアの機能を確認するには、Android PackageManager APIのhasSystemFeature()
メソッドを使用します。次の例は、デバイスで加速度計が使用可能かどうかを検出する方法を示しています。
PackageManager packageManager = context.getPackageManager();
boolean hasAccelerometer = packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER);
if (hasAccelerometer) {
// このデバイスでは加速度計を使用できます。
} else {
// 加速度計は使用*できません*。機能を無効にします。
}
val packageManager: PackageManager = context.packageManager
val hasAccelerometer: Boolean = packageManager.hasSystemFeature(PackageManager.FEATURE_SENSOR_ACCELEROMETER)
if (hasAccelerometer) {
// このデバイスでは加速度計を使用できます。
} else {
// 加速度計は使用*できません*。機能を無効にします。
}
可能であれば、前の例を使用して特定の機能を検出します。特定の機能を確認できない場合は、次のコードを使用します。
if ("Subsystem for Android(TM)".equals(Build.MODEL)) {
// Android用Windowsサブシステムで実行中のアプリ
} else {
// Android用Windowsサブシステムで実行して*いない*アプリ
}
if ("Subsystem for Android(TM)" == Build.MODEL) {
// Android用Windowsサブシステムで実行中のアプリ
} else {
// Android用Windowsサブシステムで実行して*いない*アプリ
}
サポートされていない機能の表
これらは、Android用Windowsサブシステムで現在サポートされていない機能の一覧表です。
ソフトウェア機能 | アプリ機能の説明 |
---|---|
android.software.app_widgets |
ホーム画面のアプリウィジェットを使用 WSAではこの機能が使用可能と表示されますが、現在は常にオフになっています |
android.software.device_admin |
デバイスポリシー管理機能を使用 |
android.software.home_screen |
デバイスのホーム画面の代替機能として動作 |
android.software.input_methods |
InputMethodService で定義されたカスタム入力メソッドを使用 |
android.software.leanback |
テレビ画面UIを使用 |
android.software.live_tv |
ライブTVをストリーミング |
android.software.live_wallpaper |
アニメーションを含む壁紙を使用 |
android.software.managed_users |
セカンダリユーザーと管理対象プロファイルをサポート |
android.software.midi |
MIDIデバスに接続 |
android.software.sip |
ビデオ会議やインスタントメッセージングをサポートするセッション開始プロトコル(SIP)を使用 |
android.software.sip.voip |
双方向ビデオ会議をサポートするVoice over Internet Protocol(VoIP)を使用 |
ピクチャーインピクチャー | 小さな視聴ウィンドウ(通常はビデオを再生)を画面にオーバーレイ表示 |
ウェブアプリ | ウェブベースのアプリ |
API | 代替 |
---|---|
Google Playアプリ内課金 | Amazonアプリ内課金(IAP)APIを使用します。 移行ガイドを参照してください。 |
Google Cloud Messaging | Amazon Device Messagingを使用します。 移行ガイドを参照してください。 |
Googleマップ | なし。Android用Windowsサブシステムではサポートされていません。 |
Firebase API | Firebaseに代わるプロダクトの選択を参照してください。 |