shwldshwld21 days ago

Android ビルド失敗: PNG ファイル形式の不一致

問題

Expo で Android preview ビルド(eas build)が以下のエラーで失敗:

FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:mergeReleaseResources'.
> Android resource compilation failed
  ERROR: .../drawable-mdpi/assets_images_icon.png: AAPT: error: file failed to compile.

原因

ファイル拡張子と実際のフォーマットの不一致

該当ファイルは .png 拡張子だが、実際は JPEG 形式だった:

$ file assets/images/icon.png
assets/images/icon.png: JPEG image data, JFIF standard 1.01, ...

Android の aapt2(Android Asset Packaging Tool)は、拡張子と実際のフォーマットが一致しない画像をコンパイルできない。

影響を受けたファイル

  • assets/images/icon.png

  • assets/images/onboarding_1.png

  • assets/images/onboarding_2.png

  • assets/images/onboarding_3.png

  • assets/images/onboarding_4.png

これらのファイルはAntigravityを使ってnano bananaで生成したものだった

解決方法

macOS の sips コマンドで正しい PNG 形式に変換:

for file in assets/images/icon.png assets/images/onboarding_{1,2,3,4}.png; do
  sips -s format png "$file" --out "$file"
done

変換後の確認

$ file assets/images/icon.png
assets/images/icon.png: PNG image data, 1024 x 1024, 8-bit/color RGB, non-interlaced

予防策

  • 画像ファイルを追加する際は file コマンドで実際の形式を確認する

  • 画像編集ソフトで「名前を付けて保存」する際、拡張子だけでなく形式も正しく選択する

  • CI/CD で画像形式チェックを追加することも検討

参考

  • AAPT2 は Android Studio / Gradle で使用されるリソースコンパイラ

  • iOS は拡張子と形式の不一致を許容するが、Android は厳格