RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-06-01上級

Android Vitals の ANR 率が上がったとき — メインスレッドを止めない React Native 設計ノート

Rork で書き出した React Native アプリで Android Vitals の ANR 率がしきい値を超えたときの原因切り分けと、メインスレッドを塞がない実装・運用の記録です。

React Native209Android43ANRパフォーマンス30Crashlytics13

プレミアム記事

ある朝、Google Play Console の通知で気づきました。6本並行で運用している壁紙アプリ(『浮世絵壁紙』など)のうち1本だけ、Android Vitals の「ANR 率」が 0.61% まで上がり、Play がストア露出に影響する「望ましくない動作のしきい値(0.47%)」を超えたという警告でした。クラッシュは増えていません。クラッシュフリー率は 99.6% のまま。それでもユーザーには「固まって、しばらくして真っ黒になり、勝手に閉じる」という体験が起きていたわけです。

ANR(Application Not Responding)は、クラッシュとは別の指標です。私自身、最初の数年はクラッシュばかり見ていて、ANR をきちんと監視していませんでした。2014年から個人開発を続けて累計5,000万ダウンロードを超えるなかで、ANR が「機能としては正しいのに、体感では壊れている」という一番たちの悪いバグだと痛感したのは、ここ2〜3年のことです。この記事は、その1本を直したときの切り分けと、6本すべてに展開した「メインスレッドを止めない」設計ルールの記録です。

ANR は「JS が遅い」ではなく「UI スレッドが応答しない」問題です

React Native のパフォーマンス問題というと、多くの方はまず JS スレッドの重さを思い浮かべるかもしれません。私も長くそう考えていました。ですが Android の ANR は、厳密には JavaScript スレッドの話ではありません。

Android が ANR を記録するのは、おもに次の状況です。入力イベントへの応答が約5秒以内に返らない、BroadcastReceiver の処理が時間内に終わらない、Service が規定時間内に完了しない。いずれも判定しているのは メインスレッド(UI スレッド) です。React Native では JS は別スレッドで動きますが、ネイティブモジュールの同期呼び出し、ブリッジ越しの大きなデータ受け渡し、起動時のネイティブ初期化、画像のデコードなどは、最終的にメインスレッドの仕事として現れます。ここが詰まると、JS がどれだけ軽くても ANR になります。

つまり ANR を減らす作業は、「JS を速くする」ではなく「メインスレッドが連続して長時間ブロックされる箇所を見つけて、そこを空ける」作業です。視点をここに移せたことが、最初のブレイクスルーでした。

補足すると、Android 11 以降は ANR の集計が BroadcastReceiver や入力イベントだけでなく、Context.startForegroundService の遅延なども含むように広がっています。React Native アプリで意外と見落とされるのが、サードパーティ SDK(広告・解析・プッシュ通知)が起動時に走らせるネイティブ初期化です。私の6本は AdMob を入れているので、広告 SDK の初期化タイミングが起動の同期処理と重なっていないかは、毎回点検する箇所になっています。自分の書いた JS だけを疑っていると、原因が SDK 側にあるときに迷子になります。

どこで起きているかを Crashlytics と Android Vitals で挟み込みます

原因の場所を、私は2方向から挟み込んで特定しました。

ひとつは Google Play Console の Android Vitals です。ANR は「クラスタ」としてスタックトレース付きでまとめられます。問題の1本は、上位クラスタの約7割が nativeRunnable 起点で、共通して起動直後の数秒に集中していました。これだけで「起動シーケンスのどこか」と当たりがつきます。

もうひとつは Firebase Crashlytics です。最近は Android アプリの更新時に、Crashlytics の画面を Claude in Chrome に読み取らせて、ANR クラスタのスタックトレースと該当バージョンの相関を整理させる運用にしています。ブラウザ上の表をそのまま要約させ、「どのリリースから増えたか」「どの端末・OS に偏っているか」を先に出しておくと、コードを開く前に仮説が絞れます。今回は Android 12 以降かつローエンド端末に偏っていて、起動時の同期処理が遅い端末で顕在化していると読めました。

宮大工だった祖父が「手を動かすことが信心だ」とよく言っていたのですが、ANR の調査もまさにそれで、ログを眺めて推測するより、怪しい初期化を一つずつ計測して潰すほうが確実でした。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
Android Vitals の ANR 率しきい値 0.47% を超えた1本を、リリース後72時間でどう切り分けたかの実手順
起動時の同期初期化をメインスレッドから外す Before/After コードと、ANR 0.61%→0.12% の実測変化
New Architecture の同期 TurboModule 呼び出しがメインを塞ぐ落とし穴と、6アプリ運用での回避ルール
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-07-10
React Compiler を Expo に入れて、手書き memo を 41 箇所消しました
Rork が生成した React Native 画面に React Compiler を導入し、再レンダリング回数を Profiler で実測しました。手書き memo/useCallback の削除判断、効かない箇所の見分け方、CI での回帰検知までをまとめています。
開発ツール2026-06-29
New Architecture へ移行したら本番だけ画面がカクつくとき — interop 層への静かなフォールバックを計測して切り分ける運用メモ
New Architecture へ切り替えた Rork アプリが、開発中は快適なのにリリースビルドの実機でだけ一覧スクロールがカクつく。原因は旧式ネイティブモジュールが interop 層へ静かにフォールバックしていたことでした。検知の計測と段階的な切り戻しの実務メモです。
開発ツール2026-06-25
壁紙アプリの画像キャッシュが静かに膨らんでメモリで落ちる — Rork運用で効いた計測と上限設計の運用メモ
画像が主役のRorkアプリで、ディスクキャッシュとメモリ常駐が少しずつ膨らみ、OOMクラッシュとして表面化する問題への対処。実測フック・キャッシュ上限・配信側リサイズまで、運用で効いた順に実装コード付きで整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →