Slide 1

Slide 1 text

STORES 株式会社 Edge-to-edge「強制」への対応 2024.08.09 Shibuya.apk #48 渡邊 亮 (@error96num | ©Ryo)

Slide 2

Slide 2 text

自己紹介 ● 渡邊 亮 @error96num | ©Ryo ● STORES株式会社 - STORES ブランドアプリ ● Androidエンジニア 3年ほど 2

Slide 3

Slide 3 text

はじめに 3 開発中のアプリを既に Edge-to-edgeに対応した方 🙋

Slide 4

Slide 4 text

はじめに 4 開発中のアプリを既に targetSdk 35 (Android 15) に対応した方 🙋

Slide 5

Slide 5 text

本題:targetSdk 35で Edge-to-edge が強制される

Slide 6

Slide 6 text

Edge-to-edgeが「強制」されるとは 6 https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge Edge-to-edge でない Edge-to-edge

Slide 7

Slide 7 text

Edge-to-edgeが「強制」されるとは 7 targetSdk 34 × 端末 API level 35 (Android 15) https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge targetSdk 35 × 端末 API level 35 (Android 15) Edge-to-edge enforcement Apps are edge-to-edge by default on devices running Android 15 if the app is targeting Android 15 (API level 35). Edge-to-edge でない Edge-to-edge

Slide 8

Slide 8 text

Edge-to-edgeが「強制」されるとは 8 targetSdk 34以下 targetSdk 35 端末 API level 35 (Android 15) 非適用 適用  👈 端末 API level 34 (Android 14) 以下 非適用 非適用 デフォルトで Edge-to-edge が適用される / されない https://developer.android.com/develop/ui/views/layout/edge-to-edge#enable-edge-to-edge-display This is 強制 targetSdk 34 までのアプリでは Activity の onCreate で enableEdgeToEdge を呼ぶことで初めて適用されていた override fun onCreate(savedInstanceState: Bundle?) { enableEdgeToEdge() super.onCreate(savedInstanceState) ... }

Slide 9

Slide 9 text

強制されると あなたのアプリのレイアウトが大変なことになる(かも) 9 targetSdk 34 × 端末 API level 35 (Android 15) Edge-to-edge 未対応 targetSdk 35 × 端末 API level 35 (Android 15) Edge-to-edge が強制された状態 https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge

Slide 10

Slide 10 text

大変なことにならないように アプリのViewを適切に「ズラす」必要がある  10 targetSdk 34 × 端末 API level 35 (Android 15) Edge-to-edge 未対応 targetSdk 35 × 端末 API level 35 (Android 15) Edge-to-edge が強制された状態 → WindowInsetsを考慮してViewをズラす https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge

Slide 11

Slide 11 text

「WindowInsetsを考慮してViewをズラす」の例 11 ・https://developer.android.com/codelabs/edge-to-edge#2 ・https://github.com/android/socialite/pull/77 Scaffold( ... ) { innerPadding -> Column { val layoutDirection = LocalLayoutDirection.current ... InputBar( ... - contentPadding = PaddingValues(0.dp), ‘ + contentPadding = innerPadding.copy(layoutDirection, top = 0.dp), ‘ ... ) } } ... BEFORE AFTER Scaffoldの場合、ここに WindowInsetsの情報が含まれる

Slide 12

Slide 12 text

「WindowInsetsを考慮してViewをズラす」ための参考情報 12 ● 基本的な方針 ○ https://developer.android.com/about/versions/15/behavior-changes-15#edge-to-edge ○ https://developer.android.com/codelabs/edge-to-edge#0 ● AndroidViewの詳細 ○ https://developer.android.com/develop/ui/views/layout/edge-to-edge ● Composeの詳細 ○ https://developer.android.com/develop/ui/compose/layouts/insets

Slide 13

Slide 13 text

Viewをズラすことができないケース 13 画面全体を外部のライブラリで表示している場合 アプリ側の実装だけでは解決できないことがある 例) OSS Licenses Gradle Plugin ・OssLicensesMenuActivity ・OssLicensesActivity ↓ Edge-to-edge未対応 ↓ targetSdk 35で表示が崩れた😭

Slide 14

Slide 14 text

Viewをズラすことができないケース 14 https://github.com/google/play-services-plugins/issues/296

Slide 15

Slide 15 text

あれ、詰んだ? 😰

Slide 16

Slide 16 text

まだ大丈夫 󰷹

Slide 17

Slide 17 text

targetSdk 35 でも Edge-to-edgeの強制 をオプトアウトできる 17 https://github.com/error96num/nowinandroid/commit/5aec23693a0e34ca6c67c5bb9a110d7099a57273 1. AndroidManifest で Activity にカスタムテーマを設定する <item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item> 2. テーマの android:windowOptOutEdgeToEdgeEnforcement の属性を true にする 👈nowinandroidで試しました

Slide 18

Slide 18 text

  オプトアウトは将来的にdisabledになるので 利用は最小限に! 18 If this is true, the edge-to-edge enforcement won’t be applied. However, this attribute will be deprecated and disabled in a future SDK level. public static final int windowOptOutEdgeToEdgeEnforcement https://developer.android.com/reference/android/R.attr#windowOptOutEdgeToEdgeEnforcement

Slide 19

Slide 19 text

何はともあれ... 今日から Edge-to-edge に対応しましょう! 19   targetSdkを35に上げる方 へ ● Edge-to-edge対応は 一つひとつの画面でInsetsを適切に処理する 骨の折れる作業 ● 暫定策としてのオプトアウトが残されているので気負わなくていい ● 恒久的には やはりすべての画面を対応させる必要がありそう ● 既に Edge-to-edge対応済みのアプリも「強制」による影響がないか確認する