アップロードする APK は、Google Play の 対象 API レベル の要件を満たしている必要があります。
2025 年 8 月 31 日以降:
- 新しいアプリとアプリ アップデートを Google Play に送信する場合は、Android 15(API レベル 35)以降を対象にする必要があります。ただし、Wear OS、Android Automotive OS、Android TV アプリは Android 14(API レベル 34)以降を対象にする必要があります。
- 既存のアプリは、アプリの対象 API レベルよりも高い Android OS を搭載したデバイスの新規ユーザーが引き続き利用できるようにするため、Android 14(API レベル 34)以降を対象にする必要があります。Android 13(API レベル 33)以前(Wear OS と Android TV の場合は Android 12(API レベル 31)以前)を対象とするアプリは、アプリの対象 API レベル以下の Android OS を搭載したデバイスでのみ利用可能となります。
アプリの更新にさらに時間が必要な場合は、2025 年 11 月 1 日までの期間延長をリクエストできます。アプリの期間延長フォームには、年内に Google Play Console でアクセスできるようになります。
ただし、これらの要件について、以下のアプリは例外となります。
- 永続的な限定公開アプリ(特定の組織のユーザーのみに公開される内部配布専用のもの)。
新しい 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 に関するドキュメントをご覧ください。
-
-
非明示的ブロードキャスト
-
非明示的ブロードキャストは制限されます。バックグラウンド イベントの処理については、
JobSchedulerAPI に関するドキュメントをご覧ください。
-
非明示的ブロードキャストは制限されます。バックグラウンド イベントの処理については、
-
バックグラウンド位置情報の制限
-
バックグラウンドで実行されるアプリは、位置情報へのアクセスが制限されます。
- 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権限が必要となります。 -
一部の電話、Bluetooth、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.getLocationInWindow()ではなくView.getLocationOnScreen()を使用して位置を確認してください。 *MotionEventを処理する場合は、MotionEvent.getRawX()、MotionEvent.getRawY()ではなく、MotionEvent.getX()、MotionEvent.getY()を使用してください。
SDK とライブラリを確認、更新する
サードパーティ SDK の依存関係が API 31 に対応していることを確認します。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 モードにします。
撮影中の新しい写真 / 動画を処理できるかどうか。
- アプリが正しく制限付きの を処理(JobScheduler ジョブに移行)するかどうかを確認します。
ACTION_NEW_PICTUREACTION_NEW_VIDEO - これらのイベントに依存する重要なユースケースも引き続き機能することを確認します。
- アプリが正しく制限付きの を処理(JobScheduler ジョブに移行)するかどうかを確認します。
他のアプリとのファイルの共有を処理できるかどうか - ファイルデータを他のアプリと共有するユースケースをテストします(同じデベロッパーの別アプリでもテストします)。
- 他のアプリ内でコンテンツを表示できるか、表示したときにクラッシュが発生しないかテストします。
追加情報
Google Play Console でメール配信をオプトインして、Android と Google Play に関する重要なアップデートとお知らせ(月刊のパートナー ニュースレターなど)を Google から受け取れるようにしてください。