Upgrade to Pro — share decks privately, control downloads, hide ads and more …

R8 の設定見直しでアプリサイズ削減

Avatar for ANDPAD inc ANDPAD inc
October 07, 2026

R8 の設定見直しでアプリサイズ削減

Avatar for ANDPAD inc

ANDPAD inc

October 07, 2026

More Decks by ANDPAD inc

Other Decks in Programming

Transcript

  1. 自己紹介 Shota Nagahori SWE @ ANDPAD Inc. X, GitHub, etc.:

    @nashcft © 2026 ANDPAD All Rights Reserved. 2
  2. App quality の評価指標にアプリの最適化度合いが追加される 詳細 @ Help Center -> https://support.google.com/googleplay/androiddeveloper/answer/17492799#dex_code_optimization&zippy=%2Cdex-codeoptimization DEX

    のサイズが一定以上のアプリ・ゲームに対し、 Obfuscation, Optimization, Shrinking 3項目の達成率がそれぞれ25%以上であることが品質要求に加わる 2027-02 から適用される予定 達成率が足りないと Play Store での露出などでペナルティが発生するとのこと 詳細は年内に発表される予定 R8 の設定をできるだけ有効化して圧縮や難読化の適用範囲を広げよう 自分のアプリ・ゲームの DEX のサイズや、各項目の達成率は Play Console の app bundle explorer で確認できるようになっている (実行時メモリ使用量など別の評価指標も同時に追加されるが、今回は省略) © 2026 ANDPAD All Rights Reserved. 4
  3. 何も圧縮してない!!! 細かい話を抜きにするとこの設定でやっていることは「すべてのコードをそのまま保持する」 「すべて」というのは自分たちの project 内のコードだけでなく依存ライブラリのコードも 含んでいる => 依存ライブラリの API を含めたすべての

    class や method などが全部そのままアプ リの中に含められてしまうということ どうなるか DEX の肥大化 APK ファイルの中身を見たら DEX ファイルが14個あった DEX ファイル1つに含められる method の上限が65536 => 90万前後の method がある計算 DEX が大きいともちろんアプリのサイズも大きい © 2026 ANDPAD All Rights Reserved. 11
  4. (余談) R8 のバグに遭遇していた あまりに DEX ファイルが多いのでそれ起因で R8 のバグを踏み抜くなどしていた AGP intermittently

    produces dex files that fail verification and crash app on launch: https://issuetracker.google.com/issues/485558707 雑に説明すると R8 の並列処理のミスで壊れた DEX ファイルができる (ことがある) これによりインストール後の OAT への変換に失敗して壊れた実行ファイルができる => 含まれているは ずの class を見つけられずアプリがクラッシュする 最終的な DEX ファイル数が10個以上あるような大きなアプリで起こりやすいらしい? 観測範囲では DEX ファイルが5, 6個くらいまでの APK で遭遇したことなし 現在は修正されたバージョンがリリースされている 使っている AGP のバージョンが古い場合は R8 のバージョンを直接指定しないと取り込めないので 注意 (余談の余談) 対応後にバグの存在に気ついた DEX ファイルを削減した結果遭遇しなくなったのでヨシ! ということにした (?) あとで修正適用した © 2026 ANDPAD All Rights Reserved. 12
  5. どうしてこんな暴挙を... なにやら R8 の設定をちゃんとやることを諦めたらしい そんな... ANDPAD アプリでは GSON を使っており、それ関連の対処をする時間を十分に 取れなかった

    or 対応中に打ちのめされてしまったのではないか 実際今回の改善でも一番手間のかかった箇所ではあった © 2026 ANDPAD All Rights Reserved. 13
  6. 依存ライブラリの設定を確認 近年ではライブラリに R8 の設定が同梱されていることが期待できる こういう依存に対しては (抜け漏れがない限り) 設定を行う必要なし OSS の場合は設定がパッケージされているか確認しよう AAR

    で配布している場合: build.gradle(.kts) に consumerProguardFiles の設定 JAR で配布している場合: resources/META-INF/proguard 配下 設定が同梱されてないライブラリの依存がある場合 ドキュメントや issue などで言及がないか探して、あればそれを適用する 言及もなければ以後のステップに進んで実際にビルドしたり動かしたりして必要な設定 を確認する 参考) Optimization for library authors: https://developer.android.com/topic/performance/app-optimization/libraryoptimization © 2026 ANDPAD All Rights Reserved. 17
  7. アプリを動かして確認 実行時に参照先が消されてしまっている・難読化によって名前が変わってしまっていて参照に 失敗することがある Reflection を使っている、ネイティブライブラリから Java/Kotlin の API を参照してい る場合

    文字列で名前を指定して参照するので圧縮・難読化で消えたり名前が変わってたりする とアクセスできない 保持する必要のある API に対する設定を keep rules に追加する できるだけ対象を特定して、保持する範囲を絞るようにする より R8 フレンドリーなライブラリに移行できないか検討する 参考) Choose libraries wisely: https://developer.android.com/topic/performance/app-optimization/chooselibraries-wisely © 2026 ANDPAD All Rights Reserved. 19
  8. GSON を避ける GSON は reflection は reflection を多用しているので R8 のための設定を利用者側で行わな

    ければならない 前ページで紹介したドキュメントや R8 の repository 内にある FAQ で言及されている https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md GSON 自身も Android 向けには not recommended と言っている https://github.com/google/gson/blob/main/README.md Kotlin Serialization や Moshi の codegen に置き換えることを検討しよう ANDPAD は Kotlin Serialization へ移行中 GSON を使い続ける場合は 2.11.0 以上を使い、各 field への @SerializedName の指定を必ず つけること https://github.com/google/gson/releases#release-gson-parent-2.11.0 © 2026 ANDPAD All Rights Reserved. 20
  9. 設定見直し後 3項目の達成率: 0-11% => 72-73% DEX ファイル数: 14 => 4

    Code / DEX のサイズ: 64%削減 アプリサイズ (ダウンロードサイズ): 25%削減 ネイティブライブラリの比率が結構高く、全体で見るとそんなに減らなかった © 2026 ANDPAD All Rights Reserved. 24
  10. あなたと R8, 今すぐ最適化 Android Developers の R8 のドキュメントを読もう https://developer.android.com/topic/performance/appoptimization/enable-app-optimization R8

    configuration analyzer を活用しよう (AGP 9.3.0 から) https://developer.android.com/topic/performance/app-optimization/r8configuration-analyzer Android CLI から skill として呼び出せる 普段から minify したビルドを作って動かせる環境を用意しておくと便利 © 2026 ANDPAD All Rights Reserved. 25