2025/8/31以降、Google Playのアプリをアップデートするには対象APIレベルを35以降にする必要がある。EBPocketと読書尚友の対応作業を一ヶ月ぐらいかけて行ったが、それなりに大変だった。
(1)edge-to-edge対応
一点目は、対象APIレベルを35にするとedge-to-edgeが強制され、画面の表示領域がスクリーンの上端から下端までになる。上部のステータスバーと、下部の3ボタンナビゲーションバーは、アプリに重なってフローティングで表示される。
確かに地図アプリなどでは全画面で表示されたほうが画面を有効活用できると思うが、全てのアプリに強制されるのはどうなんだろう。
とりあえずはActivity の theme に windowOptOutEdgeToEdgeEnforcementを指定すると、edge-to-edgeを無効にはできる。
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
ただし、対象APIレベルを36以上にするとwindowOptOutEdgeToEdgeEnforcementは効力を失うので、これは一時しのぎでしかない。
きちんと対応するには、システムバーのインセットを取得して、システムバーの領域が重ならないようにビューの表示領域を調整する必要がある。
詳しくは以下を見てほしい。
大体こんな感じで対応した。
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM ) {optimizeEdgeToEdge();}private void optimizeEdgeToEdge() {ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams();mlp.leftMargin = insets.left;mlp.topMargin = insets.top;mlp.rightMargin = insets.right;mlp.bottomMargin = insets.bottom;v.setLayoutParams(mlp);// Return CONSUMED if you don't want the window insets to keep passing// down to descendant views.return WindowInsetsCompat.CONSUMED;});}
ただし、表示領域を調整しただけだと、ステータスバーの背景が透明のままになる。従来はsetStatusBarColor()で背景色を指定できたが、API35からはAPIが無効になったので、ステータスバーの背景を変えるのは至難の業になった。
結局、「透明のステータスバーの背景に、色付きのカスタムビューを表示する」という姑息な方法で対応したが、もっといい方法があるかもしれない。
(2)16Kページサイズ対応
二点目は、NDKを用いたライブラリを使っている場合、16Kページサイズに対応しなければならない。JavaやKotlinで書かれている場合は特に対応する必要はない。
読書尚友では、PDFライブラリの android-pdf-viewer が依存している PdfiumAndroid が16Kページサイズに対応していなかった。
調査したところ、16Kページサイズに対応させたandroid-pdf-viewerのforkが見つかったので、こちらに置き換えた。
(変更前:16Kページに未対応)(変更後:16Kページに対応)implementation 'com.github.marain87:AndroidPdfViewer:3.2.8'
EBPocketは自前のC++ライブラリを16Kページサイズ対応させる必要がある。
具体的にはAndroid.mkにリンクオプションを追加するが、NDKのリビジョンによって指定方法が違う。
Android NDK r28 以降デフォルトで 16 KB アラインメントでコンパイルされる。Android NDK r27APP_SUPPORT_FLEXIBLE_PAGE_SIZES := trueAndroid NDK r26 以前LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"Android NDK r22 以前LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
とりあえずこれで対象APIレベル35(Android15)に対応できた。
毎年対象APIレベルが一つずつ上がるので、年に一度の対応が恒例行事になっている。
さて、久しぶりにEBPocketを触ったら、UIの古臭さが気になってきたので、できる範囲で対応してみた。この話は次回にしたい。