Expoを51から52にアップグレード時に発生した Android ビルドエラーを解決した話

発生した時期

Expo SDK 51 から 52 へアップグレードした際に、Android ビルド時に Manifest Merge エラーが起こりました。

症状

EAS Build で下記エラーが起こる

エラー
Attribute application@appComponentFactory value=(androidx.core.app.CoreComponentFactory) ... is also present at [com.android.support:support-compat:28.0.0]

要するに、androidx.corecom.android.support が競合して、appComponentFactory 属性の衝突が発生していました。

原因

ライブラリの依存関係の中で、古い com.android.support:* 系を引き込んでしまい、AndroidX と旧サポートライブラリの両方が同時に含まれる状態になっていた。

Expo SDK のバージョンアップやライブラリ更新により、Jetifier がオフのままだと古いサポートライブラリを変換しきれず、Manifest が競合してしまったと推測。

解決策: Jetifier を有効にする

gradle.propertiesandroid.enableJetifier=true を指定し、旧サポートライブラリを AndroidX に自動変換するようにしました。

具体的な修正内容

postinstall スクリプト (scripts/postinstall.js) を作成し、gradle.propertiesandroid.enableJetifier=true がなければ追記するように設定。

<code>postinstall.js</code>
const fs = require('fs');
const path = require('path');

// Path to gradle.properties
const gradlePropertiesPath = path.join(__dirname, '..', 'android', 'gradle.properties');

if (fs.existsSync(gradlePropertiesPath)) {
  const gradleContent = fs.readFileSync(gradlePropertiesPath, 'utf8');
  if (!gradleContent.includes('android.enableJetifier=true')) {
    fs.appendFileSync(
      gradlePropertiesPath,
      '\nandroid.enableJetifier=true\n',
      'utf8',
    );
    console.log('android.enableJetifier=true added to gradle.properties');
  } else {
    console.log('android.enableJetifier=true already exists in gradle.properties');
  }
} else {
  console.log('gradle.properties not found. Skipping Jetifier configuration.');
}

package.jsonscripts に、EAS ビルド時の後処理スクリプトとして設定

<code>package.json</code>
{
  "scripts": {
    "eas-build-post-install": "node ./scripts/postinstall.js"
  }
}

まとめ

Expo SDK のアップグレードで古いライブラリが残っているとき、AndroidX と旧サポートライブラリが衝突しやすい。

Jetifier を有効化する ことで、旧ライブラリを AndroidX に自動変換し、Manifest の競合を防げる。

Manifest Merge で appComponentFactory 衝突エラーが出たら、まずはこのあたりをチェックしてみるとよい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です