今日のモバイルアプリの世界では、シームレスなユーザー エクスペリエンスは単なる機能ではなく、必要不可欠なものです。読み込み時間の遅さ、応答しないインターフェース、不安定さは、ユーザー エンゲージメントとユーザー維持の大きな障壁となる可能性があります。Reddit のエンジニアリング チームは、Android デベロッパー リレーション チームとの共同作業で、Reddit の アプリのパフォーマンス スコアを使用してアプリを評価しました。パフォーマンスを評価した結果、大幅な改善の可能性があることを特定し、Android アプリ オプティマイザである R8 の機能を最大限に活用するための手順を実施することにしました。この集中的な取り組みにより、起動時間の短縮、低速またはフリーズしたフレームと ANR の削減、Google Play ストアの評価の全体的な向上という目覚ましい成果が得られました。この事例紹介では、Reddit がどのようにしてこれらの素晴らしい成果を達成したのかを詳しく説明します。
R8 オプティマイザが Reddit に役立った方法
R8 オプティマイザは、Android でのパフォーマンス最適化の基盤となるツールです。アプリのパフォーマンスを改善するためにさまざまな手順を実行します。最も影響力の大きい手順を簡単に見てみましょう。
- ツリー シェイキング は、アプリのサイズを削減するための最も重要な手順です。ここでは、アプリの依存関係とアプリ自体から未使用のコードが削除されます。
- メソッドのインライン化 では、メソッド呼び出しが実際のコードに置き換えられるため、アプリのパフォーマンスが向上します。
- クラスのマージ などの手法を適用して、コードをよりコンパクトにします。この時点では、ソースコードの人間による可読性ではなく、コンパイルされたコードを高速に動作させることが重要になります。そのため、インターフェースやクラス階層などの抽象化はここでは重要ではなく、削除されます。
- 識別子の最小化 では、クラス、フィールド、メソッドの名前が短く意味のない名前に変更されます。そのため、
MyDataModelの代わりに a というクラスになることがあります。 - リソースの圧縮 では、xml ファイルやドローアブルなどの未使用のリソースが削除され、アプリのサイズがさらに削減されます。
R8 最適化の主な段階
ハードデータからユーザー満足度へ: 本番環境での成功の特定
Reddit では、アプリの新しいバージョンがユーザーにロールアウトされた直後に、パフォーマンスの結果が改善されました。Reddit は Android Vitals と Crashlytics を使用して、実際のユーザーが使用する実際のデバイスでパフォーマンス指標をキャプチャし、新しいリリースを以前のバージョンと比較することができました。
R8 が Reddit のアプリのパフォーマンスを改善した方法
チームは、コールド スタートアップが 40% 高速化、「アプリケーション応答なし」(ANR)エラーが 30% 削減、フレーム レンダリングが 25% 改善、アプリのサイズが 14% 削減されたことを確認しました。
これらの改善は、ユーザー満足度にとって非常に重要です。起動が速くなると、待ち時間が短縮され、コンテンツにすばやくアクセスできるようになります。ANR が減ると、アプリの安定性と信頼性が向上し、ユーザーの不満が軽減されます。フレーム レンダリングがスムーズになると、UI のジャンプが解消され、スクロールやアニメーションがスムーズでレスポンシブになります。この技術的なプラスの影響は、ユーザーの感情にも明確に表れていました。
最適化の成功を示すユーザー満足度指標は、Google Play ストアで直接確認できました。R8 で最適化されたバージョンのロールアウト後、チームはユーザーの感情とエンゲージメントが劇的にプラスに変化したことを確認しました。
Drew Heavner: 「R8 の潜在能力を最大限に引き出すツールを 2 週間未満で実現」
最も印象的だったのは、集中的な取り組みでこれを達成したことです。この取り組みに携わった Reddit のスタッフ ソフトウェア エンジニアである Drew Heavner 氏は、R8 の潜在能力を最大限に引き出すための変更の実装に2 週間もかからなかった と述べています。
成果の確認: マクロベンチマークによる詳細な分析
実際の環境での大幅な改善を確認した後、Reddit のエンジニアリング チームと Google の Android デベロッパー リレーション チームは、詳細なベンチマークを実施して成果を科学的に確認し、さらなる最適化を試しました。この分析では、Reddit のエンジニアリング チームがアプリの 2 つのバージョンを提供しました。1 つは最適化されていないバージョン、もう 1 つは R8 と、ベースライン プロファイル と 起動プロファイル という 2 つの基盤となるパフォーマンス最適化ツールを適用したバージョンです。
ベースライン プロファイルを使用すると、ジャストインタイム(JIT)コンパイルの手順をユーザー デバイスからデベロッパー マシンに効果的に移行できます。生成された事前(AOT)コンパイル済みコードは、起動時間とレンダリングの問題の両方を軽減することが証明されています。
アプリがパッケージ化されると、d8 dexer はクラスとメソッドを取得し、アプリの classes.dex ファイルを構築します。ユーザーがアプリを開くと、これらの dex ファイルが読み込まれ、アプリが起動するまで順番に読み込まれます。起動プロファイル を指定すると、最初の 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 以上削減されました。
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 rulesで宣言して、R8 が変更すべきでないコードの部分を指定する必要があります。
アプリで Reddit の例を参考にしてください
R8 での Reddit の成功は、アプリのパフォーマンスに大きな影響を及ぼしたいと考えている開発チームにとって、労力をかけずに大きな影響を与えることができる強力な事例となります。技術的な改善とそれに伴うユーザー満足度の向上との直接的な相関関係は、パフォーマンスの最適化の価値を明確に示しています。
この事例紹介で説明したブループリント(アプリのパフォーマンス スコアなどのツールを使用して機会を特定し、R8 の最適化の可能性を最大限に引き出し、実際のデータをモニタリングし、ベンチマークを使用して確認と理解を深める)に従うことで、他のデベロッパーも同様の成果を達成できます。
自分のアプリで R8 を使い始めるには、R8 オプティマイザの有効化、構成、トラブルシューティングに関する最新の公式ドキュメントとガイダンスをご覧ください。
続きを読む
-
事例紹介
Monzo は英国のデジタルバンクで、顧客数は 1,500 万人に増えています。アプリが拡大するにつれて、エンジニアリング チームはアプリの起動時間を改善すべき重要な領域として特定しましたが、コードベースに大幅な変更が必要になることを懸念していました。
Ben Weiss, Tracy Agyemang • 所要時間: 2 分
-
事例紹介
FotMob では最近、インストール済みユーザーの間で Wear OS の 1 日あたりの増加数が過去 5 年間で最大となり、1 日の平均の 2 ~ 3 倍になりました。その秘密とは?ユーザーがスマートフォンから Wear OS アプリを直接見つけられるシンプルなクロスデバイス インストール フローです。
Garan Jenkin • 所要時間: 3 分
-
事例紹介
マインドフルネス アプリ Gratitude は、毎日のマイクロ ジャーナリング、アファメーション、ビジョン ボードを通じて一貫性を高めます。このアプリは 600 万回以上ダウンロードされ、5 つ星の評価は 15 万件、ジャーナル エントリは 1 億件記録されています。
Amrit Sanjeev, Ash Nohe • 所要時間: 3 分
最新情報の入手
Android 開発に関する最新の分析情報を毎週メールでお届けします。