アップロードする APK は、Google Play の対象 API レベルの要件を満たしている必要があります。
2024 年 8 月 31 日以降:
- 新規のアプリとアプリ アップデートを Google Play に送信するには、Android 14(API レベル 34)以降を対象にする必要があります。ただし、Wear OS アプリと Android TV アプリは Android 13(API レベル 33)以降を対象にする必要があります。
- 既存のアプリについては、アプリの対象 API レベルよりも新しい Android OS を搭載したデバイスでも新規ユーザーがアクセスし続けられるようにするには、Android 13(API レベル 33)以降を対象とする必要があります。Android 12(API レベル 31)以前(Wear OS の場合は Android 10(API レベル 29)以前、Android TV の場合は Android 11(API レベル 30)以前)をターゲットとするアプリは、アプリの対象 API レベルと同じかそれ以前の Android OS を搭載したデバイスでのみ利用できます。
アプリの更新にさらに時間が必要な場合は、2024 年 11 月 1 日までの期限延長をリクエストできます。年内には、Google Play Console でアプリの期間延長フォームにアクセスできるようになります。
ただし、これらの要件について、以下のアプリは例外となります。
- 特定の組織のユーザーに限定され、内部配布のみを目的とする永続的な限定公開アプリ。
- Android Automotive OS をターゲットとするアプリ、または Android Automotive OS をターゲットとする APK とともにパッケージ化されるアプリ。
新しい SDK をターゲットにする理由
Android のバージョンが上がるごとに、セキュリティとパフォーマンスを向上させ、Android のユーザー エクスペリエンスを向上させる変更が行われています。これらの変更の一部は、targetSdkVersion
マニフェスト属性(対象 API レベルとも呼ばれます)を通じて明示的にサポートを宣言しているアプリにのみ適用されます。
最新の API レベルを対象にするようアプリを設定することで、ユーザーにこうした改善のメリットを享受しながら、古いバージョンの Android でもアプリを実行できます。また、最新の API レベルをアプリの対象にすることで、プラットフォームの最新機能を活用して、ユーザーの満足度を高めることが可能になります。さらに、Android 10(API レベル 29)以降では、アプリが Android 5.1(API レベル 22)以下をターゲットとしている場合、ユーザーが初めてアプリを起動したときに警告が表示されます。
このドキュメントでは、Google Play の要件を満たすために対象 API レベルを更新する際に知っておくべき重要なポイントについて説明します。移行先のバージョンに応じて、次のセクションの手順をご覧ください。
Android 12 以降(API レベル 31)から新しいバージョンに移行する
最新バージョンの Android を対象とするようにアプリを更新するには、関連する動作変更のリストに沿って対応してください。
Android 11(API レベル 30)から Android 12(API レベル 31)に移行する
セキュリティと権限
- Bluetooth:
BLUETOOTH
権限とBLUETOOTH_ADMIN
権限の宣言を、BLUETOOTH_SCAN
、BLUETOOTH_ADVERTISE
、またはBLUETOOTH_CONNECT
権限に置き換える必要があります。Bluetooth オペレーションでLOCATION
の実行時の権限リクエストを行う必要がなくなりました。 - 位置情報: ユーザーは、おおよその位置情報のみを取得するようアプリにリクエストできます。
ACCESS_FINE_LOCATION
をリクエストするたびに、ACCESS_COARSE_LOCATION
権限をリクエストする必要があります。- インテント フィルタ: インテント フィルタを使用するアクティビティ、サービス、ブロードキャスト レシーバがアプリに含まれている場合は、これらのコンポーネントに対して android:exported 属性を明示的に宣言する必要があります。
- 休止状態: 一定期間使用されていないアプリは、休止状態になる可能性があります。休止状態モードでは、アプリの実行時の権限とキャッシュがリセットされ、ジョブやアラートを実行できなくなります。アプリの休止状態を確認できます。
- ペンディング インテントの可変性: アプリが作成する各 PendingIntent オブジェクトの可変性を指定する必要があります。
ユーザー エクスペリエンス
- カスタム通知: カスタム コンテンツ ビューを含む通知では、通知領域全体が使用されなくなり、代わりに標準テンプレートが適用されます。このテンプレートを使用すると、カスタム通知に、すべての状態で他の通知と同じ装飾が確実に付加されます。この動作は、
Notification.DecoratedCustomViewStyle
の動作とほぼ同じです。 - Android アプリリンクの検証に関する変更: Android アプリリンクの検証を使用する場合は、インテント フィルタに BROWSABLE カテゴリが含まれ、HTTPS スキームをサポートしていることを確認してください。
パフォーマンス
フォアグラウンド サービスの起動に関する制限: Android 12 以降をターゲットとする場合、いくつかの特殊なケースを除いて、バックグラウンドで実行中のアプリはフォアグラウンド サービスを起動できません。アプリがバックグラウンドで実行されているときにフォアグラウンド サービスを開始しようとすると、例外が発生します(少数の特殊なケースを除く)。
WorkManager を使用して、アプリがバックグラウンドで実行されている間に優先処理をスケジュールして開始することを検討してください。ユーザーがリクエストした時間的制約のあるアクションを実行するには、正確なアラーム内でフォアグラウンド サービスを開始します。
通知トランポリンの制限: 一部のアプリは、ユーザーが通知をタップすると、ユーザーが表示して操作するアクティビティを開始するアプリ コンポーネントが起動します。このアプリ コンポーネントは、通知トランポリンと呼ばれます。
アプリは、通知トランポリンとして使用されるサービスまたはブロードキャスト レシーバからアクティビティを開始してはなりません。ユーザーが通知内の通知または操作ボタンをタップした後、アプリはサービスまたはブロードキャスト レシーバ内で
startActivity()
を呼び出すことはできません。
Android 12(API レベル 31)をターゲットとするアプリに影響する変更の完全なセットを確認してください。
Android 11(API レベル 30)未満から移行する
移行元の Android バージョンを以下から選択してください。
Android 5(API レベル 21)に移行する
以下に示す各リリースの「動作の変更点」ページをそれぞれ参照して、各リリースで導入された変更点に対応するようにアプリを設定してください。
次のセクションの手順に沿って、設定を続行します。
Android 6(API レベル 23)に移行する
Android 6.0 以上のプラットフォーム バージョンをアプリが対象とする場合、以下の項目について検討します。
-
-
危険な権限が付与されるのは、ランタイムに限られます。UI フロー内で、このような権限の付与に関する情報を提供する必要があります。
-
可能な限り、権限リクエストを拒否された場合にアプリが対応できるように準備しておく必要があります。たとえば、デバイスの GPS にアクセスするリクエストをユーザーが拒否した場合、アプリが別の方法で処理を進められるようにします。
-
Android 6.0(API レベル 23)で導入された変更点の一覧については、対象プラットフォーム バージョンの動作の変更点に関するページをご覧ください。
次のセクションの手順に沿って、設定を続行します。
Android 7(API レベル 24)に移行する
Android 7.0 以上のプラットフォーム バージョンをアプリが対象とする場合、以下の項目について検討します。
-
Doze とアプリ スタンバイ
Doze とアプリ スタンバイ用に最適化するで説明されている動作に合わせて設計する必要があります。これにより、複数のプラットフォーム リリースで順次導入された変更に対応できます。
デバイスが Doze モードまたはアプリ スタンバイ モードに入ると、システムは次のように動作します。
- ネットワーク アクセスを制限する。
- アラーム、同期、ジョブを延期する。
- GPS と Wi-Fi スキャンを制限する。
- 優先度が標準の Firebase Cloud Messaging メッセージを制限する。
-
権限の変更
- アプリのプライベート ディレクトリへのアクセスは制限されます。
-
アプリの外部に
file://
URI が公開されると、FileUriExposedException
がトリガーされます。アプリの外部でファイルを共有する必要がある場合は、FileProvider
を実装してください。
-
非 NDK ライブラリへのリンクは禁止されます。
Android 7.0(API レベル 24)で導入された変更点の一覧については、対象プラットフォーム バージョンの動作の変更点に関するページをご覧ください。
次のセクションの手順に沿って、設定を続行します。
Android 8(API レベル 26)に移行する
Android 8.0 以上のプラットフォーム バージョンをアプリが対象とする場合、以下の項目について検討します。
-
バックグラウンドでの実行の制限
-
フォアグラウンドで実行されていないアプリのサービスは制限されます。
-
startService()
が禁止されている間、アプリでstartService()
を呼び出そうとすると例外がスローされるようになりました。 -
フォアグラウンド サービスを開始するには、アプリで
startForeground()
とstartForegroundService()
を使用する必要があります。 - Android 8.0(API レベル 26)の動作の変更点に関するページで、JobScheduler API の変更内容を十分に確認してください。
- Firebase Cloud Messaging には、バージョン 10.2.1 以上の Google Play 開発者サービス SDK が必要です。
- Firebase Cloud Messaging を使用する場合、メッセージ配信はバックグラウンド実行制限の対象となります。データのバックグラウンド同期など、メッセージの受信時にバックグラウンド処理が必要な場合、アプリは代わりに Firebase Job Dispatcher または JobIntentService を使用してジョブのスケジュールを設定する必要があります。詳しくは、Firebase Cloud Messaging に関するドキュメントをご覧ください。
-
-
非明示的ブロードキャスト
-
非明示的ブロードキャストは制限されます。バックグラウンド イベントの処理については、
JobScheduler
API に関するドキュメントをご覧ください。
-
非明示的ブロードキャストは制限されます。バックグラウンド イベントの処理については、
-
バックグラウンドでの位置情報の制限
-
バックグラウンドで実行されているアプリは、位置情報へのアクセスが制限されます。
- Google Play 開発者サービスを搭載したデバイスの場合、融合された位置予測プロバイダを使用して、最新の位置情報を定期的に取得します。
-
バックグラウンドで実行されているアプリは、位置情報へのアクセスが制限されます。
-
フォアグラウンドで実行されていないアプリのサービスは制限されます。
-
通知チャネル
- チャネルごとに通知割り込みプロパティを定義する必要があります。
- 通知を表示するには、チャネルに通知を割り当てる必要があります。
-
このバージョンのプラットフォームは
NotificationCompat.Builder
をサポートしています。
-
プライバシー
- ANDROID_ID は、各アプリ署名鍵を対象範囲とします。
Android 8.0(API レベル 26)で導入された変更点の一覧については、対象プラットフォーム バージョンの動作の変更点に関するページをご覧ください。
Android 8(API 26)から Android 9(API 28)に移行する
-
電源管理
- アプリ スタンバイ バケットにより、延期されたジョブ、アラーム、優先度の高いメッセージでの割り当てなどのアプリ エンゲージメントに応じて新たなバックグラウンドの制限が課されます。
- バッテリー セーバーの改善によって、アプリ スタンバイ アプリへの制限が増えます。
-
フォアグラウンド サービスの権限
- 通常の権限
FOREGROUND_SERVICE
(ランタイム以外の権限)をリクエストする必要があります。
- 通常の権限
-
プライバシーに関する変更点
- バックグラウンド センサーへのアクセス制限
- 通話履歴へのアクセス制限(
CALL_LOG
権限グループ内にあります) - 電話番号へのアクセス制限(
READ_CALL_LOG
権限が必要です) - Wi-Fi 情報へのアクセス制限
Android 9.0(API レベル 28)で導入された変更の一覧については、動作の変更点をご覧ください。
Android 9(API レベル 28)から Android 10(API レベル 29)に移行する
-
全画面インテントを使用する通知
-
通常の権限
USE_FULL_SCREEN_INTENT
をリクエストする必要があります(実行時の権限ではありません)。
-
通常の権限
-
折りたたみ式デバイスと大画面デバイスのサポート
-
複数のアクティビティを同時に「再開」状態にできるようになりましたが、実際にフォーカスされるのは 1 つのみです。
-
この変更は、
onResume()
とonPause()
の動作に影響します。 -
新しいライフサイクルの「一番再開された」コンセプトは、
onTopResumedActivityChanged()
に登録することで検出できます。- 「一番に再開」できるアクティビティは 1 つのみです。
-
この変更は、
-
resizeableActivity
がfalse
に設定されている場合、アプリはminAspectRatio
を追加で指定できます。これにより、より狭いアスペクト比でアプリが自動的にレターボックス表示されます。
-
複数のアクティビティを同時に「再開」状態にできるようになりましたが、実際にフォーカスされるのは 1 つのみです。
-
プライバシーに関する変更点
-
対象範囲別ストレージ
- 外部ストレージへのアクセスは、アプリ固有のディレクトリと、アプリが作成した特定のタイプのメディアのみに制限されます。
-
アプリがバックグラウンドで実行されているときの位置情報へのアクセスが制限され、
ACCESS_BACKGROUND_LOCATION
権限が必要です。 - IMEI やシリアル番号などの再設定不可能な ID へのアクセスの制限。
-
ユーザーの歩数など、身体活動情報へのアクセスが制限され、
ACTIVITY_RECOGNITION
権限が必要です。 -
一部のテレフォニー API、Bluetooth API、Wi-Fi API へのアクセスが制限され、
ACCESS_FINE_LOCATION
権限が必要です。 -
Wi-Fi 設定へのアクセスの制限
- アプリは Wi-Fi を直接有効または無効にすることができなくなったため、設定パネルを使用する必要があります。
-
Wi-Fi ネットワークへの接続の開始が制限され、
WifiNetworkSpecifier
またはWifiNetworkSuggestion
の使用が必要となります。
-
対象範囲別ストレージ
Android 10(API レベル 29)から Android 11(API レベル 30)に移行する
-
プライバシー
- 対象範囲別ストレージの適用 : アプリには対象範囲別ストレージ モデルを採用する必要があります。このモデルでは、アプリ固有のファイルやメディアなどのファイル形式の保存とアクセスに専用の場所を使用します。
- 権限のオートリセット: ユーザーが数か月にわたりアプリを操作していない場合、システムがアプリの機密情報に関わる権限を自動リセットします。この自動リセットは、ほとんどのアプリには影響を及ぼしません。アプリが主にバックグラウンドで動作し、ユーザーの操作が行われない場合は、ユーザーに自動リセットを無効にするようリクエストすることを検討してください。
- バックグラウンドでの位置情報へのアクセス: アプリは、フォアグラウンドとバックグラウンドでの位置情報の利用許可を個別にリクエストする必要があります。 バックグラウンドでの位置情報の利用許可へのアクセスは、アプリの設定でのみ行うことができます。実行時の権限ダイアログでは行えません。
- パッケージの公開設定: デバイスにインストールされているアプリとサービスのリストをアプリがクエリすると、返されるリストはフィルタされます。
-
セキュリティ
- 圧縮された resource.arsc ファイルのサポート終了
- APK 署名スキーム v2 が必須になりました。 下位互換性を維持するため、引き続き APK 署名スキーム v1 を使用して署名する必要があります。
- 非 SDK インターフェースの制限API レベル 30 をターゲットとするアプリでは、非 SDK インターフェースの一部がブロックされるため、非 SDK インターフェースの使用はおすすめしません。ブロックされる非 SDK インターフェースの一覧については、Android 11 でブロックされるようになった非 SDK インターフェースをご覧ください。
Android 11(API レベル 30)で導入された変更の一覧については、動作の変更点のページをご覧ください。
次に、上記のセクションの手順に沿って API 31 への更新を行います。
アプリをモダナイズする
アプリの対象 API レベルを更新する際は、最新のプラットフォーム機能を採用してアプリをモダナイズし、ユーザー エクスペリエンスを高めるように検討してください。
- カメラを最大限に活用するために、ベータ版の CameraX の使用を検討してください。
- Jetpack コンポーネントを使用すると、おすすめの方法に沿って開発を進めながら、ボイラープレート コードを作成する手間を省き、複雑なタスクを簡素化できるので、コードの重要な部分に集中できます。
- Kotlin を使用すると、アプリの質を高め、コードと作成時間を削減できます。
- 以下のプライバシーに関する要件とおすすめの方法に沿っているかどうかを確認します。
- アプリにダークモードのサポートを追加します。
- アプリにジェスチャー ナビゲーションのサポートを追加します。
- Google Cloud Messaging(GCM)から最新バージョンの Firebase Cloud Messaging にアプリを移行します。
- 高度なウィンドウ管理機能を活用します。
- 最新のハードウェアの進歩を活用するために、大きなアスペクト比(16:9 以上)をサポートします。使用可能な画面スペースに合わせてアプリのサイズが変更されるようにします。最大アスペクト比は最後の手段としてのみ宣言します。最大アスペクト比について詳しくは、画面サポートの制限を宣言するをご覧ください。
- マルチウィンドウのサポートを追加して、アプリの生産性を高め、マルチディスプレイを管理できるようにします。
- アプリを最小化することでユーザー エクスペリエンスが向上する場合は、ピクチャー イン ピクチャーのサポートを追加します。
- ディスプレイ カットアウトに対応するデバイス向けに最適化します。
- ステータスバーの高さは想定しないでください。代わりに、
WindowInsets
とView.OnApplyWindowInsetsListener
を使用してください。詳細については、droidcon NYC 2017 の動画をご覧ください。 - アプリがウィンドウ全体に表示されると決めつけないでください。その場合は、
View.getLocationOnScreen()
ではなくView.getLocationInWindow()
を使用して位置情報を確認します。*MotionEvent
を処理する場合は、MotionEvent.getRawX()
、MotionEvent.getRawY()
ではなく、MotionEvent.getX()
とMotionEvent.getY()
を使用します。
SDK とライブラリを確認、更新する
サードパーティ SDK の依存関係が API 31 をサポートしていることを確認します。SDK プロバイダによっては、依存関係をマニフェストで公開しています。また、他の SDK プロバイダでは、追加の調査が必要です。API 31 をサポートしていない SDK を使用する場合は、優先して SDK プロバイダと協力して問題を解決してください。
また、アプリやゲームの targetSdkVersion
により、プライベート Android プラットフォーム ライブラリへのアクセスが制限される場合があります。詳しくは、プラットフォーム ライブラリにリンクする NDK アプリをご覧ください。
また、使用している Android サポート ライブラリのバージョンに制限があるかどうかも確認する必要があります。通常どおり、Android サポート ライブラリのメジャー バージョンとアプリの compileSdkVersion
の間に互換性を確保する必要があります。
サポート ライブラリのメジャー バージョン以下の targetSdkVersion
を選択することをおすすめします。最新の互換性機能とバグ修正を利用するために、互換性のある最新のサポート ライブラリに更新することをおすすめします。
アプリをテストする
アプリの API レベルと機能を必要に応じて更新したら、主要なユースケースをいくつかテストする必要があります。以下の推奨事項はすべてを網羅しているわけではありませんが、テストプロセスのガイドとしてお役立てください。次のようなテストをおすすめします。
- エラーや警告なしでアプリを API 29 にコンパイルできること。
ユーザーが権限リクエストを拒否した場合の対策をアプリに用意し、ユーザーに権限を求めるプロンプトを表示しているかどうか。手順は以下のとおりです。
- アプリの [アプリ情報] 画面に移動し、各権限を無効にします。
- アプリを開いて、クラッシュがないことを確認します。
- 主要なユースケースのテストを実行し、必要な権限が再度表示されることを確認します。
エラーなく想定どおりの結果で Doze を処理できるかどうか。
- adb を使用して、アプリの実行中にテストデバイスを Doze モードにします。
- Firebase Cloud Messaging メッセージをトリガーするユースケースをテストします。
- アラームやジョブを使用するユースケースをテストします。
- バックグラウンド サービスに対する依存関係を排除します。
- アプリをアプリ スタンバイに設定します。
- Firebase Cloud Messaging メッセージをトリガーするユースケースをテストします。
- アラームを使用するユースケースをテストします。
- adb を使用して、アプリの実行中にテストデバイスを Doze モードにします。
撮影された新しい写真や動画を処理する
- アプリが制限付きの
ACTION_NEW_PICTURE
およびACTION_NEW_VIDEO
ブロードキャストを正しく処理(つまり、JobScheduler ジョブに移動)することを確認します。 - これらのイベントに依存する重要なユースケースが引き続き機能することを確認します。
- アプリが制限付きの
他のアプリとのファイル共有の処理 - ファイルデータを他のアプリと共有するユースケースをテストします(同じデベロッパーの別のアプリも含めます)。
- コンテンツが他のアプリに表示され、クラッシュがトリガーされないことをテストします。
追加情報
Android と Google Play に関する重要な最新情報やお知らせ(月刊パートナー ニュースレターなど)を送信できるように、Google Play Console でメールを受け取るよう設定してください。