RORK LABEN
PLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっていますPLAY — Google Play の target API level 36 要件が昨日8月31日に発効しました。今日以降、新規アプリと既存アプリの更新は Android 16 対応が必須ですVISIBILITY — API 35 のままのアプリは掲載こそ続きますが、新しい Android 版のユーザーには表示されなくなります。エラーが出ないまま新規インストールだけが減る点に注意が要りますEXTENSION — 間に合わなかった場合は、Play Console から2026年11月1日までの延長申請が出せます。恒久対応の計画とセットで進めるのが実務的ですAPPLE — Apple 側は9月9日にイベント、iOS 27 の正式リリースは9月14日と報じられています。生成したアプリの iOS 27 実機確認はリリース週の前に済ませておきたいところですEXPO — Expo が expo-paste-input を公開しました(8月28日)。React Native の TextInput に画像・GIF・ステッカーの貼り付けを追加するネイティブモジュールですEAS — EAS Observe が8月20日に GA になりました。クラッシュや性能の観測を、ビルドや配信と同じ EAS 上で持てるようになっています
記事一覧/開発ツール
開発ツール/2026-06-01上級

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

Rorkで書き出したReact NativeアプリでAndroid VitalsのANR率がしきい値を超えたときの記録です。CrashlyticsとVitalsで発生箇所を挟み込み、起動時の同期初期化をメインスレッドから外し、画像デコードやリスト描画の詰まりを解消するまでの切り分けを共有します。

React Native233Android47ANRパフォーマンス33Crashlytics13

プレミアム記事

ある朝、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/月 または ¥2,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-08-31
画面ロックから3分後、expo-audio の環境音は静かに止まっていました
expo-audio の音が画面ロックで止まる原因を、ビルド設定・オーディオセッション・ロック画面連携の三層に分けて切り分けます。Android で約3分後に止まるのは、ドキュメントに書かれた止まり方です。
開発ツール2026-07-24
同じ通信が同時に何本も飛ぶのを1本に束ねる — 参照カウント付きシングルフライト層の設計
起動直後に同じ API へ何本ものリクエストが同時に飛ぶ多重フェッチを、進行中の Promise を共有して1本に束ねる設計です。束ねる範囲を決めるキーの組み立て方、失敗した Promise を配り続けてしまう罠、呼び出し側の中断が全体を巻き込む罠、そして束ね率を数えて回帰を止めるテストまで、参照カウント付きシングルフライト層の実装を実測の通信ログとともに残します。
開発ツール2026-07-10
React Compiler を Expo に入れて、手書き memo を 41 箇所消しました
Rork が生成した React Native 画面に React Compiler を導入し、再レンダリング回数を Profiler で実測しました。手書き memo/useCallback の削除判断、効かない箇所の見分け方、CI での回帰検知までをまとめています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →