イベントとプログラム

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

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

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

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

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

R8 は、アプリのサイズを縮小するツールとしてご存じかもしれません。R8 は、未使用のコードやリソースを削除してアプリのサイズを縮小するのに非常に優れています。しかし、R8 の真の力は、g-R8 が得意とするオプティマイザー としての機能にあります。

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

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

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 のジャンプが解消され、スクロールやアニメーションがスムーズでレスポンシブになります。この技術的なプラスの効果は、ユーザーの感情にも明確に表れています。

改善の詳細については、Google のブログをご覧ください

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

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

image.png

つまり、意図的なパフォーマンスの最適化は美徳 と言えます。

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

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.txtproguard-android-optimize.txt に置き換えた後、Disney+ チームはアプリのパフォーマンスが大幅に改善されました。

image.png

この変更を含むアプリの新しいバージョンがユーザーにロールアウトされた後、Disney+ ではアプリの起動が 30% 高速化され、ユーザーが認識する ANR が 25% 減少しました。

現在でも多くのアプリで、-dontoptimize フラグを含む proguard-android.txt ファイルが使用されています。そこで、ツールを改善しました。

ツールサポート

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

image.png

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 完全モードを有効にすることをおすすめします。__

  1. デベロッパー ガイドに沿って、 アプリの最適化を有効にします。
  2. proguard-android.txt をまだ使用している場合は、proguard-android-optimize.txt に置き換えます。
  3. 次に、影響を測定 します。違いを実感するだけでなく、確認してください。 GitHub の Macrobenchmark サンプルアプリ のコードを調整して、起動時間を測定し、パフォーマンスの向上を測定します。

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

金曜日の Ask Android セッションで質問をお寄せください

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

作成者:
続きを見る