./gradlew installRelease
を使用してAndroid apkを生成しようとすると、コンソールに次のエラーが表示されます。
~/React-Native/mockingbird/Android/app/build/intermediates/res/merged/release/drawable-mdpi-v4/src_resources_img_loading.gif: error: Duplicate file.
~/React-Native/mockingbird/Android/app/build/intermediates/res/merged/release/drawable-mdpi/src_resources_img_loading.gif: Original is here. The version qualifier may be implied.
Android StudioでBuild->Clean Project
を試し、再度./gradlew installRelease
を実行しました。それも機能しませんでした。
また、build
フォルダーを削除しようとしましたが、それも役に立ちません。
あなたにいくつかのヒントを与え、それがうまくいくことを願っています。
「react」で更新:「16.7.0」、「react-native」:「0.57.8」
カスタムnode_modules/react-native/react.gradle重複ファイルエラーを完全に解決します。次のコードをcurrentBundleTaskの作成ブロックに追加します(after doFirst block)
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("${resourcesDir}/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
自動的に実行するスクリプトを作成できます。
Android-react-gradle-fix
ファイルを作成しますAndroid-release-gradle-fix.js
ファイルpackage.json
ファイルを更新します。
「スクリプト」:{"postinstall": "node ./Android-release-gradle-fix.js"}、
それでおしまい! npm install
を実行して、すばらしい結果を得てください。
注: jenkinsのようなciでnpm install
を実行すると、エラーが発生する場合があります:postinstall: cannot run in wd %s %s (wd=%s) node
=>代わりにnpm install --unsafe-perm
を使用します
持っている可能性のあるファイルを削除します。
Android/app/src/main/res/drawable-mdpi/
Android/app/src/main/res/drawable-xhdpi/
Android/app/src/main/res/drawable-xxhdpi/
ビルドを再度実行します。これにより、問題が修正されました。
執筆時点で、React Nativeの最新バージョン(> 0.57.0)は、 changelogで示されるように、Gradleラッパーレベルを4.4に、Gradleプラグインを3.1.4に増やしました 。これには、Gradleビルドプロセスに、以前とは異なるディレクトリ内に、現在requiredであるAAPTの結果を保存させる効果があります。
Nhan Cao の awesome workaround に関しては、重複したリソースの衝突を防ぐためにわずかな変更を加える必要があります。アプリのgenerated
ディレクトリ。リソースが生成された後にこれらの重複ファイルがマージされるターゲットディレクトリを変更することで、リソースを重複除去できます。
既存のreact.gradle
は、以下のパスを参照します。
$buildDir === <project-working-directory>/Android/app/build
重複するファイルパスは、次の間に表示されます。
file("$buildDir/../src/main/res/drawable-${resSuffix}")
file("$buildDir/generated/res/react/release/drawable-${resSuffix}")
回避策として、次のようにNhanのソリューションを更新できます(react.gradle
のcurrentBundleTask
の宣言の後、doFirst
内にこれを必ず含めてください:
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
react-native bundle
の前に./gradlew assembleRelease
を実行しないでください。私にとっては、react-native bundle
を実行する前に./gradlew assembleRelease
を実行していました。
アセットの1つで同様の重複エラーメッセージが表示されていました。
./gradlew assembleRelease
の出力を見ると、JSバンドルを単独でビルドしている(apply from: "../node_modules/react-native/react.gradle"
ファイルのbuild.gradle
のおかげです)ので、手動でreact-native bundle
を手動で実行する必要はありませんでした。
react-native bundle
を実行する前に単に./gradlew assembleRelease
を実行しなかった場合、すべてがうまくいきました。
リリースAPKをテストし、すべての画像を含むJSバンドルが正常にロードされました。
私の唯一の懸念は、ソースマップ--sourcemap-output
(Bugsnag用)が作成されるかどうかです。そうでない場合は、./gradlew assembleRelease
でそれらを生成する方法があると確信しています。まだテストしていません。
ビルドをReact Native 0.57.5で機能させるために、 Mapsy の回答にマイナーな機能強化を加えました。複数のフレーバー向けにビルドできるようにする必要があり、一般的にハードコーディングを避けようとしています。 react.gradle
ファイルを調べると、次の変数が定義されていることがわかりました。
def resourcesDir = file("$buildDir/generated/res/react/${targetPath}")
したがって、次のようなパスでビルドタイプ/フレーバーをハードコーディングする代わりに:
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
代わりにresourcesDir
変数を使用して、次のようにoriginalDir
パスを設定しました。
File originalDir = file("${resourcesDir}/drawable-${resSuffix}");
その結果、doLast
は次のようになります。
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("${resourcesDir}/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
私にとっては、Android/build
フォルダーを削除し、./gradlew assembleRelease
を再度実行することです。
エラーを削除する方法は次のとおりです。
ただし、これは理想的なソリューションではありません。各画像には、すべてのデバイスサイズに対して1つの解像度しかありません。デバイスに対して大きすぎる画像の場合、デバイスにダウンスケーリングが残り、ダウンロードサイズと速度の問題が発生します。また、デバイスに対して小さすぎる画像の場合、画像品質が低下します。
私が見つけた便利なソリューションの1つは、Android Drawable ImporterというAndroid Studioプラグインを使用することです。インストール後に使用するには:
プラグインは、描画可能なフォルダの生成と正しい画像サイズを処理します。画像をインポートすると、重複リソースエラーなしでGradleのassembleReleaseを実行できるはずです。
プロジェクトをソース管理に配置します。 VS Codeツールでgitlanceプラグインを使用します。ステージ変更で新しく生成された画像ファイルを確認できます。すべてを削除し、再びbuidすることで問題を修正しました