R8入門
by
nichiyoshi
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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