Slide 1

Slide 1 text

R8入門 nichi_yd FiNC Technologies Nichika Yoshida

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

効果検証

Slide 12

Slide 12 text

効果検証

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

効果検証

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

Thank You