アイリッジ開発者ブログ

アイリッジに所属するエンジニアが技術情報を発信していきます。

【Android16】大画面デバイスでscreenOrientationが無効になる!?

Android16リリース

2025年6月10日に Android 16(API レベル 36)がリリースされました。 これまでの慣例に従えば、新しいOSのリリースから約1年後には、Google Play ストアでの公開・更新において、targetSdk のアップデートが必要となります。 Google Play アプリの対象 API レベル要件 - Play Console ヘルプ

そのため、アプリを引き続きストアで公開するには、2026年8月31日までに targetSdk を36に対応させる必要があると予想されます。

以下がAndroid16への対応で必要になる変更点です。(AndroidDeveloperBlogより引用)

Android 16を搭載したデバイスでの動作変更点

  • JobScheduler: Android 16 では、JobScheduler の割り当てがより厳格に適用されます。アプリが最前面にあるとき、フォアグラウンド サービスが実行中、またはアクティブなスタンバイ バケット内にあるときにジョブが実行されると、割り当てが適用されます。setImportantWhileForegroundは no-op になりました。新しい停止理由STOP_REASON_TIMEOUT_ABANDONED は、アプリがジョブを停止できなくなったことを検出したときに発生します。

  • ブロードキャスト:優先度を用いた順序付けされたブロードキャストは、同一プロセス内でのみ機能します。プロセス間で順序付けが必要な場合は、別のIPCを使用してください。

  • ART:リフレクション、JNI、その他の手段を使ってAndroid内部にアクセスすると、アプリが動作しなくなる可能性があります。これは決してベストプラクティスではありません。徹底的にテストしてください。 インテント: Android 16 では、インテントリダイレクト攻撃に対するセキュリティが強化されています。インテント処理をテストし、どうしても必要な場合にのみ保護をオプトアウトしてください。
  • 16 KB ページ サイズ:アプリが 16 KB ページ サイズに対応していない場合は、新しい互換モード フラグを使用できますが、最高のパフォーマンスを得るには 16 KB に移行することをお勧めします。
  • アクセシビリティ: announceForAccessibilityは非推奨です。推奨される代替手段をご利用ください。新しいアウトラインテキスト機能で必ずテストしてください。
  • Bluetooth: Android 16 では、再ペアリングが行われる方法に影響するBluetooth 結合の損失の処理が改善されています。

Android 16 をターゲットにすると影響が出るその他の変更点

  • ユーザー エクスペリエンス:変更点には、エッジツーエッジ オプトアウトの削除、予測バックの必須 移行またはオプトアウト、エレガントなフォント API の無効化が含まれます。
  • コア機能:固定レート作業スケジュールが最適化されました。
  • 大画面デバイス: 向き、サイズ変更、アスペクト比の制限は無視されます。レイアウトが様々な画面サイズに対応できるよう、あらゆる向きとアスペクト比をサポートしていることを確認してください。
  • 健康とフィットネス:健康とフィットネスの権限に変更が実装されました。

将来に向けてアプリを準備しましょう:

  • ローカルネットワーク保護:近日中にリリースされるローカルネットワーク保護機能を使ってアプリをテストすることを検討してください。この機能により、ユーザーは将来のAndroidメジャーリリースで、ローカルネットワーク上のデバイスにアクセスできるアプリをより詳細に制御できるようになります。

これらの項目を一つ一つ自分のアプリに影響があるかチェックしていく必要がありますが、中でも

大画面デバイス: 向き、サイズ変更、アスペクト比の制限は無視されます。レイアウトが様々な画面サイズに対応できるよう、あらゆる向きとアスペクト比をサポートしていることを確認してください。

こちらの変更項目に驚く開発者も多いかと思います。 この記事ではこの変更にフォーカスを当て、どういった変更なのかをまとめています。

無視されるAPIやその条件

公式のガイドには以下のように記載されています。

次のマニフェスト属性とランタイム API は、大画面デバイスで全画面モードとマルチウィンドウモードの両方で無視されます。 screenOrientation

resizableActivity

minAspectRatio

maxAspectRatio

setRequestedOrientation()

getRequestedOrientation()

screenOrientation、setRequestedOrientation()、getRequestedOrientation() の次の値は無視されます。

portrait

reversePortrait

sensorPortrait

userPortrait

landscape

reverseLandscape

sensorLandscape

userLandscape

ディスプレイのサイズ変更に関しては、android:resizeableActivity="false"、android:minAspectRatio、android:maxAspectRatio は効果がありません。

動作の変更点: Android 16 以上をターゲットとするアプリ  |  Android Developers

これだけ見ると画面のアスペクト比や画面の向きを固定するAPIはあらかた無効になってしまうようにも見えるのですが、以下の条件においては例外として記載されています。

  1. ゲーム(android:appCategory フラグに基づく)

  2. ユーザーがデバイスのアスペクト比設定でアプリのデフォルトの動作を明示的に有効にしている

  3. sw600dp より小さい画面 (sw: Smallest Widthの略、画面の短い方が600dpと言う意味です)

この2については後で説明しますが、まとめると 大画面端末(sw600)以上でゲーム以外のアプリのみに影響がある変更のようです。

裏を返せば、普通のモバイル端末ではこれまで通りに動くので、screenOrientationやsetRequestedOrientationなどのメソッドも今のところソースコードから削除する必要はなさそうです。

動作検証

では、これらの変更によって実際にどのような動作の違いが出るのかを見てみましょう。

今回の変更で影響が出る1280dp x 800dpのエミュレータで検証します。

また、起動するアプリはAndroidManifestのactivityにscreenOrientation="portrait"を設定しています。

まずはtargetSdk=35でビルドしたアプリを検証してみます。

端末OS targetSdk
16 (API level 36) 15(API level 35)

画面を横に向けた時は左右に黒い帯が表示され、アスペクト比は縦長に固定されているようです。 このような表示をレターボックス表示と言います。

では次にtargetSdkを36にして検証してみましょう。

端末OS targetSdk
16 (API level 36) 16(API level 36)

画面を横に向けると画面全体にアクティビティが拡大されて表示されるようになりました。 これはscreenOrientation="portrait"を設定していない状態のアプリと同じ挙動です。

あれ?そもそも画面回転してない?と思った方。正解です

実はAndroid12の時点で以下のような変更があり、アプリ側でscreenOrientation="portrait"を設定してもデバイスによっては画面の向きは固定されないことがあるようです。

Android 12(API レベル 31)以降では、デバイス メーカーはアプリが指定した画面の向きの制限を無視し、代わりに互換モードを適用できるようになりました。たとえば、折りたたみ式デバイスは、デバイスの横向きのタブレット サイズの内部画面でアクティビティが表示される場合、アクティビティの android:screenOrientation="portrait" 設定を無視することがあります。

デバイスの互換性モード  |  Compatibility  |  Android Developers

では今度は端末側のOSバージョンを11まで下げて動作を見てみましょう。

端末OS targetSdk
11 (API level 30) 16(API level 36)

画面を横に向けても、アプリの表示は維持されたままとなりました。

最後にOSを端末側のOSを12に上げて動作を確認してみましょう。

端末OS targetSdk
12 (API level 31) 16(API level 36)

画面を横に向けるとレターボックス表示となりましたが、全画面表示にはなりませんでした。

ここまでの検証結果をまとめると以下のようになりました。

端末OS targetSdk 画面回転固定 レターボックス表示 全画面表示
11 (API level 30) 16(API level 36) ⚪︎ × ×
12 (API level 31) 16(API level 36) × ⚪︎ ×
16 (API level 36) 15(API level 35) × ⚪︎ ×
16 (API level 36) 16(API level 36) × × ⚪︎

デバイスのアスペクト比設定

先ほどのscreenOrientationが無視される条件の中にあった 「ユーザーがデバイスのアスペクト比設定で、アプリのデフォルトの動作を明示的に有効にしている場合」 という一文ですが

これは、Android 14 で追加された「アプリごとのアスペクト比を変更できる機能を指しています。 各アプリの詳細画面を開くと、最下部にアスペクト比の設定項目が表示されており、ユーザーが任意でアスペクト比を変更できるようになっています。

このアスペクト比を変えた時はどのような動作になるか見てみましょう。

端末OS targetSdk アスペクト比設定
16 (API level 36) 16(API level 36) 16:9

targetSdkは36のままですが、16:9のレターボックス表示となりました。

つまり、targetSdk36ではデフォルトで全画面表示になるが、ユーザーが任意でアプリの画面サイズを変更した場合はそれが優先されるということになります。

次にアスペクト比をAppDefaultにした場合の動作を見てみます。

端末OS targetSdk アスペクト比設定
16 (API level 36) 16(API level 36) AppDefault

フルスクリーンになるかと予想していましたが、これもレターボックス表示になりました。

結局のところ targetSdk 35 -> 36の変更は、アプリインストール直後のこのアスペクト比設定がAppDefaultになっているか、Full Screenになっているかという違いだけのようです。

端末OS targetSdk デフォルトのアスペクト比
16 (API level 31) 15(API level 35) AppDefault
16 (API level 31) 16(API level 36) FullScreen

動作検証まとめ

検証結果をまとめてみると

Android 11 以前では画面回転自体しない

    ⇩

Android 12 で互換モードが適用され、レターボックス表示となり、画面回転するようになった

    ⇩

Android 14 でアプリごとのアスペクト比設定が追加され、ユーザーの意思でレターボックス表示の比率を変えれるようになった

    ⇩

Android16 で横画面でも優先的にフルスクリーン表示されるようになった

と、このよう徐々に段階を踏んで画面回転固定(アスペクト比固定)を排除していったことが分かりました。

結局どうすればいいの?

いくつか選択肢があります。

①アダプティブレイアウトに対応する

このような経緯でAPIを変更してきたGoogleの思惑は、つまるところいろんな端末でアプリを使えるようにしてね。ということです。 Google Pixel 9 Pro FoldやGoogleを搭載したカーナビなどの登場により、より大きな画面やさまざまな画面比率に対応したアプリを開発してほしいという、当然の流れともいえます

その流れに乗っかるためにはGoogleが唱えるアダプティブレイアウトに対応する必要があります。

アダプティブレイアウトは画面サイズに合わせて画面のリストの配置などを変えられる可変式のデザインのことですが、 そのデザインを変更するためのしきい値は以下のように定められています。

Width Class Breakpoint (dp) Common Devices / Notes
Compact width width < 600dp 99.96% of phones in portrait
Medium width 600dp ≤ width < 840dp 93.73% of tablets in portrait, most large unfolded inner displays in portrait
Expanded width 840dp ≤ width < 1200dp 97.22% of tablets in landscape, most large unfolded inner displays in landscape are at least expanded width
Large width 1200dp ≤ width < 1600dp Large tablet displays
Extra-large width width ≥ 1600dp Desktop displays
Height Class Breakpoint (dp) Common Devices / Notes
Compact height height < 480dp 99.78% of phones in landscape
Medium height 480dp ≤ height < 900dp 96.56% of tablets in landscape, 97.59% of phones in portrait
Expanded height height ≥ 900dp 94.25% of tablets in portrait

どのようなレイアウトにすれば良いのかはAndroidの標準デザインガイドラインであるMaterial Design3に記されています。

またサンプルコードもいくつか用意されています。

user-interface-samples/CanonicalLayouts at main · android/user-interface-samples · GitHub

compose-samples/JetNews at main · android/compose-samples · GitHub

compose-samples/Reply at main · android/compose-samples · GitHub

GitHub - android/nowinandroid: A fully functional Android app built entirely with Kotlin and Jetpack Compose

開発にかかる時間はテストも含めて数倍になると思いますが、幅広いデバイスで使いやすいアプリを提供することでより多くのユーザーを獲得することが可能です。

②先延ばしにする

アダプティブレイアウトに対応して行きたいけど、今はまだ無理。。。という場合は先延ばしにするという選択肢があります。 targetSdk 36では今回の変更を無視するためのオプションが用意されています。

AndroidManifestに以下の設定を追加することで、今回のアップデートによる変更を無効化することができます。

アクティビティ毎にオプトアウトする

<activity ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</activity>

アプリ全体でオプトアウトする。

<application ...>
  <property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY" android:value="true" />
</application>

ただし、targetSdk 37ではこのオプトアウトが無効化されることが宣言されていますので、 最大で2027年8月までの先延ばしとなります。

③大画面端末をアプリ配信の対象外にする

PlayStoreから配信できる端末をモバイル端末に限定してしまう方法もあります。

対象アプリのコンソール画面から「モニタリングと改善」→「デバイスカタログ」の画面を表します。

フィルタを追加してサポートしない端末をフィルタリングしたあと、チェックを入れてデバイスを除外します。

ただしフィルタできる画面サイズは small, normal, lager, xlargeしかなく、sw600dp以上といった指定はできないので、あくまでざっくりと配信端末を絞るようなことしかできなさそうでした。

またAndroidManifestに設定できるsupports-screensのフラグも、今ではほとんど機能していないようでした。

https://developer.android.com/guide/topics/manifest/supports-screens-element?hl=ja

④あえてなにもしない

今回検証してみて分かったのは、何もしないと言う選択も取れるということです。

既にアプリをリリースしている場合、これまでタブレットや折りたたみ端末でも使えていたのに、突然対象外にしてしまう。というのももったいない話です。

当然横長大画面のスクリーンに対応していないアプリでは、引き伸ばされてしまい、場合によってはレイアウトが崩れてしまったりする可能性もありますが、そのために「アプリごとのアスペクト比を変更できる機能」が用意されているとも言えます。 ユーザーはアプリごとにアスペクト比を固定できるので、使いやすい画面サイズを選択すれば良いという考え方です。

さいごに

「大画面デバイスでscreenOrientationが無効になる!?」という大袈裟なタイトルでしたが、検証してみると実はそれほど影響の大きい変更ではなさそうでした。

本記事がAndroid16対応される方や、今後の対応方針に迷っている方の参考になれば幸いです。

また、アイリッジでは予算やニーズに合わせた柔軟な開発を行なっております。

サービスに関するご相談やご質問についてお気軽にお問い合わせください。

iridge.jp

【関連記事】

iridge-tech.hatenablog.com