イベントとプログラム

R8 を使用してアプリを圧縮、最適化し、高速化する

所要時間: 5 分
Ben Weiss
デベロッパー リレーション エンジニア

R8 を使用してアプリを圧縮、最適化し、高速化する

Android パフォーマンス スポットライト ウィークの初日へようこそ。

まず、アプリのパフォーマンスを改善するために最も効果的で、手間のかからない変更として、フルモードで R8 オプティマイザーを有効にする方法をご紹介します。

R8 は、アプリのサイズを縮小するツールとしてすでにご存じかもしれません。未使用のコードやリソースを削除し、アプリのサイズを縮小するのに非常に役立ちます。しかし、その真の力、つまり g-R8 の真の力は、オプティマイザーとしての力です。

フルモードを有効にして最適化を許可すると、R8 はプログラム全体の詳細な最適化を実行し、コードを書き換えて根本的に効率を高めます。これは単なる微調整ではありません。

この記事を読んだら、YouTube で R8 オプティマイザーのパフォーマンス スポットライト ウィークの紹介動画をご覧ください。

R8 がアプリのパフォーマンスを向上させる仕組み

image.png

R8 オプティマイザーがアプリのパフォーマンスを向上させるために行う主なステップについて説明します。

ツリー シェイキングは、アプリのサイズを縮小するうえで最も重要なステップです。このフェーズでは、R8 オプティマイザーが、アプリが依存するライブラリから未使用のコードを削除し、独自のコードベースからデッドコードを削除します。

メソッドのインライン化では、メソッド呼び出しが実際のコードに置き換えられ、実行時のパフォーマンスが向上します。

クラスの統合などの戦略を適用して、コードをよりコンパクトにします。インターフェースやクラス階層などの美しい抽象化は、この時点では重要ではなく、削除される可能性があります。

コードの最小化は、クラス、フィールド、メソッドの名前を短く意味のないものに変更するために使用されます。そのため、MyDataModel の代わりに a というクラスが作成されることがあります。これは、R8 で最適化されたアプリのスタック トレースを読み取る際に最も混乱を招く原因となっています(なお、AGP 9.0 でこの点が改善されています)。

不要なリソースの削除では、xml ファイルやドローアブルなどの未使用のリソースを削除することで、アプリのサイズをさらに縮小します。

これらのステップを適用することで、R8 オプティマイザーはアプリの起動時間を短縮し、UI レンダリングをスムーズにし、遅延やフリーズするフレームを減らし、デバイス上のリソース使用量を全体的に改善します。

ケーススタディ: R8 による Reddit のパフォーマンス改善

R8 によってパフォーマンスが向上する例として、Reddit の例を見てみましょう。Reddit for Android アプリでは、R8 をフルモードで有効にした後、さまざまな領域でパフォーマンスが大幅に向上しました。

image.png

キャプション: R8 が Reddit のアプリのパフォーマンスをどのように改善したか

チームは、コールド スタートアップの 40% の高速化「アプリケーション応答なし」(ANR)エラーの 30% の削減フレーム レンダリングの 25% の改善アプリサイズの 14% の削減を確認しました。

これらの機能強化は、ユーザー満足度を高めるうえで非常に重要です。起動が速いほど、待ち時間が短縮され、コンテンツにすばやくアクセスできます。ANR が減ると、アプリの安定性と信頼性が向上し、ユーザーの不満が軽減されます。フレーム レンダリングがスムーズになることで、UI のジャンクが解消され、スクロールやアニメーションが滑らかでレスポンシブになります。この技術的なプラスの影響は、ユーザーの感情にも明確に表れていました。

改善点について詳しくは、ブログをご覧ください。

R8 を使用することによる技術面以外の影響

パートナーとの取り組みの中で、こうした技術的な改善がユーザーの満足度に直接影響し、ユーザー維持率、エンゲージメント、セッションの長さに反映されることがわかりました。ユーザーのロイヤリティ(1 日、1 週間、1 か月のアクティブ ユーザー数で測定可能)も、技術的なパフォーマンスの向上によってプラスの影響を受けています。また、R8 の導入と相関して、Google Play ストアでのアプリの評価が上昇していることも確認されています。この情報をプロダクト オーナー、CTO、意思決定者と共有することで、アプリのパフォーマンスを向上させることができます。

image.png

意図的なパフォーマンスの最適化は美徳です。

パフォーマンスの高いアプリへのガイド

R8 のデベロッパー ガイドを改善する必要があるというご意見をいただきました。そこで、私たちは取り組みを開始しました。R8 オプティマイザーのデベロッパー ガイダンスが大幅に改善され、R8 の有効化とデバッグに関する包括的なガイダンスが提供されるようになりました。

このドキュメントでは、採用のハイレベルな戦略について説明します。最適化に適したライブラリを選択することの重要性と、安定性を確保するために R8 の機能を段階的に採用することの重要性を強調しています。この段階的なアプローチにより、R8 のメリットを安全に活用しながら、デバッグが難しい問題に関するガイダンスを得ることができます。

R8 オプティマイザーを制御するための主要なメカニズムである 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.txtproguard-android-optimize.txt に置き換えた後、Disney+ チームはアプリのパフォーマンスが大幅に向上したことを確認しました。

image.png

この変更を含むアプリの新しいバージョンをユーザーにリリースした後、Disney+ ではアプリの起動が 30% 速くなり、ユーザーが認識した ANR が 25% 減少しました。

現在、多くのアプリが -dontoptimize フラグを含む proguard-android.txt ファイルを使用しています。そこで、ツールを改善する取り組みが重要になります。

ツールサポート

Android Studio Narwhal 3 Feature Drop 以降では、proguard-android.txt を使用すると lint 警告が表示されます。

image.png

AGP 9.0 以降では、このファイルのサポートは完全に終了します。つまり、proguard-android-optimize.txt に移行する必要があります。

また、Android Studio の新機能にも投資し、R8 で最適化されたコードのデバッグをこれまで以上に容易にしました。AGP 9.0 以降では、Android Studio の Logcat 内で R8 処理されたビルドのスタック トレースを自動的に難読化解除できるようになりました。これにより、完全に最適化されたアプリでも、問題の原因となっているコードの行を正確に特定できます。この点については、明日公開される Android パフォーマンス スポットライト ウィークのブログ投稿で詳しく説明します。

対処方法

YouTube で、パフォーマンス Spotlight Week の R8 オプティマイザーの紹介をご覧ください。

📣 パフォーマンス チャレンジに参加しましょう

ご自身の目で特典をご確認ください。

アプリで R8 フルモードを今すぐ有効にすることをおすすめします。

  1. デベロッパー ガイド( アプリの最適化を有効にする)に沿って操作します。
  2. proguard-android.txt をまだ使用しているかどうかを確認し、proguard-android-optimize.txt に置き換えます。
  3. 次に、効果を測定します。違いを感じ取るだけでなく、検証しましょう。 GitHub の Macrobenchmark サンプルアプリのコードを適応させて、起動前後の起動時間を測定し、パフォーマンスの向上を測定します。

アプリのパフォーマンスが大幅に改善されると確信しています。R8 の有効化やトラブルシューティングに関する質問は、#optimizationEnabled を使用してください。Google がお手伝いいたします。

金曜日の Ask Android セッションで質問をしましょう

パフォーマンスに関する質問は、ソーシャル タグ #AskAndroid を使用して投稿してください。1 週間を通して皆様からの質問をモニタリングし、11 月 21 日(金)のパフォーマンスに関する Ask Android セッションでいくつかの質問にお答えします。明日は、デバッグとトラブルシューティングについてさらに詳しく説明します。まずは R8 を使って、アプリを高速化しましょう。

作成者:

続きを読む