イベントとプログラム

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

所要時間: 5 分
Ben Weiss のプロフィールを表示
Ben Weiss デベロッパー リレーション エンジニア

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

Android Performance Spotlight Week の 1 日目へようこそ。

まず、アプリのパフォーマンスを改善するために、最も効果が高く、手間のかからない変更、つまり R8 オプティマイザーをフルモードで有効にすることから始めましょう。

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

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

この記事を読んだら、YouTube で R8 オプティマイザーを紹介する Performance Spotlight Week をご覧ください。

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

image.png

アプリのパフォーマンスを向上させるために R8 オプティマイザーが実行する最大のステップに注目してみましょう。

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

メソッドのインライン化では、メソッド呼び出しを実際のコードに置き換えることで、ランタイム パフォーマンスを向上させます。

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

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

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

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

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

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

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 オプティマイザーの機能を最大限に活用する

R8 オプティマイザーは、Android Gradle プラグインのバージョン 8.0 以降、デフォルトで「フルモード」を使用します。プロジェクトが長年にわたって開発されている場合は、無効にするためのレガシー フラグがまだ含まれている可能性があります。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+ チームはアプリのパフォーマンスが大幅に向上したことを確認しました。

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 に移行する必要があります。

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

次のステップ

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

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

ぜひご自身でメリットをご確認ください。

今すぐアプリで R8 フルモードを有効にしてみてください。

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

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

金曜日の Ask Android セッションで質問する

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

作成者:
続きを読む