自社アプリ ahha のスプラッシュ画面で、ロゴが小さく見えたので大きくしようとしました。
app.json を開いて値を書き換えます。
{
"expo": {
"plugins": [
["expo-splash-screen", { "imageWidth": 76 }]
]
}
}
76→130にして再ビルド。変化なし180にして再ビルド。変化なし- キャッシュを疑ってクリーンビルド。変化なし
- シミュレータを削除して作り直し。変化なし
四時間をこうやって使いました。
先に結論を書いておきます
答えは Expo の公式ドキュメントに書いてありました。
android・iosディレクトリを Expo Prebuild で生成していないアプリでは、app config の変更は何の効果もありません
私のプロジェクトがまさにそれでした。ios/ と android/ が既にあって、expo prebuild を実行しません。いわゆる Bare Workflow です。
app.json は prebuild がネイティブプロジェクトを生成するときに参照する設計図です。生成の工程を飛ばしているなら、ただの読まれない JSON ファイルでしかありません。
エラーは出ません。ビルドは通ります。書いた値が無視されているという事実だけが、どこにも表示されません。
では、実際のレンダーソースはどこか
Bare Workflow では ios/・android/ フォルダの中の実ファイルが SSOT です。探して整理すると、こうなっていました。
| 対象 | 実際の場所 |
|---|---|
| iOS スプラッシュロゴ | ios/<アプリ>/Images.xcassets/SplashScreenLogo.imageset/ の PNG 3 枚(1x・2x・3x) |
| Android スプラッシュロゴ | android/app/src/main/res/drawable-*/splashscreen_logo.png を density ごとに 5 枚 |
| iOS アプリアイコン | ios/<アプリ>/Images.xcassets/AppIcon.appiconset/ |
| Android アプリアイコン | android/app/src/main/res/mipmap-*/ic_launcher*.webp(5 density × 5 ファイル) |
| スプラッシュ背景色 | Info.plist・colors.xml などのネイティブ設定ファイル |
ここが重要なのですが、PNG の実ピクセルサイズがそのままレンダーサイズです。imageWidth のような数値で調整するものではありません。数字を変える場所を探していたこと自体が的外れでした。
直し方 — 画像そのものを作り直す
サイズを変えたいなら、元画像を目的のサイズでレンダリングし直して各パスに配置するしかありません。
元ロゴ ↓ リサイズ iOS : image.png (1x) · image@2x.png · image@3x.png Android : mdpi · hdpi · xhdpi · xxhdpi · xxxhdpi
Python と Pillow でスクリプトを書いて一括生成しました。手で 8 枚書き出すと、次に調整したくなったときに同じ作業をやり直すことになります。
app.json の値は消さずに残しました。将来 prebuild を使うことになったときに必要ですし、消しても状況が良くなるわけではありません。ただし「ここは効いていない」と分かる形で残すことが条件です。何も書かずに残すと、次に触る人が同じ四時間を使います。
同じ罠が別の場所でも出ました
このプロジェクトで App Tracking Transparency を実装したとき、まったく同じ問題に当たりました。
expo-tracking-transparency の公式ドキュメントには、こう設定しろと書いてあります。
{
"expo": {
"plugins": [
[
"expo-tracking-transparency",
{ "userTrackingPermission": "この識別子は広告配信に使用されます。" }
]
]
}
}
Bare Workflow ではこの文言が反映されません。Info.plist を直接書き換える必要があります。
<key>NSUserTrackingUsageDescription</key> <string>お客様に関連性の高い広告を表示するために、この識別子を使用します。</string>
紛らわしいのは、npx expo install を実行すると app.json の plugins 配列にパッケージ名が自動で追加されることです。追加されるので設定できているように見えます。登録されるだけで、オプションはネイティブに渡りません。
この ATT の件は審査リジェクトまで行きました。詳しくはこちらに書いています。
ドキュメントの読み方が変わりました
Expo のライブラリドキュメントには、たいてい二つの経路が書かれています。
| セクション | 誰向けか |
|---|---|
| Configuration in app config | prebuild を使う人向け。Bare Workflow では無効 |
| Are you using this library in an existing React Native app? | こちらが Bare Workflow 向け。手動設定の手順が書いてある |
上のセクションのほうが先に出てくるので、そこで読み終えてしまいます。下まで開かないと手動設定の存在に気づきません。私は二回とも上で止まりました。
本当の教訓は別のところにありました
技術的な話は以上です。ただ、この四時間でいちばん痛かったのは別のことでした。
作業を始めるとき、こう言われていました。
app.jsonだけ変えても効かないんじゃないか
私は「公式ドキュメントにこうしろと書いてあるので効くはずです」と答えて、値を変え続けました。四時間後にその指摘が正しかったと分かりました。
現場感覚のある人の「効かないんじゃないか」は、ドキュメントより正確なことがあります。特に、ドキュメントが前提としている環境と実際の環境が違うときがそうです。
ドキュメントは間違っていませんでした。私が読んだ箇所が、私の環境向けではなかっただけです。そしてその区別は、動かしてみても分かりません。エラーが出ないからです。
同じ回り道を二度しないように、プロジェクトのドキュメントにこう残しました。
Bare = ios/android フォルダ自体が SSOT · app.json は無影響 サイズ調整 = 元 PNG から実ネイティブ資産を再生成 · 再ビルド
まとめ
- prebuild を使わない構成では
app.jsonはネイティブに反映されない - スプラッシュ・アイコン =
ios/・android/の実画像ファイルが SSOT。実ピクセルサイズがレンダーサイズ - 権限文言 =
Info.plist・AndroidManifest.xmlを直接編集 - ライブラリの config plugin オプションはほぼ無効。手動設定セクションを探す
npx expo installが plugins に追加するのは登録だけ
この記事について
自社アプリ ahha(React Native + Expo Bare Workflow · RevenueCat サブスク · AdMob)の開発中に実際に起きた問題です。2026 年 8 月時点の内容で、Expo のドキュメント構成も SDK の挙動も変わります。
確認しきれていないことも書いておきます。prebuild を実行すれば正常に反映されるのかは検証していません。このプロジェクトは prebuild 自体を禁止ルールにしているため実行したことがなく、CNG を使うプロジェクトでどうなるかも未確認です。



コメント