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上級

起動時間を『予算』として管理する — 6本のアプリでSDK初期化を後ろ倒しにした設計記録

起動時間を場当たり的に速くするのではなく、フェーズごとに予算を割り当てて守る運用に切り替えた記録です。Rork で書き出した6本のアプリでSDK初期化を後ろ倒しにし、CIで予算超過を止めるまでをまとめました。

React Native233起動時間2パフォーマンス33AdMob70設計10

プレミアム記事

きっかけは、6本並行で運用している壁紙アプリのうち、一番ダウンロード数の多い1本の起動が「最近もっさりしてきた」というレビューでした。クラッシュではありません。落ちないし、機能も動く。ただ、タップしてから最初の壁紙一覧が出るまでが、自分で触っても明らかに遅い。計測してみると、コールドスタートの TTI(操作可能になるまでの時間)が、半年前の 1,500ms から 2,400ms に伸びていました。

機能を足すたびに、初期化処理が少しずつ増えていたのです。広告 SDK、解析、リモート設定、フォントのプリロード、お気に入りの復元。どれも単体では「数十ミリ秒だから」と通してきたものでした。2014年から個人開発を続けて累計5,000万ダウンロードを超えるなかで、私が一番くり返してきた失敗がこれです。一つひとつは正しい判断でも、起動という共有資源に対して誰も上限を決めていないと、合計はいくらでも膨らみます。この記事は、起動時間を「速くする」対象から「予算を決めて守る」対象に変えた、その設計と運用の記録です。

なぜ「最適化」ではなく「予算」で考えるようになったか

起動を速くするテクニックは世の中にたくさんあります。Hermes を使う、バンドルを分割する、画像を遅延読み込みする。私もひと通り試しました。ですが、テクニックを単発で当てるアプローチには弱点があります。直した直後は速いのに、数か月後にはまた遅くなるのです。

理由ははっきりしています。最適化は「今ある遅さ」を削る作業なので、新しく足される遅さを防げません。機能追加のたびに初期化が増え、半年かけてまた元の木阿弥になります。私の6本すべてで、これがほぼ同じ周期で起きていました。

そこで考え方を変えました。起動時間は、CPU 時間やメモリと同じ「有限の共有資源」です。であれば、家計と同じように予算を決めて、各処理にいくらまで使ってよいかを割り当て、超えたら止めればいい。視点を「速くする」から「枠内に収める」に移した瞬間に、運用がぐっと安定しました。

宮大工だった祖父たちを思い出します。木組みは、一本ごとに「ここは何分で削る」と決めて手を動かすのではなく、全体の寸法と取り合いを先に決めてから各部材を作る、と聞いたことがあります。起動時間も同じで、全体の枠を先に引いてから各処理に配分するほうが、結果として崩れにくいというのが私の実感です。

起動を3フェーズに分けて予算を配る

最初にやったのは、起動を意味のある3つのフェーズに分けることでした。「起動が遅い」を一つの塊で見ているうちは、どこを削ればいいか判断できません。

私が6本で共通に使っている区切りは次の3つです。

  1. ネイティブ起動フェーズ:プロセス生成からReactルートビューがマウントされるまで。ここはアプリ側のJSではほぼ制御できない領域です。
  2. 初回描画フェーズ:JSが動き始めてから、最初の意味のある画面(壁紙一覧のスケルトン)が描画されるまで。
  3. 対話可能フェーズ:スケルトンが出てから、スクロールやタップに実際に反応できる状態(TTI)になるまで。

そのうえで、各フェーズに予算(上限ms)を割り当てます。私が現在6本で使っている配分はこうです。

  • ネイティブ起動フェーズ:上限 700ms
  • 初回描画フェーズ:上限 600ms
  • 対話可能フェーズ:上限 500ms
  • 合計予算:1,800ms(TTI)

この 1,800ms という数字は、ミドルレンジの実機(私の検証では Pixel 6a と iPhone SE 第3世代)で、ユーザーが「待たされた」と感じ始める手前の経験的なラインとして置いています。端末性能に幅があるので、絶対値より「予算を決めて運用に乗せること」自体が本質です。重要なのは、新しい初期化処理を足したい人(過去の自分を含めて)が、必ずこの表のどこかから時間を捻出しなければならない、という制約が生まれることです。

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

この記事の続きを読む

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

この記事で得られること
起動を3フェーズに分けて予算を配分する考え方と、私が6本で使っている実際の配分表(合計1,800ms)
AdMob・Crashlytics の初期化を最初のフレーム後ろに退避させる Before/After コードと、TTI 2,400ms→1,500ms の実測変化
起動時間の回帰を CI で止めるしきい値ゲートの実装と、しきい値を『超えたら落とす』に倒した理由
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-06-02
広告の本当のeCPMを自分で測る — Impression-Level Ad Revenue を計測基盤に流し込む実装記録
AdMob の管理画面が見せる平均eCPMだけでは、どの地域やプレースメントが本当に稼いでいるかは分かりません。1インプレッションごとの収益を paidEventListener で受け取り、解析基盤に流して本当のeCPMを出すまでの実装と運用をまとめました。
開発ツール2026-08-04
名前が20文字ちょうどでも保存できない — 文字数の数え方を1か所に決めるまでの実測
絵文字や合成文字が入ると、クライアントとサーバーで文字数が食い違います。4つの数え方をNode v22で実測し、切り詰め2,000件の破損率75.6%・UTF-8往復での置換文字化36.1%という結果から、カウントの正本を1か所に置く設計へ至るまでをまとめました。
開発ツール2026-07-24
同じ通信が同時に何本も飛ぶのを1本に束ねる — 参照カウント付きシングルフライト層の設計
起動直後に同じ API へ何本ものリクエストが同時に飛ぶ多重フェッチを、進行中の Promise を共有して1本に束ねる設計です。束ねる範囲を決めるキーの組み立て方、失敗した Promise を配り続けてしまう罠、呼び出し側の中断が全体を巻き込む罠、そして束ね率を数えて回帰を止めるテストまで、参照カウント付きシングルフライト層の実装を実測の通信ログとともに残します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →