Tinder は、新しい世代の独身者が簡単かつ楽しく出会えるようにすることで、真のつながりを促進し、刺激を与えることを使命としています。しかし、Android アプリのコードベースのサイズが大きくなるにつれて、複雑さも増していきました。最新の最適化作業を行う前は、アプリの約 70% が最適化されておらず、17 個の dex ファイル(起動専用の 3 個を含む)が使用されていました。R8 を有効にしていたものの、最適化の可能性の多くが Keep ルールによってブロックされており、チームはどのルールが最適化を妨げているのかを特定できませんでした。起動時間を短縮し、ユーザーが認識したアプリケーション応答なし(ANR)エラーを減らすため、Tinder は新しい R8 Configuration Analyzer を使用してこれらの課題に取り組みました。
Tinder は、R8 構成アナライザを活用して、意図しない最適化の阻害要因を特定して削除することに成功しました。その結果、アプリのコールド スタートが 47% 削減され、アプリのダウンロード サイズが 28.98% 縮小(61.5 MB まで削減)され、ユーザーが認識した ANR が 28% 削減されるなど、すぐに大きな効果が現れました。
構成アナライザ
R8 構成アナライザは、圧縮、最適化、難読化のスコアをトラッキングして、改善可能な領域を示すことで、R8 の最適化を表示します。外部ライブラリのルールを含む、広範な、冗長な、または廃止された保持ルールが表示されるため、保持ルールの影響を分析して保持ルールを改良できます。
Configuration Analyzer に表示される主な指標は次のとおりです。
- 縮小化スコア: R8 縮小化が可能なコードの割合。
- 最適化スコア: 最適化の対象となるコードの割合(メソッドのインライン化、水平クラスの統合など)。
- 難読化スコア: サイズを縮小するために R8 で名前を変更できるクラス、メソッド、フィールドの割合。
アナライザを使用して、保持ルールとその影響を監査します。
- 広範なルールを特定する: R8 の最適化を制限するパッケージ全体のルールの範囲を絞り込み、圧縮、最適化、難読化から除外される特定のクラス、メソッド、フィールドを特定します。
- ルールを絞り込む: リフレクションを必要とする特定のクラス/メソッドのみをターゲットにして、最適化を可能にします。
- 冗長なルールを削除する: 現在のビルドでクラス、メソッド、フィールドに一致しないルールを削除します。
- 同一のルール: 同一の keep ルールとは、同じクラス、フィールド、メソッドをターゲットとするルール、または同じ keep ルールファイル内または複数の keep ルールファイル間で重複する keep ルールの宣言を指します。
- 包含ルールを検出する: より広範な構成ですでにカバーされている特定のルールをクリーンアップします。
- 問題のあるライブラリを特定する: すべてのライブラリからマージされたコンシューマーの keep ルールが最適化に与える影響を、全体として確認します。
エージェント ツールで R8 構成アナライザを使用できるように、R8 Analyzer スキルを公開しました。このスキルは、R8 構成アナライザー レポートを要約して、最適化、難読化、縮小化のスコアなどの主要な指標を表示することで、自動化された開発ワークフローを最適化します。また、最も影響の大きい 5 つの keep ルールがハイライト表示されるため、コードの最適化を妨げている要因を明確に把握できます。
最適化を妨げる隠れた要因を特定する
R8 構成アナライザを統合する前、Tinder の Android アプリは、コードベースが大幅に最適化されていないため、技術的負債が大きくなっていました。この最適化の欠如がユーザー エクスペリエンスの低下に直結し、ユーザーはコールド スタートの遅さを経験することになりました。
これらの問題を解決するため、Tinder チームは R8 構成アナライザを使用して R8 構成を包括的に監査しました。アナライザーによると、R8 フルモードでも、コードベースの R8 最適化は約 28% でした。Tinder は、R8 Configuration Analyzer を使用して、社内ライブラリが広範でスコープが設定されていない keep ルールを導入していることを特定しました。
# Prevents optimization in all public classes along with all of their public and protected members -keep public class * { public protected *; }
この「広範な」ルールは、アプリ全体にわたるさまざまな依存関係を意図せずカバーしていたため、多数のクラスで最適化が妨げられていました。過度に包括的なルールによって実行時のクラッシュが防止されていたため、デベロッパーはリフレクションを使用する新機能の新しいルールを追加し忘れることが多く、隠れた問題が時間の経過とともに蓄積されていました。
R8 Configuration Analyzer が提供する分析情報を活用することで、チームはライブラリの広範な keep ルールの影響を受ける特定のクラスを追跡して分析することに成功しました。チームはすぐに、R8 が最適化できる、動的に呼び出されない大規模なクラスで最適化がブロックされていることを発見しました。この特定の keep ルールを改良することで、Tinder は大幅な最適化機能を実現し、以前の構成を整理して、全体的な最適化の数値を大幅に改善することができました。R8 スコアは 28% から 50% に上昇し、アプリ全体のパフォーマンスがすぐに向上しました。Tinder チームは、この数値をさらに改善するために積極的に取り組んでいます。
- 読み込みの高速化: アプリのコールド スタートが遅いユーザーの割合が 47% 減少しました。
- フットプリントの縮小: アプリのダウンロード サイズが 86.6 MB から 61.5 MB に減少(28.98% 減少)。
- 安定性の向上: ユーザーが認識したアプリケーション応答なし(ANR)エラーが 0.35% から 0.28% に減少し、類似アプリの中央値に大幅に近づきました。
- 複雑さの軽減: DEX ファイルの総数が 17 から 11 に削減され、起動ファイルは 2 つだけになりました。
こうした技術的なパフォーマンスの向上に加え、アプリの最適化が進んだことで、特にリソースに制約のある市場において、具体的なビジネスの成長とユーザー エンゲージメントの向上に直接つながりました。
- 地域別のエンゲージメント: RAM 容量の少ないデバイスが市場の大部分を占める国では、エンゲージメントの増加が最も大きく、この広大な市場でエンゲージメントを向上させるには、ANR 発生率を下げることが重要でした。
- エンゲージメントの増加: アプリの最適化を強化して以来、エンゲージメントが 3% 増加しました。
継続的インテグレーションで将来のパフォーマンスを保護する
コードの縮小は、一度修正すれば終わりではなく、継続的な監視が必要です。R8 構成アナライザによって大きな成果が得られたことに触発された Tinder の Android チームは、最適化のモニタリングを日々のワークフローに積極的に組み込み、回帰を防ぐようにしました。
Tinder のチームは、最適化の統計情報の変化を報告する新しいジョブを CI/CD パイプラインに追加しました。これにより、各自の貢献が最適化にどのように影響しているかを全員が確認できるようになりました。R8 構成の統合を検討している他のデベロッパーにアドバイスする際、チームは内部依存関係を監査することの重要性を強調しています。ほとんどの一般的なサードパーティ ライブラリには明確に定義されたルールが付属していますが、「安定している」と見なされている社内プロジェクトでは、実際には全体的な最適化に悪影響を及ぼす広範なルールが導入されている可能性があります。
重要ポイント
最適化されていないコードベースと大量の DEX ファイルに直面した Tinder は、アプリの圧縮ルールをクリーンに監査する方法を必要としていました。R8 Configuration Analyzer は、過度に広範な内部ライブラリ ルールと、keep ルールの影響を受けるクラスを特定するために必要な理想的なツールを提供し、チームが自信を持ってコードベースを最適化できるようにしました。その結果、Tinder はコールド スタートをほぼ半減させ、APK サイズを 28% 以上縮小し、ユーザーにとってより健全でパフォーマンスの高い基盤を構築することに成功しました。チームは、これらの数値をさらに改善するために積極的に取り組んでいます。
R8 構成アナライザの使用方法
R8 構成アナライザとそのスタンドアロン機能は、現在の Android Gradle プラグイン(AGP)のバージョンに基づいて利用できます。
1. AGP 9.3 リリース: R8 構成アナライザは、AGP 9.3 に完全に統合され、リリースされています。R8 リリースビルドを実行すると、レポートは `build/outputs/mapping/release/configanalyzer.html` フォルダに生成されます。
2. スタンドアロンの Gradle タスク: AGP 9.3 では、スタンドアロンの Gradle タスクが導入されました。これにより、完全なリリースビルドを実行せずにアナライザ レポートを生成できるため、ローカルで keep ルールを調整する際のフィードバック ループが大幅に高速化されます。
./gradlew :app:analyzeReleaseR8Config
レポートは build/reports/r8/r8-config-analyzer-release.html. に生成されます。
3. 古い AGP バージョンでの使用: AGP 9.3 より前のバージョンを使用している場合、構成を分析するために AGP バージョン全体を移行する必要はありません。AGP で R8 を置き換える手順に沿って、R8 のバージョンを 9.3.7-dev 以降に個別に更新できます。レポートをローカルで生成するには、プロパティを指定してビルドを実行します。
./gradlew assembleRelease -Dcom.android.tools.r8.dumpkeepradiushtmltodirectory=<output_directory>
詳細については、R8 Configuration Analyzer のドキュメントをご覧ください。
-
事例紹介Grab は、東南アジアを代表するスーパーアプリです。1 つのアプリで、8 か国の数百万人のユーザーにデリバリー、モビリティ、金融サービスを提供しています。
Ajesh Pai, Nguyen Van Minh, Tracy Agyemang • 所要時間: 5 分 -
事例紹介WhatsApp は世界最大のメッセージ プラットフォームであり、世界中の数十億人のユーザーにサービスを提供しています。さまざまな地域の人々にとってデフォルトのコミュニケーション ツールであり、プライベートで信頼性が高く、安全なメッセージングを通じてユーザーをつないでいます。
Niharika Arora, Tracy Agyemang, Mayank Jain • 所要時間: 8 分 -
事例紹介Karrot は、地域密着型のコミュニティ主導の P2P マーケットプレイス アプリです。ユーザーは、確認済みの他のユーザーとアイテムを売買、交換できます。2015 年に韓国でリリースされて以来、このプラットフォームはグローバル市場に拡大し、4,300 万人以上の確認済みユーザーを獲得しています。
Thomas Ezan, Tracy Agyemang • 所要時間: 2 分
Android 開発に関する最新の分析情報を毎週メールでお届けします。