RORK LABEN
BUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要ですBUILD — Rork Max はクラウド上の実機 Mac に Xcode と iOS SDK を載せ、SwiftUI を書き、ビルドし、エラーを読んで直す反復を回します。コードを吐いて終わりではない点が生成物の質に効いていますNATIVE — 生成されるのは React Native ではなく純粋な Swift / SwiftUI です。AR や Metal、ウィジェットなど React Native からは届かない機能に手が届くことが、他ビルダーとの実質的な差になりますPLATFORMS — 対応は iPhone・iPad・Apple Watch・Apple TV・Vision Pro に加えて iMessage まで含みます。ウォッチや拡張から入る設計を試すのに向いていますCOMPANION — Rork Companion により、有料の Apple Developer アカウントなしで生成したアプリを実機の iPhone で確認できます。最初の一本を試す段階の障壁が一段下がりましたPRICING — 無料で開始でき有料プランは月額25ドルから、Rork Max は月額200ドルの Max プランです。回収できる本数と規模を先に見積もっておく価値がありますDEADLINE — Google Play は2026年8月31日以降、新規アプリと更新の双方に対象 API レベル36 以上を要求します。残り10日で、生成物の targetSdkVersion は自分で確認が必要です
記事一覧/開発ツール
開発ツール/2026-06-27中級

リリースを重ねたら起動が静かに重くなっていたとき — Rork運用で効いたTTI計測と起動バジェットのメモ

Rorkで作ったアプリの起動が、リリースを重ねるうちに静かに重くなる問題への対処です。平均値では見えないコールドスタートの劣化を起動トレースとTTIマークで捉え、CIに起動バジェットを置いて再発を止めるまでの運用ノウハウを記録しました。スプラッシュの正しい使い方にも触れます。

Rork539performance3cold startTTIReact Native227

プレミアム記事

リリース直後のアプリは、たいてい気持ちよく立ち上がります。問題は半年後です。機能を足し、SDKを増やし、画面を増やしていくうちに、起動が「なんとなく重い」状態へ静かに滑り落ちていきます。どのリリースが犯人かと聞かれても答えられない。一回の劣化が小さすぎて、その都度は誰も気づかないからです。

私は個人開発で壁紙系のアプリを長く運用していますが、起動の重さはレビュー評価とアンインストール率にじわじわ効いてきます。AdMob による広告と解析を足したあとに「最近もっさりする」というレビューが増え、原因を一つに絞れずに数日を溶かしたことがありました。このメモは、その手の「犯人不明の起動劣化」を、感覚ではなく数字で追えるようにするための運用記録です。Rork(React Native / Expo 出力)で作ったアプリを前提にしています。

平均値は劣化を隠す

最初に捨てたほうがいい癖が、起動時間を一つの平均値で見ることです。平均は速い端末と暖まったキャッシュに引っ張られて、実際の体感より良い数字を出します。

見るべきは三つに分けた起動です。

種類定義なぜ見るか
コールドスタートプロセスが存在しない状態からの起動新規ユーザーと再起動後の第一印象を決める。最も遅く、最も重要
ウォームスタートプロセスは生きていて画面を作り直す起動SDK初期化やルート構築の重さが出る
ホットスタートバックグラウンドから戻るだけここが遅いならリスナーやリレンダの問題

そして平均ではなく p75 と p95 を見ます。体感のクレームは遅い側の四分の一から出ます。さらに端末を分けます。最新の iPhone だけ見ていると、実ユーザーの多くが使う数年前の Android 中位機での劣化を丸ごと見落とします。私の場合、手元の検証は必ず一番遅い実機を一台固定で持っておき、その端末でのコールドスタート p75 を基準値にしています。

「いつ操作できるか」を計測する

起動の指標としてよく出てくるのが TTI(Time To Interactive)です。スプラッシュが消えた瞬間ではなく、ユーザーが実際に最初の操作をできるようになった瞬間までの時間です。スプラッシュを長く見せれば「起動が速く見える」だけで、操作可能になるまでが遅ければ体感は改善しません。

計測は二段構えにします。ネイティブのプロセス開始からの「アプリ起動トレース」と、JS 側で最初の画面が本当に使える状態になった「TTI マーク」です。

ネイティブ側のトレースは、自前で正確に測るのは骨が折れるので、Firebase Performance の自動 _app_start トレースか、Sentry のモバイル App Start 計測に任せるのが現実的です。Rork が出力した Expo プロジェクトに後乗せできます。

JS 側の TTI マークは、最初のインタラクティブな画面のマウント完了時に一度だけ記録します。react-native-performance を使うと performance.now() 起点で扱いやすくなります。

// app/_layout.tsx など、ルートの最上位で
import performance from 'react-native-performance';
import { useEffect, useRef } from 'react';
 
// モジュール評価のいちばん早い地点でマークを置く
performance.mark('jsModuleStart');
 
export function useReportTTI(screenName: string) {
  const reported = useRef(false);
 
  useEffect(() => {
    // 最初のフレームが描画され、操作可能になった直後
    if (reported.current) return;
    reported.current = true;
 
    performance.mark('firstScreenInteractive');
    const tti = performance.measure(
      'tti',
      'jsModuleStart',
      'firstScreenInteractive'
    );
 
    // 解析へ送る。リリースバージョンを必ず添える
    reportMetric('tti_ms', Math.round(tti.duration), {
      screen: screenName,
      appVersion: APP_VERSION,
      coldStart: wasColdStart(),
    });
  }, [screenName]);
}

ここで肝心なのは、計測値に必ず appVersion を添えることです。これがないと、あとで「どのリリースから遅くなったか」を切り分けられません。起動劣化の調査は、結局この紐づけがあるかどうかで難易度が変わります。

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

この記事の続きを読む

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

この記事で得られること
平均ではなくコールドスタートのp75と低スペック端末で起動劣化を捉える計測の置き方
ネイティブの起動トレースとJS側のTTIマークをリリースに紐づけて回帰の出どころを特定する手順
起動時間と初期バンドルをCIで監視し、PRで静かな劣化を止める起動バジェットの作り方
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-08-14
Expo SDK 57 に上げる前に、prebuild で消えるネイティブ変更を洗い出す
Expo SDK 57 では expo prebuild が既定で ios と android を消してから再生成します。手編集を上げる前に洗い出す方法、config plugin への移し替え、57.0.9 で解消したメモリ回帰までを実務の順序でまとめました。
開発ツール2026-08-10
署名付きURLに変えたらキャッシュが効かなくなった — expo-image のキーを URL から切り離す
署名付きURLは毎回クエリが変わるため、URL をそのままキーにしている限りキャッシュは当たりません。expo-image の writeToCacheAsync / readFromCacheAsync でキーを自分で握り、再ダウンロードを半減させるまでの設計と実測です。
開発ツール2026-08-01
実験の割り当てが同じ端末に偏る — 100万件のIDで確かめたハッシュ選定と salt の位置
端末側で実験の変種を決める割り当てが、実験を2本並べた途端に同じ端末へ集中しました。100万件のIDで4つのハッシュを測り、原因がハッシュの一様性ではなく salt の連結位置にあったこと、そして採用した実装までを実測値とともに残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →