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

R8入門

nichiyoshi
December 17, 2019

 R8入門

potatotipsの登壇資料

Android Dev Summit'19のYoutube動画の中の"Shrinking Your App with R8 "の内容を、「そもそもR8って何」という補足など入れながらまとめました。
元動画 https://www.youtube.com/watch?v=uQ_yK8kRCaA

nichiyoshi

December 17, 2019
Tweet

More Decks by nichiyoshi

Other Decks in Programming

Transcript

  1. R8入門
    nichi_yd
    FiNC Technologies
    Nichika Yoshida

    View Slide

  2. もくじ
    1. R8とは
    2. ProGuardとの比較
    3. 圧縮に関する4つのタスク
    コードの圧縮、リソースの圧縮、難読化、最適化
    4. 必要な理由
    5. 効果検証
    6. 圧縮がどのようにされるか
    7. リフレクションに注意
    8. その他

    View Slide

  3. R8とは
    ● コード圧縮ツール
    ● 圧縮、desugar、dex変換 をまとめて一度に実行
    ○ 圧縮 = 後述
    ○ desugar = Java8など新しい言語機能を全てのデバイスで実行できるようにする
    ○ dex変換 = javacやkotlincで生成される.classをAndroidランタイム上で実行できる .dexに変換

    View Slide

  4. ProGuardとの比較 from https://developer.android.com/studio/releases/?hl=ja#r8-default

    View Slide

  5. ProGuardとの比較
    ● ProGuardよりもコードの圧縮にかかる時間が短縮され、出力サイズもより小さく
    なっている
    ○ ProGuardはAndroid Gradle プラグイン 3.4.0 以降を使用したプロジェクトのビルドでは使われてい
    ない
    ○ ProGuardのルールはR8でも使われる

    View Slide

  6. R8の圧縮に関する4つのタスク
    1. コードの圧縮
    2. リソースの圧縮
    3. 難読化
    4. 最適化

    View Slide

  7. R8の圧縮に関する4つのタスク
    1. コードの圧縮
    使用されていないクラス、フィールド、メソッド、属性を検出し、アプリとそのライブラ
    リ依存関係から安全に削除
    2. リソースの圧縮
    パッケージ化アプリから使用されていないリソースを削除

    View Slide

  8. R8の圧縮に関する4つのタスク
    3. 難読化
    クラスとメンバーの名前を短くし、DEX ファイルのサイズを小さくする
    4. 最適化
    コードを検査して書き換えることで、アプリの DEX ファイルのサイズをさらに小さく
    する
    ● 常にfalseになるif分岐を削除
    ● 絶対通らないelse分岐を削除
    ● inline化

    View Slide

  9. 必要な理由
    例えば...3rdパーティライブラリのうち、アプリから参照されるコードは一部のみ

    View Slide

  10. 効果検証 from Shrinking Your App with R8 (Android Dev Summit '19)

    View Slide

  11. 効果検証

    View Slide

  12. 効果検証

    View Slide

  13. 効果検証 -単一アクティビティアプリに Jetpackのみ追加-
    6割以上減少
    Kotlinの方がサイズ大きいのは、
    Kotlin Standard Libraryが入ってるから

    View Slide

  14. 効果検証 -okhttp4.2.0を追加(だたし参照せず)-

    View Slide

  15. 効果検証 -okhttp4.2.0を追加(だたし参照せず)-
    okhttp4.2.0はKotlinで書かれてるので、Javaア
    プリにもKotlin Standard Libraryが含まれてサ
    イズ大きくなった

    View Slide

  16. 効果検証 -okhttp4.2.0を追加(だたし参照せず)-
    参照はしてないからコンパイル時に削除され、
    アプリサイズはライブラリ入れる前と変わらず

    View Slide

  17. 効果検証

    View Slide

  18. 圧縮がどのようにされるか

    View Slide

  19. 圧縮がどのようにされるか -コード圧縮-
    コード圧縮

    View Slide

  20. 圧縮がどのようにされるか -難読化-
    難読化
    (メソッド名が”a”に)

    View Slide

  21. 圧縮がどのようにされるか -最適化-
    最適化
    (inline化)

    View Slide

  22. リフレクションに注意
    アウトプットが空オブ
    ジェクト

    View Slide

  23. リフレクションに注意
    nameフィールドが使われてないから
    R8によって削除された
    ※Gsonはリフレクション使っていてランタイム
    に動的に読まれる

    View Slide

  24. リフレクションに注意
    nameフィールドを使うメソッドを呼び
    出す
    R8はnameフィールドが使われること
    が分かるので削除はしないが、難読
    化する

    View Slide

  25. その他
    この他にも、動画内では
    1. 特定のクラスやメソッドを圧縮させない方法(リフレクション対策含む)
    2. 最適化の詳説(inliningについて)
    などが解説されています
    動画のリンクは↓↓↓
    https://www.youtube.com/watch?v=uQ_yK8kRCaA

    View Slide

  26. 参考資料
    ● https://developer.android.com/studio/build/shrink-code
    ● https://developer.android.com/studio/releases/?hl=ja#r8-default
    ● https://jakewharton.com/r8-optimization-staticization/

    View Slide

  27. Thank You

    View Slide