事例紹介

Reddit が R8 オプティマイザーを使用してパフォーマンスを大幅に改善した方法

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

今日のモバイルアプリの世界において、シームレスなユーザー エクスペリエンスは単なる機能ではなく、不可欠なものです。読み込み時間が遅い、インターフェースが応答しない、不安定であるといった問題は、ユーザー エンゲージメントとユーザー維持の大きな障壁となります。Reddit のエンジニアリング チームは、Android デベロッパー リレーションズ チームと協力して、アプリ パフォーマンス スコアを使用してアプリを評価しました。アプリのパフォーマンスを評価した結果、大幅な改善の余地があることが判明したため、Android アプリ オプティマイザーである R8 の機能を最大限に活用するための手順を実施することにしました。この集中的な取り組みにより、起動時間が大幅に短縮され、遅いフレームやフリーズしたフレーム、ANR が減少し、Google Play ストアでの評価が全体的に向上しました。このケーススタディでは、Reddit がどのようにしてこれらの素晴らしい成果を達成したかを詳しく説明します。

R8 Optimizer が Reddit にもたらした効果

R8 Optimizer は、Android でのパフォーマンス最適化の基盤となるツールです。アプリのパフォーマンスを改善するには、さまざまな手順が必要です。最も効果的な手順を簡単に見てみましょう。

  • ツリー シェイキングは、アプリのサイズを縮小するうえで最も重要なステップです。ここでは、アプリの依存関係とアプリ自体から未使用のコードが削除されます。
  • メソッドのインライン化では、メソッド呼び出しを実際のコードに置き換えることで、アプリのパフォーマンスを向上させます。
  • クラスの統合などの戦略を適用して、コードをよりコンパクトにします。この時点では、ソースコードの人間による可読性ではなく、コンパイルされたコードを高速に動作させることが重要になります。そのため、インターフェースやクラス階層などの抽象化はここでは重要ではなく、削除されます。
  • 識別子の難読化では、クラス、フィールド、メソッドの名前を、より短く意味のない名前に変更します。そのため、MyDataModel ではなく、a というクラスになる可能性があります。
  • リソース圧縮では、XML ファイルやドローアブルなどの未使用のリソースを削除して、アプリのサイズをさらに削減します。
image.png

R8 による最適化の主なステージ

ハードデータからユーザー満足度まで: 本番環境での成功を特定する

Reddit は、アプリの新しいバージョンをユーザーにリリースした直後に、パフォーマンスの改善を確認しました。Reddit は、Android Vitals と Crashlytics を使用して、実際のユーザーが使用する実際のデバイスでパフォーマンス指標をキャプチャし、新しいリリースを以前のバージョンと比較することができました。

image.png

R8 が Reddit のアプリのパフォーマンスを改善した方法

その結果、コールド スタートアップが 40% 高速化し、「アプリケーション応答なし」(ANR)エラーが 30% 減少、フレーム レンダリングが 25% 改善、アプリサイズが 14% 縮小しました。

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

最適化の成功を示すユーザー満足度の指標は、Google Play ストアに直接表示されました。R8 で最適化されたバージョンをリリースした後、ユーザーの感情とエンゲージメントに劇的かつ好ましい変化が見られました。

image.png

Drew Heavner: 「R8 の可能性を最大限に引き出すツールを 2 週間未満で実現」

最も印象的なのは、この成果が、集中的な取り組みによって達成されたことです。この取り組みに携わった Reddit のスタッフ ソフトウェア エンジニアである Drew Heavner 氏は、R8 の可能性を最大限に引き出すための変更の実装に要した期間は 2 週間未満だったと述べています。

効果の確認: マクロベンチマークによる特集

Reddit のエンジニアリング チームと Google の Android デベロッパー リレーションズ チームは、実際の改善効果を確認した後、詳細なベンチマークを実施して、改善効果を科学的に検証し、さらなる最適化を試みました。この分析のために、Reddit のエンジニアリング チームは、最適化されていないバージョンと、R8、ベースライン プロファイル、スタートアップ プロファイルという 2 つの基本的なパフォーマンス最適化ツールを適用したバージョンの 2 つのアプリを提供しました。

ベースライン プロファイルは、ジャストインタイム(JIT)コンパイルの手順をユーザー デバイスから開発マシンに効果的に移行します。生成された AOT(Ahead Of Time)コンパイル済みコードは、起動時間とレンダリングの問題を同様に軽減することが実証されています。

アプリがパッケージ化されると、d8 dexer がクラスとメソッドを取得し、アプリの classes.dex ファイルを構築します。ユーザーがアプリを開くと、これらの dex ファイルが、アプリが起動できるようになるまで 1 つずつ読み込まれます。スタートアップ プロファイルを提供することで、最初の classes.dex ファイルにパックするクラスとメソッドを d8 に知らせることができます。この構造により、アプリが読み込むファイルが少なくなり、起動速度が向上します。

このフェーズの中核となるツールは Jetpack Macrobenchmark で、管理された環境でユーザー インタラクションを正確に測定できます。一般的なユーザー ジャーニーをシミュレートするために、UIAutomator API を使用して、アプリを開き、3 回下にスクロールしてから上にスクロールするテストを作成しました。

最終的に、ベンチマークを作成するために必要だったのは、次のコードだけでした。

uiAutomator {

  startApp(REDDIT)

  repeat(3) {

    onView { isScrollable }.fling(Direction.DOWN) }

  repeat(3) {

    onView {isScrollable }.fling(Direction.UP)

  }

}

ベンチマーク データは、現場での観察結果を裏付け、より深い分析情報を提供しました。完全に最適化されたアプリは起動が 55% 速くなり、ユーザーは 18% 早くブラウジングを開始できるようになりました。最適化されたアプリでは、実行時コンパイル(JIT)の発生が 3 分の 2 減少し、JIT コンパイル時間が 3 分の 1 減少しました。フレーム レンダリングが改善され、ベンチマーク対象のユーザー ジャーニーでレンダリングされるフレームが 19% 増加しました。最終的に、アプリのサイズは 3 分の 1 以上削減されました。

image.png

Reddit の全体的なパフォーマンスの向上

JIT コンパイル時間は、次のようにカスタム Macrobenchmark トレース セクション指標を使用して測定できます。

val jitCompilationMetric = TraceSectionMetric("JIT Compiling %", label = "JIT compilation")

変革を支えるテクノロジー: R8

R8 をフルモードで有効にするには、リリースビルド タイプで minifyEnabled と shrinkResources を true に設定して、app/build.gradle.kts ファイルを構成します。

android {

    ...

    buildTypes {

        release {

            isMinifyEnabled = true

            isShrinkResources = true

            proguardFiles(

                getDefaultProguardFile("proguard-android-optimize.txt"),

                "keep-rules.pro",

            )

        }

    }

}

このステップの後に、エンドツーエンドの包括的なテストを行う必要があります。パフォーマンスの最適化によって望ましくない動作が発生する可能性があるため、ユーザーが気付く前に発見することをおすすめします。

この記事で前述したように、R8 はパフォーマンスのメリットを最大限に高めるために、広範な最適化を実行します。R8 は、クラス、フィールド、メソッドの名前の変更、移動、削除など、コードに大幅な変更を加えます。これらの変更によってエラーが発生する場合は、keep ルールで宣言して、R8 が変更すべきでないコードの部分を指定する必要があります。

Reddit の例をアプリに適用する

Reddit の R8 での成功は、アプリのパフォーマンスに大きな影響を少ない労力で与えたいと考えている開発チームにとって、強力なケーススタディとなります。技術的な改善と、それに続くユーザー満足度の向上との間に直接的な相関関係があることは、パフォーマンス最適化の価値を裏付けています。

このケーススタディで紹介したブループリントに沿って、アプリ パフォーマンス スコアなどのツールを使用して改善の機会を特定し、R8 の最適化機能を最大限に活用し、実際のデータをモニタリングし、ベンチマークを使用して理解を深め、確認することで、他のデベロッパーも同様の成果を上げることができます。

独自のアプリで R8 を使い始めるには、R8 オプティマイザーの有効化、構成、トラブルシューティングに関する、更新されたばかりの公式ドキュメントとガイダンスをご覧ください。

作成者:
続きを読む