ネイティブアプリのビルドを節約する—テスト用はAPKを手元で作る

ラピットくんがAPKのアイコンが入ったスマホを持って親指を立てている。見出しはビルド、節約できます。下にテスト用はAPK・本番の鍵はEAS・名前は分けるの3つ

月の半分で、ビルドが28本になっていました

9月15日の夜中に、Expoの使用量を確かめました。

無料で作れるビルド30本のうち、28本を使っていました。まだ月の半分です。残りはAndroidが1本、iOSが1本。

8月も、Androidの15本は使い切っていました。

お手伝いしているスマホアプリの開発で、画面を直すたびにビルドして、実機で触って確かめていたんです。1回直して、1本。そりゃ減ります。

このペースだと、月末まで持ちません。

思いついた道は2つでした。そのまま課金するか。それとも、テストで確かめたいだけなら、Expoのクラウドを使わずに手元でAPKを作れば足りるんじゃないか。

結論から書くと、後者でできました。この記事は、ネイティブアプリのビルドを節約した話です。

ネイティブアプリは、直すたびに組み立て直します

先に、言葉をそろえておきます。スマホアプリを作ったことがない方も読む前提で書いています。

ネイティブアプリは、ストアから入れて、スマホの上で直接動くアプリです。 ブラウザで開くWebアプリと違って、カメラや通知、アプリ内課金のようなスマホの機能をそのまま使えます。

そのかわり、直したものを確かめるまでの手間が違います。

Webアプリなら、コードを直してブラウザを読み込み直せば、もう反映されています。ネイティブアプリは、そうはいきません。書いたコードは、そのままではスマホに入らないからです。

スマホに入れるには、コードや画像をまとめて、スマホが読める1つのファイルに組み立てる必要があります。これがビルドです。できあがるファイルは、AndroidならAPKやAAB、iPhoneならIPAと呼ばれます。APKはスマホに直接入れる形、AABはGoogle Playに出す形です。

組み立てるときに、もう1つやることがあります。鍵で署名を付けることです。 「このアプリは、確かにこの作り手のものです」という印で、スマホもストアもこれを確かめます。この鍵の話が、あとで効いてきます。

直すたびにビルドして、スマホに入れ直す。ネイティブアプリの確認は、この繰り返しです。回数がかさむのは、ここが理由です。

EAS Buildは、このビルドをExpoのクラウドで代わりにやってくれるサービスです。自分のパソコンに重い道具を入れなくていいので、僕も最初からこれに頼っていました。そして、ここで作ると1回が1本として数えられます。 ストアに出す版も、テストで自分のスマホに入れる版も、同じ1本です。

無料枠は、AndroidとiOSで月15本ずつです

Expoの料金ページから、関係するところだけ抜きます。

プラン月額含まれるビルド順番待ち
Free$0Android 15本・iOS 15本後回し
Starter$19$45分まで。超えたら1本ごと優先

1本ごとの値段は、標準のサイズでAndroidが$1、iOSが$2です。

9月15日の時点で、Android・iOSとも15本中14本。月の半分で、残りは1本ずつでした
9月15日の時点で、Android・iOSとも15本中14本。月の半分で、残りは1本ずつでした

使い切ったらどうなるか。請求は来ません。止まるだけです。 ExpoのFAQに、無料プランには超過料金がなく、使い切ったら翌月1日まで新しいビルドはできない、と書いてあります。

GitHubの自動実行も、支払い方法を登録していなければ、枠を超えた時点で止まります。同じ作りです。そのあたりは前の記事で調べました。

▼関連記事
GitHubはどこまで無料で使えるのか——AIに書かせる時代の始め方

じゃあ、課金したらいくらか。

月の半分で28本なので、このペースが続けば月56本です。内訳はAndroidとiOSが半々。Starterにすると、Androidが28本で$28、iOSが28本で$56、合わせて$84。込みの$45を引いた$39に月額の$19が乗って、月$58です。1ドル150円で、8,700円ほど。

払えない額ではありません。

ただ、よく見るとAndroidの28本は、ストアに出すためではなく、自分のスマホで確かめるためのビルドでした。ここを削れないか、と考えました。

テストで確かめるだけなら、ストア用の鍵はいりません

さっきの鍵の話に戻ります。

Androidは、アプリを2つのもので見分けています。

1つはパッケージ名com.example.app のような文字列です。Androidのドキュメントにも、この名前で端末上とGoogle Playのアプリを1つに特定する、と書いてあります。

もう1つが署名の鍵。上書きで更新するときは、入っている版と同じ鍵かどうかを確かめます。アプリ署名の説明によると、鍵が違うなら、パッケージ名を変えて別のアプリとして入れることになります。

ストアに出す版は、本番の鍵で署名しないといけません。この鍵はEASに預けてあります。

一方で、自分のスマホで確かめるだけの版は、本番の鍵でなくても入ります。手元でビルドすると、開発用の鍵が自動で使われます。同じドキュメントに、この開発用の鍵ではGoogle Playに出せない、とも書いてあります。逆に言えば、出さないなら、それで足ります。

条件は1つだけ。本番とパッケージ名を分けることです。名前が同じだと、鍵が違うのでEASの版に上書きできず、入りません。名前を変えれば、別のアプリとして2つ並びます。

パッケージ名と鍵の組み合わせで、上書きされるか、入らないか、2つ並ぶかが決まります
パッケージ名と鍵の組み合わせで、上書きされるか、入らないか、2つ並ぶかが決まります

本番は com.example.app のまま、テスト用は com.example.verify。スマホに出る表示名にも「検証」と付けておくと、取り違えません。これはExpoが勧めているやり方と同じです。

本番の鍵を手元にダウンロードしてそろえる、という手もありました。やめました。本番の鍵を、自分のパソコンにコピーすることになるからです。置き場所が増えるほど、漏れたときにどこから漏れたか追えなくなります。

やってみたら、Windowsで作れました

仕組みが分かったので、手元でAPKを作りました。

AndroidのテストAPKは、Windowsのパソコンで作れました。 57MB。道具がそろってからのビルドは7分ほどで、お金は0円です。

ただ、道具をそろえるまでに1時間ほどかかりました。Androidの開発キットとJavaを入れて、原因の違う壁に5回ぶつかっています。ファイルの場所を示すパスが260文字を超えると止まる、みたいなWindowsらしい罠でした。ここは長くなるので、また別に書きます。

注意が3つあります。

  • Expo公式の手元ビルド(eas build --local)は、Windowsに対応していません。 ローカルビルドの説明に、対応はmacOSとLinuxで、WindowsはWSLなら動くかもしれないが検証していない、とあります。僕はAndroidの標準の道具で直接組み立てました
  • iPhone用を手元で作るなら、Macが要ります。 組み立てに使うXcodeが、Macでしか動かないからです
  • テスト用の版では、ストアの課金が試せません。 課金の商品は、本番のパッケージ名に紐づけてストアに登録してあるからです。課金まわりを触ったときは、EASで本番の名前のまま作って確かめます

なので、テスト用のAndroidだけを手元に移して、iOSとストアに出す版はEASに残しました。

さっきの試算に当てはめると、Androidの28本ぶんが0円になります。iOSの28本を無料の15本に収めきれずStarterにしたとしても、$56から込みの$45を引いた$11に月額$19で、月$30。$58の半分くらいです。

チームで作っているなら、テスト用の設定はmainに入れません

このアプリは、チームで作っています。テスト用に名前を切り替える設定を、GitHubのmainに入れていいのか。ここも確かめました。

鍵は増えません。切り替えの設定は、手元でテスト用を作るときにだけ働きます。ふだんのEASのビルドでは本番の名前のままなので、今ある鍵がそのまま使われます。EASが読み取る設定を表示して、本番の名前になっていることも確かめました。

それでも、mainには入れないことにしました。

1つは、中身が僕専用だから。

もう1つは、切り替えに使う設定ファイル(app.config.js)があると、ライブラリを入れたときに、Expoが必要な設定を自動で書き足してくれなくなる場面があるからです。チームの人が「なんで反映されないんだ」と迷います。

ブランチを見直したら、3日前の自分のコミットも混ざっていました。iPhoneの確認のために、ビルドの向き先を自分のExpoアカウントに差し替える設定です。これがmainに入ると、チーム全員のビルドが僕の個人アカウントを向きます。危なかった。

テスト用の設定は自分のブランチに残して、アプリの変更だけを取り出してmainへ出します。

同じブランチに混ざっていたコミットを、プルリクエストに出すものと、自分のところに残すものに分けます
同じブランチに混ざっていたコミットを、プルリクエストに出すものと、自分のところに残すものに分けます

取り出すのはcherry-pickという操作です。ブランチを丸ごと合流させず、必要なコミットだけを摘んでくる。この記事を書いている時点では、まだプルリクエストは出していません。

分け方を表にするとこうです。

本番テスト用
パッケージ名com.example.appcom.example.verify
どこで作るEAS手元のパソコン
本番の鍵(EASに保管)開発用の鍵
ストアに出せる出せる出せない
ストアの課金試せる試せない
mainに入る入れない

ブランチを丸ごと合流させて痛い目を見た話は、前に書きました。

▼関連記事
AIでコンフリクト解消は簡単になった。それでも数週間ぶんを捨てた

ビルドを節約するなら、この順番で

  • まず、どのビルドがストアに出すためで、どれが自分で確かめるためかを分ける
  • 確かめるためのAndroidは、手元でAPKを作る。0円。最初の1時間だけ見ておく
  • iOSとストアに出す版は、EASで作る。本番の鍵は1か所に置いたまま
  • それでもiOSが月15本で足りなければ、Starterにする。月$19で$45分なので、iOSなら22本
  • テスト用はパッケージ名を変えて、mainには入れない

まとめ

  • ネイティブアプリは、直すたびにビルドしてスマホに入れ直します。だから回数がかさみます
  • Expoの無料枠はAndroid・iOSとも月15本。使い切ると、翌月1日まで止まります
  • ストアに出す版は本番の鍵が要ります。自分で確かめるだけの版は、開発用の鍵で足ります
  • なので、テスト用のAndroidは手元でAPKを作れます。パッケージ名だけは本番と分けます
  • チームで作るなら、テスト用の設定はmainに入れません

月の半分で気づけたので、止まる前に分けられました。

出典

Expoの料金と無料枠

  • EAS Pricing(プランごとのビルド数と単価) — https://expo.dev/pricing
  • Billing FAQ(無料枠を使い切ったとき) — https://docs.expo.dev/billing/faq/
  • EAS Build(クラウドでのビルド) — https://docs.expo.dev/build/introduction/
  • Local builds(手元ビルドの対応OS) — https://docs.expo.dev/build-reference/local-builds/
  • Configure multiple app variants(名前を分けて並べて入れる) — https://docs.expo.dev/tutorial/eas/multiple-app-variants/

Androidのしくみ

  • Set the application ID(パッケージ名) — https://developer.android.com/build/configure-app-module
  • Sign your app(署名の鍵と、開発用の鍵ではストアに出せないこと) — https://developer.android.com/studio/publish/app-signing

iOSとGit

  • Xcode — https://developer.apple.com/xcode/
  • git-cherry-pick — https://git-scm.com/docs/git-cherry-pick

数字の前提

ドル建ての公開価格を、1ドル150円で換算しています。無料枠と単価は2026年9月時点の公開情報です。ビルドの本数は、僕の個人アカウントの2026年9月15日時点の実績です。月56本の試算は、月の前半のペースが後半も続くと仮定したものです。パッケージ名は例として置き換えています。

作りながら覚えたい方へ

ビルドも鍵も、説明を読むより、1回自分のスマホに入れてみたほうが早く分かります。うちは各地でその場を用意しています。

弊社では、スマホアプリの開発の進め方や、ビルドと鍵の置き場所もご相談いただけます。「作れてはいるが、ビルドの回し方が決まっていない」という状態から始めて大丈夫です。

この記事を書いた人