Expo(React Native)でアプリを開発し、react-native-google-mobile-ads を使ってAdMob広告を導入した際、「ローカル(npx expo run:android)では動くのに、EAS Buildで製品版(aab)を作って公開したら起動直後にクラッシュする」という現象に遭遇しました。
Expoの管理画面で環境変数を設定したのになぜ…?と頭を抱えましたが、原因はExpoの環境変数の仕様とビルドプロファイルの設定にありました。
同じエラーでアプリが強制終了して困っている方のために、原因と正しい解決策をまとめます。
1. アプリがクラッシュする最大の原因
AdMobのSDKは、アプリ起動時にネイティブレイヤー(Androidの AndroidManifest.xml など)に有効な AdMob App ID が書き込まれているかを厳格にチェックします。
これが空(undefined)だったり間違っていると、アプリはエラーを吐く猶予もなく即座にクラッシュ(強制終了)します。
「環境変数を設定したのにクラッシュする」という場合、EAS Build(本番ビルド)のプロセスで、設定ファイル(app.config.ts や app.json)にAdMob IDが正しく渡っていません。
2. やりがちな2つの罠と解決策
罠①:環境変数に EXPO_PUBLIC_ を使っている
フロントエンド(React Nativeのコード内)で環境変数を使う際、EXPO_PUBLIC_ADMOB_APP_ID のように頭に EXPO_PUBLIC_ をつけるのがExpoの基本です。
しかし、plugins(ネイティブコードの書き換え)の処理タイミングでは、EXPO_PUBLIC_ の変数はまだ読み込まれません。
❌ 間違った設定(app.config.ts)
TypeScript
plugins: [
[
"react-native-google-mobile-ads",
{
// ❌ これだとビルド時に undefined になりクラッシュします
androidAppId: process.env.EXPO_PUBLIC_ADMOB_APP_ID,
},
],
]
⭕ 正しい設定
接頭辞を外し、未設定時のためにGoogle公式のテスト用IDをフォールバックとして仕込んでおくと安全です。
TypeScript
plugins: [
[
"react-native-google-mobile-ads",
{
// ⭕ EXPO_PUBLIC_ を外す
androidAppId: process.env.ADMOB_ANDROID_APP_ID || "ca-app-pub-3940256099942544~3347511713",
},
],
]
罠②:ビルドバリアント(Production)に環境変数が紐づいていない
Expoの管理画面(EAS Secrets)やローカル環境で変数を定義していても、本番ビルド(Production)の設定にその環境変数が公開されていないと、ビルド時に値が消えて undefined になります。
💡 解決策
eas.json の build.production(または環境変数管理画面のビルドバリアント設定)を確認し、本番環境(production)に対して正しい環境変数(ADMOB_ANDROID_APP_ID)が紐づくように設定してください。
3. 本当に直ったかビルドログで確認する方法
修正が完了したら、再度 eas build を実行します。 ビルドが開始されたら、Expo Dashboardのビルドログ(Logs)を必ず確認しましょう。
app.config.ts の上部に以下のようなログ仕込んでおくと確実です。
TypeScript
console.log("🔥 読み込まれたアプリID:", process.env.ADMOB_ANDROID_APP_ID);
チェックポイント
- ❌
🔥 読み込まれたアプリID: undefined➔ まだ設定が間違っています。そのままaabを公開すると100%クラッシュします。 - ⭕
🔥 読み込まれたアプリID: ca-app-pub-xxxx...➔ 成功です!本番IDが正常に埋め込まれています。
まとめ:どうしても上手くいかない時の裏技
もし環境変数の設定や紐付けがどうしても上手くいかない場合は、app.config.ts に本番用のAdMobアプリIDを直接ベタ書き(ハードコード)するのが一番手っ取り早く確実です。
TypeScript
androidAppId: "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX" // 直接書く
※AdMobの「アプリID」はアプリを識別するための公開情報なので、ここに直接書いてGitHub等にコミットしてもセキュリティ上のリスクは極めて低いです。(広告ユニットIDとは異なります)。
本番環境でのみクラッシュが発生した際は、まず「ビルドログで値が undefined になっていないか」を確認してみてください!


コメント