以前のリリースと同様に、Android 15 には、アプリに影響を与える可能性のある動作変更が含まれています。下記の動作変更は、Android 15 以上をターゲットとするアプリに限り適用されます。アプリが Android 15 以上をターゲットとする場合は、必要に応じてアプリを変更し、下記の動作に適切に対応できるようにしてください。
アプリの targetSdkVersion
に関係なく、Android 15 で実行されるすべてのアプリに影響する動作変更のリストも必ずご確認ください。
コア機能
Android 15 では、Android システムのさまざまなコア機能を変更または拡張しています。
フォアグラウンド サービスの変更
Android 15 では、フォアグラウンド サービスに次の変更を加えます。
- データ同期フォアグラウンド サービスのタイムアウト動作
- 新しいメディア処理フォアグラウンド サービスのタイプ
- フォアグラウンド サービスを起動する
BOOT_COMPLETED
ブロードキャスト レシーバに関する制限 - アプリが
SYSTEM_ALERT_WINDOW
権限を保持しているときにフォアグラウンド サービスを起動する場合の制限
データ同期フォアグラウンド サービスのタイムアウト動作
Android 15 では、Android 15(API レベル 35)以降をターゲットとするアプリに対して、dataSync
に新しいタイムアウト動作が導入されます。この動作は、新しい mediaProcessing
フォアグラウンド サービス タイプにも適用されます。
システムは、アプリの dataSync
サービスを 24 時間以内に合計 6 時間実行することを許可します。その後、システムは実行中のサービスの Service.onTimeout(int, int)
メソッド(Android 15 で導入)を呼び出します。この時点で、サービスは Service.stopSelf()
を呼び出すために数秒間待機します。Service.onTimeout()
が呼び出されると、サービスはフォアグラウンド サービスと見なされなくなります。サービスが Service.stopSelf()
を呼び出さない場合、システムは内部例外をスローします。例外が Logcat に次のメッセージとともに記録されます。
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type dataSync did not stop within its timeout: [component name]"
この動作変更の問題を回避するには、次のいずれかを行います。
- サービスに新しい
Service.onTimeout(int, int)
メソッドを実装します。アプリがコールバックを受信したら、数秒以内にstopSelf()
を呼び出します。(アプリをすぐに停止しないと、システムは障害を生成します)。 - アプリの
dataSync
サービスが 24 時間以内に合計 6 時間を超えて実行されないようにしてください(ユーザーがアプリを操作してタイマーをリセットする場合を除きます)。 dataSync
フォアグラウンド サービスは、直接のユーザー操作の結果としてのみ起動します。サービスの開始時にアプリはフォアグラウンドにあるため、サービスはバックグラウンドに移行してから 6 時間すべてかかります。dataSync
フォアグラウンド サービスではなく、代替 API を使用してください。
アプリの dataSync
フォアグラウンド サービスが過去 24 時間以内に 6 時間実行されている場合、ユーザーがアプリをフォアグラウンドに表示した(これによりタイマーがリセットされる)場合を除き、別の dataSync
フォアグラウンド サービスを開始することはできません。別の dataSync
フォアグラウンド サービスを開始しようとすると、システムは ForegroundServiceStartNotAllowedException
をスローし、「フォアグラウンド サービス タイプ dataSync の制限時間はすでに経過しています」などのエラー メッセージを出力します。
テスト
アプリの動作をテストするには、アプリが Android 15 をターゲットとしていない場合でも、データ同期のタイムアウトを有効にできます(アプリが Android 15 デバイスで実行されている場合)。タイムアウトを有効にするには、次の adb
コマンドを実行します。
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
タイムアウト期間を調整して、上限に達したときアプリの動作を簡単にテストすることもできます。新しいタイムアウト期間を設定するには、次の adb
コマンドを実行します。
adb shell device_config put activity_manager data_sync_fgs_timeout_duration duration-in-milliseconds
新しいメディア処理フォアグラウンド サービス タイプ
Android 15 では、新しいフォアグラウンド サービス タイプ mediaProcessing
が導入されています。このサービスタイプは、メディア ファイルのコード変換などのオペレーションに適しています。たとえば、メディアアプリが音声ファイルをダウンロードし、再生する前に別の形式に変換する必要がある場合があります。mediaProcessing
フォアグラウンド サービスを使用すると、アプリがバックグラウンドにあっても変換を続行できます。
システムは、アプリの mediaProcessing
サービスを 24 時間以内に合計 6 時間実行することを許可します。その後、システムは実行中のサービスの Service.onTimeout(int, int)
メソッド(Android 15 で導入)を呼び出します。この時点で、サービスは Service.stopSelf()
を呼び出すために数秒間待機します。サービスが Service.stopSelf()
を呼び出さない場合、システムは内部例外をスローします。例外は Logcat に次のメッセージとともに記録されます。
Fatal Exception: android.app.RemoteServiceException: "A foreground service of
type mediaProcessing did not stop within its timeout: [component name]"
この例外を回避するには、次のいずれかを行います。
- サービスに新しい
Service.onTimeout(int, int)
メソッドを実装します。アプリがコールバックを受信したら、数秒以内にstopSelf()
を呼び出します。(アプリをすぐに停止しないと、システムは障害を生成します)。 - アプリの
mediaProcessing
サービスが 24 時間以内に合計 6 時間を超えて実行されないようにします(ユーザーがアプリを操作してタイマーをリセットする場合を除く)。 mediaProcessing
フォアグラウンド サービスは、ユーザーが直接操作した結果としてのみ開始します。サービスが開始されたときにアプリはフォアグラウンドにあるため、アプリがバックグラウンドに移動した後も 6 時間間サービスは実行されます。mediaProcessing
フォアグラウンド サービスを使用する代わりに、WorkManager などの代替 API を使用してください。
アプリの mediaProcessing
フォアグラウンド サービスが過去 24 時間以内に 6 時間実行されている場合、ユーザーがアプリをフォアグラウンドに表示して(タイマーがリセットされる)場合を除き、別の mediaProcessing
フォアグラウンド サービスを開始することはできません。別の mediaProcessing
フォアグラウンド サービスを開始しようとすると、システムによって ForegroundServiceStartNotAllowedException
がスローされ、「フォアグラウンド サービス タイプ mediaProcessing で時間制限がすでになくなりました」などのエラー メッセージが表示されます。
mediaProcessing
サービスタイプについて詳しくは、Android 15 のフォアグラウンド サービス タイプの変更: メディア処理をご覧ください。
テスト
アプリの動作をテストするには、アプリが Android 15 をターゲットとしていない場合でも、メディア処理のタイムアウトを有効にできます(アプリが Android 15 デバイスで実行されている場合)。タイムアウトを有効にするには、次の adb
コマンドを実行します。
adb shell am compat enable FGS_INTRODUCE_TIME_LIMITS your-package-name
タイムアウト期間を調整して、上限に達したときアプリの動作を簡単にテストすることもできます。新しいタイムアウト期間を設定するには、次の adb
コマンドを実行します。
adb shell device_config put activity_manager media_processing_fgs_timeout_duration duration-in-milliseconds
フォアグラウンド サービスを起動する BOOT_COMPLETED
ブロードキャスト レシーバの制限
BOOT_COMPLETED
ブロードキャスト レシーバに対する新しい制限事項がリリースされます
フォアグラウンド サービスの場合。BOOT_COMPLETED
レシーバーは、API 呼び出しを起動できない
フォアグラウンド サービスのタイプを使用できます。
dataSync
camera
mediaPlayback
phoneCall
mediaProjection
microphone
(この制限は、次の日付よりmicrophone
に適用されています) Android 14)
BOOT_COMPLETED
レシーバーがこれらのタイプのフォアグラウンドのいずれかを起動しようとした場合
サービスの場合、システムは ForegroundServiceStartNotAllowedException
をスローします。
テスト
アプリの動作をテストするには、アプリが Android 15 をターゲットとしていない場合でも、これらの新しい制限を有効にできます(アプリが Android 15 デバイスで実行されている場合)。次の adb
コマンドを実行します。
adb shell am compat enable FGS_BOOT_COMPLETED_RESTRICTIONS your-package-name
デバイスを再起動せずに BOOT_COMPLETED
ブロードキャストを送信するには、次の操作を行います。
次の adb
コマンドを実行します。
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED your-package-name
アプリが SYSTEM_ALERT_WINDOW
権限を保持しているときにフォアグラウンド サービスを開始する場合の制限
以前,如果应用拥有 SYSTEM_ALERT_WINDOW
权限,即使应用当前在后台运行,也可以启动前台服务(如免于后台启动限制中所述)。
如果应用以 Android 15 为目标平台,则此豁免范围现在更窄。现在,应用需要具有 SYSTEM_ALERT_WINDOW
权限,并且还需要有一个可见的叠加窗口。也就是说,应用需要先启动 TYPE_APPLICATION_OVERLAY
窗口,并且该窗口需要处于可见状态,然后您才能启动前台服务。
如果您的应用尝试从后台启动前台服务,但不符合这些新要求(并且没有其他豁免情况),系统会抛出 ForegroundServiceStartNotAllowedException
。
如果您的应用声明了 SYSTEM_ALERT_WINDOW
权限并从后台启动前台服务,则可能会受到此变更的影响。如果您的应用获得了 ForegroundServiceStartNotAllowedException
,请检查应用的操作顺序,并确保应用在尝试从后台启动前台服务之前已具有有效的叠加层窗口。您可以通过调用 View.getWindowVisibility()
检查叠加层窗口当前是否可见,也可以替换 View.onWindowVisibilityChanged()
,以便在可见性发生变化时收到通知。
测试
如需测试应用的行为,您可以启用这些新限制,即使您的应用并未以 Android 15 为目标平台(只要应用在 Android 15 设备上运行)也是如此。如需针对从后台启动前台服务启用这些新限制,请运行以下 adb
命令:
adb shell am compat enable FGS_SAW_RESTRICTIONS your-package-name
アプリがサイレント モードのグローバル状態を変更できるタイミングの変更
Android 15(API レベル 35)以降をターゲットとするアプリは、デバイスのサイレント(DND)モードのグローバル状態やポリシーを変更できなくなりました(ユーザー設定の変更や DND モードのオフによる変更も含みます)。代わりに、アプリは AutomaticZenRule
を提供する必要がある。システムは、既存の最も制限の厳しいポリシーが優先されるスキームで、これをグローバル ポリシーに統合します。以前はグローバル状態に影響していた既存の API(setInterruptionFilter
、setNotificationPolicy
)を呼び出すと、暗黙的な AutomaticZenRule
が作成または更新されます。この AutomaticZenRule
は、API 呼び出しの呼び出しサイクルに応じてオンまたはオフに切り替わります。
この変更は、アプリが setInterruptionFilter(INTERRUPTION_FILTER_ALL)
を呼び出し、その呼び出しによって所有者によって以前に有効にされた AutomaticZenRule
が無効になることを想定している場合にのみ、検出可能な動作に影響します。
OpenJDK API の変更
Android 15 では、最新の OpenJDK LTS リリースの機能に合わせて Android のコアライブラリを更新する取り組みが引き続き行われています。
これらの変更のいくつかは、Android 15(API レベル 35)をターゲットとするアプリの互換性に影響する可能性があります。
String Formatting API の変更: 次の
String.format()
API とFormatter.format()
API を使用する場合、引数の索引、フラグ、幅、精度の検証が厳格になりました。String.format(String, Object[])
String.format(Locale, String, Object[])
Formatter.format(String, Object[])
Formatter.format(Locale, String, Object[])
たとえば、引数インデックスが 0 の場合(形式文字列の
%0
)、次の例外がスローされます。IllegalFormatArgumentIndexException: Illegal format argument index = 0
この場合は、引数インデックス 1(形式文字列の
%1
)を使用して問題を解決できます。Arrays.asList(...).toArray()
のコンポーネント タイプの変更:Arrays.asList(...).toArray()
を使用する場合、結果のアレイのコンポーネント タイプは、基になる配列の要素の型ではなく、Object
になりました。したがって、次のコードはClassCastException
をスローします。String[] elements = (String[]) Arrays.asList("one", "two").toArray();
この場合、結果のアレイでコンポーネント タイプとして
String
を保持するには、代わりにCollection.toArray(Object[])
を使用します。String[] elements = Arrays.asList("two", "one").toArray(new String[0]);
言語コードの処理の変更:
Locale
API を使用する場合、ヘブライ語、イディッシュ語、インドネシア語の言語コードは、廃止された形式(ヘブライ語:iw
、イディッシュ語:ji
、インドネシア語:in
)に変換されなくなりました。これらの言語 / 地域の言語コードを指定する場合は、代わりに ISO 639-1 のコード(ヘブライ語:he
、イディッシュ語:yi
、インドネシア語:id
)を使用してください。乱数 int シーケンスの変更: https://bugs.openjdk.org/browse/JDK-8301574 で行われた変更により、次の
Random.ints()
メソッドはRandom.nextInt()
メソッドとは異なる数列を返すようになりました。通常、この変更によってアプリの動作に異常が生じることはありませんが、コードで
Random.ints()
メソッドから生成されたシーケンスがRandom.nextInt()
と一致することを想定しないでください。
新しい SequencedCollection
API は、アプリのビルド構成で compileSdk
を更新して Android 15(API レベル 35)を使用するようにした後、アプリの互換性に影響する可能性があります。
kotlin-stdlib
のMutableList.removeFirst()
拡張関数とMutableList.removeLast()
拡張関数との競合Java の
List
型は、Kotlin のMutableList
型にマッピングされます。List.removeFirst()
API とList.removeLast()
API は Android 15(API レベル 35)で導入されたため、Kotlin コンパイラは、list.removeFirst()
などの関数呼び出しを、kotlin-stdlib
の拡張関数ではなく、新しいList
API に静的に解決します。compileSdk
が35
に設定され、minSdk
が34
以下に設定された状態でアプリが再コンパイルされ、Android 14 以前でアプリが実行されると、ランタイム エラーがスローされます。java.lang.NoSuchMethodError: No virtual method removeFirst()Ljava/lang/Object; in class Ljava/util/ArrayList;
Android Gradle プラグインの既存の
NewApi
lint オプションは、これらの新しい API の使用を検出できます。./gradlew lint
MainActivity.kt:41: Error: Call requires API level 35 (current min is 34): java.util.List#removeFirst [NewApi] list.removeFirst()ランタイム例外と lint エラーを修正するには、Kotlin で
removeFirst()
関数呼び出しとremoveLast()
関数呼び出しをそれぞれremoveAt(0)
とremoveAt(list.lastIndex)
に置き換えます。Android Studio Ladybug | 2024.1.3 以降を使用している場合は、これらのエラーの簡単な修正オプションも用意されています。lint オプションが無効になっている場合は、
@SuppressLint("NewApi")
とlintOptions { disable 'NewApi' }
の削除を検討してください。Java の他のメソッドとの競合
既存のタイプに新しいメソッドが追加されました(
List
、Deque
など)。これらの新しいメソッドは、他のインターフェースやクラスの同じ名前と引数型のメソッドと互換性がない場合があります。メソッド シグネチャの競合と非互換性がある場合、javac
コンパイラはビルド時エラーを出力します。次に例を示します。エラーの例 1:
javac MyList.java
MyList.java:135: error: removeLast() in MyList cannot implement removeLast() in List public void removeLast() { ^ return type void is not compatible with Object where E is a type-variable: E extends Object declared in interface Listエラーの例 2:
javac MyList.java
MyList.java:7: error: types Deque<Object> and List<Object> are incompatible; public class MyList implements List<Object>, Deque<Object> { both define reversed(), but with unrelated return types 1 errorエラーの例 3:
javac MyList.java
MyList.java:43: error: types List<E#1> and MyInterface<E#2> are incompatible; public static class MyList implements List<Object>, MyInterface<Object> { class MyList inherits unrelated defaults for getFirst() from types List and MyInterface where E#1,E#2 are type-variables: E#1 extends Object declared in interface List E#2 extends Object declared in interface MyInterface 1 errorこれらのビルドエラーを修正するには、これらのインターフェースを実装するクラスで、互換性のある戻り値の型を持つメソッドをオーバーライドする必要があります。例:
@Override public Object getFirst() { return List.super.getFirst(); }
セキュリティ
Android 15 では、システムのセキュリティを強化し、悪意のあるアプリからアプリとユーザーを保護するための変更が加えられています。
制限付きの TLS バージョン
Android 15 では、TLS バージョン 1.0 および 1.1 の使用が制限されています。これまではこれらのバージョンは Android で非推奨でしたが、現在は Android 15 をターゲットとするアプリで許可されないようになりました。
保護されたバックグラウンド アクティビティの起動
Android 15 可保护用户免受恶意应用的侵害,并让用户更好地控制 来防止恶意后台应用 将其他应用置于前台、提升其权限以及滥用 用户互动自以下时间以来,后台活动启动一直受到限制 Android 10(API 级别 29)。
禁止与堆栈中的顶部 UID 不匹配的应用启动 activity
恶意应用可以在同一任务中启动另一个应用的 activity,然后
叠加在上面,营造出像该应用一样的错觉。这个“任务”
劫持"攻击绕过了当前的后台启动限制,
会发生在同一个可见任务中。为了降低这种风险,Android 15 新增了
用于阻止与堆栈中的顶层 UID 不匹配的应用启动的标志
活动。如需选择启用应用的所有活动,请更新
allowCrossUidActivitySwitchFromBelow
属性:AndroidManifest.xml
<application android:allowCrossUidActivitySwitchFromBelow="false" >
如果满足以下所有条件,则启用新的安全措施:
- 执行启动的应用以 Android 15 为目标平台。
- 任务堆栈顶部的应用以 Android 15 为目标平台。
- 所有可见活动都已选择启用新保护措施
如果启用了安全措施,应用可能会返回主屏幕,而不是返回 最后一个可见应用(如果他们自行完成任务)。
其他变更
除了限制 UID 匹配之外,这些其他变更也 包括:
- 更改
PendingIntent
创作者,以阻止后台活动启动,具体方法是: 默认。这有助于防止应用意外创建 可能被恶意操作者滥用的PendingIntent
。 - 请勿将应用调到前台,除非
PendingIntent
发送者 允许它。此变更旨在防止恶意应用滥用 在后台启动 activity 的功能。默认情况下,应用 允许将任务堆栈转到前台,除非创建者允许 后台活动启动权限或发送者有后台活动 启动权限 - 控制任务堆栈的顶层 activity 完成其任务的方式。如果 顶层 activity 完成一项任务后,Android 会返回到之前执行的 上次活动时间。此外,如果非顶层 activity 完成其任务,Android 将 返回主屏幕;因此不会阻碍这个非顶层的 活动。
- 防止将其他应用中的任意 activity 启动到您自己的 activity 任务。这项变更旨在防止恶意应用 看起来像是来自其他应用的活动
- 禁止将不可见窗口视为后台活动 发布。这有助于防止恶意应用滥用后台 activity 来向用户显示不需要或恶意的内容。
より安全なインテント
Android 15 では、インテントをより安全かつ堅牢にするために、新しいオプションのセキュリティ対策が導入されています。この変更は、悪意のあるアプリによって悪用されるおそれのある潜在的な脆弱性やインテントの不正使用を防止することを目的としています。Android 15 では、インテントのセキュリティに関して、主に 2 つの改善点があります。
- ターゲットのインテント フィルタに一致させる: 特定のコンポーネントをターゲットとするインテントは、ターゲットのインテント フィルタの仕様に正確に一致する必要があります。別のアプリのアクティビティを起動するためのインテントを送信する場合、ターゲット インテント コンポーネントは、受信側のアクティビティで宣言されたインテント フィルタと一致している必要があります。
- インテントにはアクションが必要です。アクションのないインテントは、インテント フィルタと一致しなくなります。つまり、アクティビティやサービスを起動するために使用するインテントには、明確に定義されたアクションが必要です。
アプリがこれらの変更にどのように対応するかを確認するには、アプリで StrictMode
を使用します。Intent
の使用違反に関する詳細なログを表示するには、次のメソッドを追加します。
Kotlin
fun onCreate() { StrictMode.setVmPolicy(VmPolicy.Builder() .detectUnsafeIntentLaunch() .build() ) }
Java
public void onCreate() { StrictMode.setVmPolicy(new VmPolicy.Builder() .detectUnsafeIntentLaunch() .build()); }
ユーザー エクスペリエンスとシステム UI
Android 15 には、より一貫性があり直感的なユーザー エクスペリエンスを実現するための変更がいくつか含まれています。
ウィンドウの切れ込みの変更
Android 15 では、ウィンドウの切り欠きに関連する 2 つの変更があります。エッジツーエッジがデフォルトで適用され、システムバーのデフォルト構成などの構成も変更されています。
全面实施政策
アプリが Android 15(API レベル 35)をターゲットとしている場合、Android 15 を搭載したデバイスでは、アプリはデフォルトで端から端まで表示されます。

これは互換性を破る変更であり、アプリの UI に悪影響を及ぼす可能性があります。この変更は、次の UI 領域に影響します。
- ジェスチャー ハンドル ナビゲーション バー
- デフォルトは透明です。
- 下部オフセットが無効になっているため、インセットが適用されない限り、コンテンツはシステム ナビゲーション バーの背後に描画されます。
setNavigationBarColor
とR.attr#navigationBarColor
は非推奨であり、ジェスチャー ナビゲーションには影響しません。setNavigationBarContrastEnforced
とR.attr#navigationBarContrastEnforced
は、引き続きジェスチャー ナビゲーションに影響しません。
- 3 ボタン ナビゲーション
- 不透明度はデフォルトで 80% に設定され、色はウィンドウの背景と一致する場合があります。
- 下部オフセットが無効になっているため、インセットが適用されない限り、コンテンツはシステム ナビゲーション バーの背後に描画されます。
setNavigationBarColor
とR.attr#navigationBarColor
は、デフォルトでウィンドウの背景と一致するように設定されています。このデフォルトを適用するには、ウィンドウの背景がカラー ドローアブルである必要があります。この API は非推奨ですが、3 ボタン ナビゲーションには引き続き影響します。setNavigationBarContrastEnforced
とR.attr#navigationBarContrastEnforced
はデフォルトで true です。これにより、3 ボタン ナビゲーション全体に 80% 不透明の背景が追加されます。
- ステータスバー
- デフォルトは透明です。
- 上部のオフセットが無効になっているため、インセットが適用されない限り、コンテンツはステータスバーの背後に描画されます。
setStatusBarColor
とR.attr#statusBarColor
は非推奨であり、Android 15 では効果がありません。setStatusBarContrastEnforced
とR.attr#statusBarContrastEnforced
は非推奨ですが、Android 15 では引き続き有効です。
- ディスプレイの切り欠き
- フローティング以外のウィンドウの
layoutInDisplayCutoutMode
はLAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
にする必要があります。SHORT_EDGES
、NEVER
、DEFAULT
はALWAYS
として解釈されるため、ディスプレイの切り欠きによる黒いバーが表示されず、端から端まで表示されます。
- フローティング以外のウィンドウの
次の例は、Android 15(API レベル 35)をターゲットとする前後のアプリと、インセットを適用する前後のアプリを示しています。



アプリがすでにエッジツーエッジの場合に確認すべき点
アプリがすでにエッジツーエッジで、インセットを適用している場合は、以下のシナリオを除き、ほとんど影響を受けません。ただし、影響を受けていないと思われる場合でも、アプリをテストすることをおすすめします。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
ではなくSHORT_EDGES
、NEVER
、DEFAULT
を使用するActivity
など、フローティングではないウィンドウがあります。アプリが起動時にクラッシュする場合は、スプラッシュ画面が原因である可能性があります。コア スプラッシュスクリーンの依存関係を 1.2.0-alpha01 以降にアップグレードするか、window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutInDisplayCutoutMode.always
を設定します。- トラフィックの少ない画面で UI が遮られる場合があります。アクセス頻度の低い画面に UI が隠れていないことを確認します。トラフィックの少ない画面には、次のものがあります。
- オンボーディング画面またはログイン画面
- 設定ページ
アプリがまだエッジツーエッジに対応していない場合の確認事項
アプリがエッジツーエッジに対応していない場合は、影響を受ける可能性が高いです。すでにエッジツーエッジのアプリのシナリオに加えて、次の点も考慮する必要があります。
- アプリが Compose でマテリアル 3 コンポーネント(
androidx.compose.material3
)(TopAppBar
、BottomAppBar
、NavigationBar
など)を使用している場合、これらのコンポーネントはインセットを自動的に処理するため、影響を受けない可能性があります。 - アプリが Compose でマテリアル デザイン 2 のコンポーネント(
androidx.compose.material
)を使用している場合、コンポーネントはインセットを自動的には処理しません。ただし、インセットにアクセスして手動で適用することはできます。androidx.compose.material 1.6.0 以降では、windowInsets
パラメータを使用して、BottomAppBar
、TopAppBar
、BottomNavigation
、NavigationRail
にインセットを手動で適用します。同様に、Scaffold
にはcontentWindowInsets
パラメータを使用します。 - アプリでビューとマテリアル コンポーネント(
com.google.android.material
)を使用する場合、ビューベースのマテリアル コンポーネントの多く(BottomNavigationView
、BottomAppBar
、NavigationRailView
、NavigationView
など)はインセットを処理します。追加の作業は不要です。ただし、AppBarLayout
を使用する場合はandroid:fitsSystemWindows="true"
を追加する必要があります。 - カスタム コンポーザブルの場合は、インセットをパディングとして手動で適用します。コンテンツが
Scaffold
内にある場合は、Scaffold
パディング値を使用してインセットを使用できます。それ以外の場合は、WindowInsets
のいずれかを使用してパディングを適用します。 - アプリがビューと
BottomSheet
、SideSheet
、またはカスタム コンテナを使用する場合、ViewCompat.setOnApplyWindowInsetsListener
を使用してパディングを適用します。RecyclerView
については、このリスナーを使用してパディングを適用して、さらにclipToPadding="false"
を追加します。
アプリでカスタム バックグラウンド保護を提供する必要がある場合の確認事項
アプリで 3 ボタン ナビゲーションまたはステータスバーにカスタム バックグラウンド保護を提供する必要がある場合は、WindowInsets.Type#tappableElement()
を使用してシステムバーの背後にコンポーザブルまたはビューを配置し、3 ボタン ナビゲーション バーの高さまたは WindowInsets.Type#statusBars
を取得する必要があります。
その他のエッジツーエッジ リソース
インセットの適用に関するその他の考慮事項については、エッジツーエッジ ビューとエッジツーエッジ Compose のガイドをご覧ください。
サポート終了 API
次の API は非推奨ですが、無効にされていません。
R.attr#enforceStatusBarContrast
R.attr#navigationBarColor
(3 ボタン ナビゲーション用、アルファ 80%)Window#isStatusBarContrastEnforced
Window#setNavigationBarColor
(3 ボタン ナビゲーション用、アルファ 80%)Window#setStatusBarContrastEnforced
次の API は非推奨で、無効になっています。
R.attr#navigationBarColor
(ジェスチャー ナビゲーション用)R.attr#navigationBarDividerColor
R.attr#statusBarColor
Window#setDecorFitsSystemWindows
Window#getNavigationBarColor
Window#getNavigationBarDividerColor
Window#getStatusBarColor
Window#setNavigationBarColor
(ジェスチャー ナビゲーション用)Window#setNavigationBarDividerColor
Window#setStatusBarColor
稳定配置
アプリが Android 15(API レベル 35)以降をターゲットとしている場合、Configuration
はシステムバーを除外しなくなりました。Android 10 の
Configuration
クラスをレイアウト計算に使用するのではなく、
適切な ViewGroup
、WindowInsets
、または
必要に応じて WindowMetricsCalculator
。
Configuration
は API 1 以降で使用できます。通常は
Activity.onConfigurationChanged
。ウィンドウの密度、向き、サイズなどの情報を提供します。ウィンドウサイズに関する重要な特性の 1 つは
Configuration
から返されたのは、以前にシステムバーを除外していた点です。
構成サイズは通常、次のようなリソースの選択に使用されます。
/res/layout-h500dp
であり、これも有効なユースケースです。ただし、
レイアウトの計算は常に推奨されません。その場合は、
今から離れていきましょう。Configuration
の使用を次の内容に置き換える必要があります。
より適したモデルを選択できます。
レイアウトの計算に使用する場合は、CoordinatorLayout
や ConstraintLayout
などの適切な ViewGroup
を使用します。高さの値の計算に使用すると
システム ナビゲーション バーの WindowInsets
を使用します。現在のサイズを確認するには
computeCurrentWindowMetrics
を使用します。
この変更の影響を受けるフィールドは次のとおりです。
Configuration.screenWidthDp
とscreenHeightDp
のサイズが廃止されました システムバーを除外しますConfiguration.smallestScreenWidthDp
は、screenWidthDp
とscreenHeightDp
の変更によって間接的に影響を受けます。- 次の変更による間接的な影響:
Configuration.orientation
正方形に近いデバイスのscreenWidthDp
とscreenHeightDp
。 Display.getSize(Point)
は、Configuration
の変更によって間接的に影響を受けます。これは API レベル 30 以降で非推奨になりました。Display.getMetrics()
は、API レベル 33 以降、すでにこのように動作しています。
elegantTextHeight 属性のデフォルトは true
For apps targeting Android 15 (API level 35), the
elegantTextHeight
TextView
attribute
becomes true
by default, replacing the compact font used by default with some
scripts that have large vertical metrics with one that is much more readable.
The compact font was introduced to prevent breaking layouts; Android 13 (API
level 33) prevents many of these breakages by allowing the text layout to
stretch the vertical height utilizing the fallbackLineSpacing
attribute.
In Android 15, the compact font still remains in the system, so your app can set
elegantTextHeight
to false
to get the same behavior as before, but it is
unlikely to be supported in upcoming releases. So, if your app supports the
following scripts: Arabic, Lao, Myanmar, Tamil, Gujarati, Kannada, Malayalam,
Odia, Telugu or Thai, test your app by setting elegantTextHeight
to true
.

elegantTextHeight
behavior for apps targeting Android 14 (API level 34) and lower.
elegantTextHeight
behavior for apps targeting Android 15.複雑な文字の形状で TextView の幅が変更される
Android の以前のバージョンでは、複雑なシェーピングを持つ一部の筆記体フォントや言語では、文字が前の文字または次の文字の領域に描画されることがあります。場合によっては、このような文字の開始位置や終了位置が切り詰められていました。Android 15 以降では、TextView
はこのような文字に十分なスペースを描画するための幅を割り当て、アプリがクリッピングを防ぐために左側に追加の余白をリクエストできるようにします。
この変更は TextView
が幅を決定する方法に影響するため、アプリが Android 15(API レベル 35)以降をターゲットとしている場合、TextView
はデフォルトでより多くの幅を割り当てます。この動作を有効または無効にするには、TextView
で setUseBoundsForWidth
API を呼び出します。
左側の余白を追加すると、既存のレイアウトの位置がずれる可能性があるため、Android 15 以降をターゲットとするアプリでも、デフォルトでは余白は追加されません。ただし、setShiftDrawingOffsetForStartOverhang
を呼び出すことで、クリッピングを防ぐためにパディングを追加できます。
次の例は、これらの変更によって、一部のフォントと言語のテキスト レイアウトがどのように改善されるかを示しています。

<TextView android:fontFamily="cursive" android:text="java" />

<TextView android:fontFamily="cursive" android:text="java" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />

<TextView android:text="คอมพิวเตอร์" />

<TextView android:text="คอมพิวเตอร์" android:useBoundsForWidth="true" android:shiftDrawingOffsetForStartOverhang="true" />
言語 / 地域に応じた EditText のデフォルトの行の高さ
以前のバージョンの Android では、テキスト レイアウトは、現在の言語 / 地域に一致するフォントの行の高さに合うようにテキストの高さを伸ばしていました。たとえば、コンテンツが日本語の場合、日本語フォントの行間がラテン文字フォントよりも少し大きいため、テキストの高さが少し大きくなっていました。ただし、次の画像に示すように、このような行の高さの違いにもかかわらず、EditText
要素は、使用されている言語 / 地域に関係なく、均一にサイズ設定されていました。

EditText
要素を表す 3 つのボックス。これらの言語の行の高さは異なりますが、EditText
の高さは同じです。Android 15(API レベル 35)をターゲットとするアプリの場合、指定されたロケールの参照フォントに合わせて、EditText
の最小行の高さが予約されるようになりました。これは次の図に示すとおりです。

EditText
要素を表す 3 つのボックス。EditText
の高さに、これらの言語のフォントのデフォルトの行の高さに対応するスペースが追加されました。必要に応じて、useLocalePreferredLineHeightForMinimum
属性を false
に指定することで、以前の動作を復元できます。また、Kotlin と Java で setMinimumFontMetrics
API を使用して、カスタムの最小垂直指標を設定することもできます。
カメラとメディア
Android 15 では、Android 15 以降をターゲットとするアプリのカメラとメディアの動作が次のように変更されます。
音声フォーカスのリクエストに関する制限
Android 15(API レベル 35)をターゲットとするアプリが音声フォーカスをリクエストするには、最上位のアプリであるか、フォアグラウンド サービスを実行している必要があります。アプリがこれらの要件のいずれかを満たしていないときにフォーカスをリクエストしようとすると、呼び出しは AUDIOFOCUS_REQUEST_FAILED
を返します。
音声フォーカスの詳細については、音声フォーカスを管理するをご覧ください。
非 SDK の制限の更新
Android 15 では、Android デベロッパーの協力と直近の内部テストに基づいて、制限を受ける非 SDK インターフェースのリストが更新されています。Google は、非 SDK インターフェースを制限する前に、可能な限り、その代わりとなる公開インターフェースを利用可能にしています。
Android 15 をターゲットとしないアプリでは、この変更の一部はすぐには影響しない可能性があります。ただし、アプリのターゲット API レベルによっては、アプリが一部非 SDK インターフェースにアクセスできる場合もありますが、非 SDK のメソッドやフィールドを使用すると、アプリが機能しなくなるリスクが高くなります。
アプリが非 SDK インターフェースを使用しているかどうか不明な場合は、アプリをテストして確認できます。アプリが非 SDK インターフェースに依存している場合は、SDK の代替インターフェースへの移行を計画してください。ただし Google も、一部のアプリには非 SDK インターフェースを使用する正当なユースケースがあると承知しています。アプリの機能に使用している非 SDK インターフェースの代わりが見つからない場合は、新しい公開 API をリクエストしてください。
Android の今回のリリースの変更について詳しくは、非 SDK インターフェースの制限に関する Android 15 での変更点をご覧ください。非 SDK インターフェース全般について詳しくは、非 SDK インターフェースの制限をご覧ください。