R8 を使用してアプリを圧縮、最適化し、高速化する
Android Performance Spotlight Week の初日へようこそ。
まず、アプリのパフォーマンスを改善するために最も効果的で、手間のかからない変更として、R8 オプティマイザーを完全モード で有効にすることから始めましょう。
R8 は、アプリのサイズを縮小するツールとしてすでにご存じかもしれません。R8 は、未使用のコードやリソースを削除してアプリのサイズを縮小するのに非常に役立ちます。しかし、R8 の真の力は、g-R8 が得意とするオプティマイザー としての機能にあります。
完全モードを有効にして最適化を許可すると、R8 はプログラム全体の詳細な最適化を実行し、コードを書き換えて根本的に効率を高めます。これは単なる微調整ではありません。
この記事を読んだら、YouTube で公開されている Performance Spotlight Week の R8 オプティマイザーの紹介動画をご覧ください。
R8 がアプリのパフォーマンスを向上させる仕組み
R8 オプティマイザーがアプリのパフォーマンスを向上させるために行う最も重要な手順に焦点を当ててみましょう。
アプリのサイズを縮小するうえで最も重要な手順はツリー シェイキング です。このフェーズでは、R8 オプティマイザーが、アプリが依存するライブラリから未使用のコードを削除するだけでなく、独自のコードベースからデッドコードも削除します。
メソッドのインライン化 では、メソッド呼び出しが実際のコードに置き換えられるため、実行時のパフォーマンスが向上します。
クラスのマージ などの手法を適用して、コードをよりコンパクトにします。インターフェースやクラス階層など、優れた抽象化は、この時点では重要ではなく、削除される可能性があります。
コードの縮小 は、クラス、フィールド、メソッドの名前を短く意味のないものに変更するために使用されます。たとえば、MyDataModel というクラスが a というクラスになることがあります。R8 で最適化されたアプリからスタック トレースを読み取るときに最も混乱を招くのはこの点です(AGP 9.0 で改善されました)。
不要なリソースの削除 では、xml ファイルやドローアブルなどの未使用のリソースを削除することで、アプリのサイズをさらに縮小します。
R8 オプティマイザーは、これらの手順を適用することで、アプリの起動時間 を短縮し、UI レンダリングをスムーズ にし、低速なフレームやフリーズしたフレームを減らし、デバイス上のリソース使用量を全体的に改善します。
ケーススタディ: R8 による Reddit のパフォーマンスの改善
R8 によって実現できるパフォーマンスの改善の例として、Reddit の例を見てみましょう。完全モードで R8 を有効にした後、Android 版 Reddit アプリでは、さまざまな分野でパフォーマンスが大幅に改善されました。
キャプション: R8 が Reddit のアプリのパフォーマンスを改善した方法
チームは、コールド スタートアップの 40% の高速化、「アプリケーション応答なし」(ANR)エラーの 30% の削減、フレーム レンダリングの 25% の改善、アプリサイズの 14% の削減 を確認しました。
これらの改善は、ユーザー満足度にとって非常に重要です。起動が速くなると、待ち時間が短縮され、コンテンツにすばやくアクセスできるようになります。ANR が減ると、アプリの安定性と信頼性が向上し、ユーザーの不満が軽減されます。フレーム レンダリングがスムーズになると、UI のジャンプがなくなり、スクロールやアニメーションがスムーズでレスポンシブになります。この技術的なプラスの効果は、ユーザーの感情にも明確に表れていました。
改善について詳しくは、Google のブログをご覧ください。
R8 を使用することによる技術以外の効果
パートナーとの協力により、これらの技術的な改善がユーザー満足度に直接影響し、ユーザー維持、エンゲージメント、セッション時間に反映されることがわかりました。ユーザーのロイヤリティ(1 日、1 週間、または 1 か月のアクティブ ユーザー数で測定可能)も、技術的なパフォーマンスの向上によってプラスの影響を受けています。また、Google Play ストアでのアプリの評価は、R8 の導入と相関して上昇しています。この情報をプロダクト オーナー、CTO、意思決定者と共有することで、アプリのパフォーマンスを迅速に改善できます。
つまり、意図的なパフォーマンスの最適化は美徳 と言えます。
パフォーマンスの高いアプリへのガイド
R8 のデベロッパー ガイドを改善する必要があるというご意見をいただきました。そこで、Google は改善に取り組みました。R8 オプティマイザーのデベロッパー ガイドは、より実践的になり、R8 の有効化とデバッグに関する包括的なガイダンスを提供しています。
このドキュメントでは、導入のハイレベルな戦略について説明し、最適化に適したライブラリを選択することの重要性と、安定性を確保するために R8 の機能を段階的に導入することの重要性を強調しています。この段階的なアプローチにより、R8 のメリットを安全に活用できるとともに、デバッグが難しい問題に関するガイダンスも提供されます。
R8 オプティマイザーを制御する主なメカニズムである Keep ルールに関するガイダンスを大幅に拡充しました。Keep ルールとは何か、適用方法、作成と維持に関するベスト プラクティスについて説明するセクションを追加しました。また、実践的で実用的なユースケースと例を提供し、リフレクションや JNI ネイティブ インターフェースの使用など、実行時に必要なコードが R8 によって削除されないようにする方法を理解できるようにしています。
このドキュメントでは、重要なフォローアップ手順と高度なシナリオについても説明しています。テストとトラブルシューティングに関するセクションを追加し、パフォーマンスの向上を確認し、発生する可能性のある問題をデバッグできるようにしました。高度な構成に関するセクションでは、特定のビルド バリアントをターゲットにする方法、保持または削除するリソースをカスタマイズする方法について説明し、ライブラリ作成者向けの特別な最適化手順を提供しています。これにより、他のデベロッパーが使用できる最適化された R8 対応パッケージを提供できます。
R8 オプティマイザーの可能性を最大限に引き出す
Android Gradle プラグインのバージョン 8.0 以降、R8 オプティマイザーはデフォルトで「完全モード」を使用します。プロジェクトが長年にわたって開発されている場合は、無効にするレガシー フラグがまだ含まれている可能性があります。gradle.properties ファイルでこの行を確認して削除してください。
android.enableR8.fullMode=false // delete this line to enable R8's full potential
次に、リリース バリアントのアプリの build.gradle.kts ファイルで R8 を有効にしているかどうかを確認します。isMinifyEnabled と isShrinkResources を true に設定すると有効になります。このステップで、デフォルトの構成ファイルとカスタム構成ファイルを渡すこともできます。
release {
isMinifyEnabled = true
isShrinkResources = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"keep-rules.pro"
)
}
ケーススタディ: Disney+ のパフォーマンスの改善
Disney+ のエンジニアは、アプリのパフォーマンスに投資し、アプリのユーザー エクスペリエンスを最適化しています。一見すると小さな変更でも、大きな影響を与えることがあります。R8 の構成を調べていたところ、-dontoptimize フラグが使用されていることがわかりました。これは、デフォルトの構成ファイルによって導入されたもので、現在でも多くのアプリで使用されています。
proguard-android.txt を proguard-android-optimize.txt に置き換えた後、Disney+ チームはアプリのパフォーマンスが大幅に改善されました。
この変更を含むアプリの新しいバージョンがユーザーにロールアウトされた後、Disney+ ではアプリの起動が 30% 高速化し、ユーザーが認識する ANR が 25% 減少しました。
現在でも多くのアプリで、-dontoptimize フラグを含む proguard-android.txt ファイルが使用されています。そこで、ツールを改善しました。
ツールサポート
Android Studio Narwhal 3 Feature Drop 以降、lint の警告が表示されます。proguard-android.txt
AGP 9.0 以降では、このファイルのサポートを完全に終了 します。つまり、proguard-android-optimize.txt に移行する必要があります。
また、R8 で最適化されたコードのデバッグをこれまで以上に簡単にするために、Android Studio の新機能 にも投資しました。AGP 9.0 以降では、Android Studio の Logcat 内のスタック トレースを R8 で処理されたビルドに対して自動的に難読化解除できるようになり、完全に最適化されたアプリでも、問題の原因となっているコード行を正確に特定できます。これについては、明日の Android Performance Spotlight Week のブログ投稿で詳しく説明します。
対処方法
YouTube で公開されている Performance Spotlight Week の R8 オプティマイザーの紹介動画をご覧ください。
📣 パフォーマンス チャレンジに参加しましょう!
ご自身の目で特典をご確認ください。
今日から、アプリで R8 完全モードを有効にすることをおすすめします。__
- デベロッパー ガイドに沿って、 アプリの最適化を有効にします。
-
proguard-android.txtをまだ使用しているかどうかを確認し、使用している場合はproguard-android-optimize.txtに置き換えます。 - 次に、影響を測定 します。違いを実感するだけでなく、確認してください。 GitHub の Macrobenchmark サンプルアプリのコードを調整して、起動時間を測定し、パフォーマンスの向上を測定します。
アプリのパフォーマンスが大幅に改善されると確信しています。R8 の有効化やトラブルシューティングに関するご質問は、#optimizationEnabled を使用してください。Google がお手伝いいたします。
金曜日の Ask Android セッションで質問をお寄せください
パフォーマンスに関する質問は、ソーシャル タグ #AskAndroid を使用してください。11 月 21 日(金)のパフォーマンスに関する Ask Android セッションで、いただいた質問にいくつか回答します。明日は、デバッグとトラブルシューティングについてさらに詳しく説明します。まずは R8 を使ってみて、アプリを高速化しましょう。
続きを読む
-
イベントとプログラム
R8 オプティマイザーとプロファイル ガイド付き最適化の基本的な機能から、Jetpack Compose によるパフォーマンスの改善、アプリのパフォーマンスを向上させるための新しいガイドまで、パフォーマンスの高いアプリを構築するために必要な、手間をかけずに大きな効果を得られるツールについて説明しました。
Ben Weiss, Sara Hamilton • 所要時間: 3 分
-
イベントとプログラム
Google I/O のスケジュールはこちらです。
所要時間: 1 分
-
イベントとプログラム
昨年 9 月、Google は、ゲームの成功を促進する最善の方法は、世界クラスのプレーヤー エクスペリエンスを提供することであるという信念に基づいた、Google Play Games の将来のビジョンを発表しました。
Maru Ahues Bouza • 所要時間: 3 分
メールを受け取る
Android 開発に関する最新の分析情報を毎週メールでお届けします。