potatotipsの登壇資料
Android Dev Summit'19のYoutube動画の中の"Shrinking Your App with R8 "の内容を、「そもそもR8って何」という補足など入れながらまとめました。 元動画 https://www.youtube.com/watch?v=uQ_yK8kRCaA
R8入門nichi_ydFiNC TechnologiesNichika Yoshida
View Slide
もくじ1. R8とは2. ProGuardとの比較3. 圧縮に関する4つのタスクコードの圧縮、リソースの圧縮、難読化、最適化4. 必要な理由5. 効果検証6. 圧縮がどのようにされるか7. リフレクションに注意8. その他
R8とは● コード圧縮ツール● 圧縮、desugar、dex変換 をまとめて一度に実行○ 圧縮 = 後述○ desugar = Java8など新しい言語機能を全てのデバイスで実行できるようにする○ dex変換 = javacやkotlincで生成される.classをAndroidランタイム上で実行できる .dexに変換
ProGuardとの比較 from https://developer.android.com/studio/releases/?hl=ja#r8-default
ProGuardとの比較● ProGuardよりもコードの圧縮にかかる時間が短縮され、出力サイズもより小さくなっている○ ProGuardはAndroid Gradle プラグイン 3.4.0 以降を使用したプロジェクトのビルドでは使われていない○ ProGuardのルールはR8でも使われる
R8の圧縮に関する4つのタスク1. コードの圧縮2. リソースの圧縮3. 難読化4. 最適化
R8の圧縮に関する4つのタスク1. コードの圧縮使用されていないクラス、フィールド、メソッド、属性を検出し、アプリとそのライブラリ依存関係から安全に削除2. リソースの圧縮パッケージ化アプリから使用されていないリソースを削除
R8の圧縮に関する4つのタスク3. 難読化クラスとメンバーの名前を短くし、DEX ファイルのサイズを小さくする4. 最適化コードを検査して書き換えることで、アプリの DEX ファイルのサイズをさらに小さくする● 常にfalseになるif分岐を削除● 絶対通らないelse分岐を削除● inline化
必要な理由例えば...3rdパーティライブラリのうち、アプリから参照されるコードは一部のみ
効果検証 from Shrinking Your App with R8 (Android Dev Summit '19)
効果検証
効果検証 -単一アクティビティアプリに Jetpackのみ追加-6割以上減少Kotlinの方がサイズ大きいのは、Kotlin Standard Libraryが入ってるから
効果検証 -okhttp4.2.0を追加(だたし参照せず)-
効果検証 -okhttp4.2.0を追加(だたし参照せず)-okhttp4.2.0はKotlinで書かれてるので、JavaアプリにもKotlin Standard Libraryが含まれてサイズ大きくなった
効果検証 -okhttp4.2.0を追加(だたし参照せず)-参照はしてないからコンパイル時に削除され、アプリサイズはライブラリ入れる前と変わらず
圧縮がどのようにされるか
圧縮がどのようにされるか -コード圧縮-コード圧縮
圧縮がどのようにされるか -難読化-難読化(メソッド名が”a”に)
圧縮がどのようにされるか -最適化-最適化(inline化)
リフレクションに注意アウトプットが空オブジェクト
リフレクションに注意nameフィールドが使われてないからR8によって削除された※Gsonはリフレクション使っていてランタイムに動的に読まれる
リフレクションに注意nameフィールドを使うメソッドを呼び出すR8はnameフィールドが使われることが分かるので削除はしないが、難読化する
その他この他にも、動画内では1. 特定のクラスやメソッドを圧縮させない方法(リフレクション対策含む)2. 最適化の詳説(inliningについて)などが解説されています動画のリンクは↓↓↓https://www.youtube.com/watch?v=uQ_yK8kRCaA
参考資料● https://developer.android.com/studio/build/shrink-code● https://developer.android.com/studio/releases/?hl=ja#r8-default● https://jakewharton.com/r8-optimization-staticization/
Thank You