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.core
と com.android.support
が競合して、appComponentFactory
属性の衝突が発生していました。
ライブラリの依存関係の中で、古い com.android.support:*
系を引き込んでしまい、AndroidX と旧サポートライブラリの両方が同時に含まれる状態になっていた。
Expo SDK のバージョンアップやライブラリ更新により、Jetifier がオフのままだと古いサポートライブラリを変換しきれず、Manifest が競合してしまったと推測。
gradle.properties
で android.enableJetifier=true
を指定し、旧サポートライブラリを AndroidX に自動変換するようにしました。
具体的な修正内容
postinstall スクリプト (scripts/postinstall.js
) を作成し、gradle.properties
に android.enableJetifier=true
がなければ追記するように設定。
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.json
の scripts
に、EAS ビルド時の後処理スクリプトとして設定
{
"scripts": {
"eas-build-post-install": "node ./scripts/postinstall.js"
}
}
Expo SDK のアップグレードで古いライブラリが残っているとき、AndroidX と旧サポートライブラリが衝突しやすい。
Jetifier を有効化する ことで、旧ライブラリを AndroidX に自動変換し、Manifest の競合を防げる。
Manifest Merge で appComponentFactory
衝突エラーが出たら、まずはこのあたりをチェックしてみるとよい。
LangJournalは、日記を書くことで英語やフランス語などの外国語を学べるアプリです。英語学習に興味がある方や、私が開発したこのアプリに関心を持っている方は、ぜひインストールしてお試しください。
LangJournalのサイトはこちら