【Expo】AdMobで本番(aab)だけアプリがクラッシュする原因と解決策

AdMob

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.tsapp.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.jsonbuild.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 になっていないか」を確認してみてください!

コメント

タイトルとURLをコピーしました