R8入門

782be973d3c99ed9a805886fa6c2acdf?s=47 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

782be973d3c99ed9a805886fa6c2acdf?s=128

nichiyoshi

December 17, 2019
Tweet

Transcript

  1. R8入門 nichi_yd FiNC Technologies Nichika Yoshida

  2. もくじ 1. R8とは 2. ProGuardとの比較 3. 圧縮に関する4つのタスク コードの圧縮、リソースの圧縮、難読化、最適化 4. 必要な理由

    5. 効果検証 6. 圧縮がどのようにされるか 7. リフレクションに注意 8. その他
  3. R8とは • コード圧縮ツール • 圧縮、desugar、dex変換 をまとめて一度に実行 ◦ 圧縮 = 後述

    ◦ desugar = Java8など新しい言語機能を全てのデバイスで実行できるようにする ◦ dex変換 = javacやkotlincで生成される.classをAndroidランタイム上で実行できる .dexに変換
  4. ProGuardとの比較 from https://developer.android.com/studio/releases/?hl=ja#r8-default

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

    ない ◦ ProGuardのルールはR8でも使われる
  6. R8の圧縮に関する4つのタスク 1. コードの圧縮 2. リソースの圧縮 3. 難読化 4. 最適化

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

  8. R8の圧縮に関する4つのタスク 3. 難読化 クラスとメンバーの名前を短くし、DEX ファイルのサイズを小さくする 4. 最適化 コードを検査して書き換えることで、アプリの DEX ファイルのサイズをさらに小さく

    する • 常にfalseになるif分岐を削除 • 絶対通らないelse分岐を削除 • inline化
  9. 必要な理由 例えば...3rdパーティライブラリのうち、アプリから参照されるコードは一部のみ

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

    '19)
  11. 効果検証

  12. 効果検証

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

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

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

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

  17. 効果検証

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

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

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

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

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

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

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

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

  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/

  27. Thank You