React Native Android Duplicate file error when creating apk

When I try to create android apk using ./gradlew installRelease, I get this error in the console:

~/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.

I tried Build->Clean Projectthrough Android Studio and ran it again ./gradlew installRelease; that didn't work either.

In addition, I tried to delete the folder build, but that does not help either.

+55
source share
8 answers

Give some tips for you, hope this works.

Update using "reaction": "16.7.0", "reaction-native": "0.57.8"

_/-/ .gradle, Duplicate file. currentBundleTask ( doFirst)

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()
}

, .

  1. android-react-gradle-fix
  2. android-release-gradle-fix.js
  3. package.json:

    "": {    "postinstall": "node./android-release-gradle-fix.js" },

! npm install, .

: npm install ci, jenkins, : postinstall: cannot run in wd %s %s (wd=%s) node => npm install --unsafe-perm

+128

, :

android/app/src/main/res/drawable-mdpi/
android/app/src/main/res/drawable-xhdpi/
android/app/src/main/res/drawable-xxhdpi/

Build , .

+36

React Native (> 0.57.0) Gradle 4.4, Gradle - 3.1.4, changelog. Gradle AAPT, , , .

, , , , app 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 ( currentBundleTask doFirst react.gradle:

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()
}

/raw, :

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/release/${resSuffix}");
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/${resSuffix}");
            ant.move(file: originalDir, tofile: destDir);
        }
     }
     moveFunc.curry("drawable-ldpi").call()
     moveFunc.curry("drawable-mdpi").call()
     moveFunc.curry("drawable-hdpi").call()
     moveFunc.curry("drawable-xhdpi").call()
     moveFunc.curry("drawable-xxhdpi").call()
     moveFunc.curry("drawable-xxxhdpi").call()
     moveFunc.curry("raw").call()
}
+26

react-native bundle ./gradlew assembleRelease.

react-native bundle ./gradlew assembleRelease.

.

./gradlew assembleRelease, , JS- ( apply from: "../node_modules/react-native/react.gradle" build.gradle), react-native bundle .

react-native bundle ./gradlew assembleRelease, .

Release APK JS , .

, --sourcemap-output ( Bugsnag). , , , ./gradlew assembleRelease . .

+18

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()
        }
+6

, : android/build ./gradlew assembleRelease .

+4

:

  • android/app/src/main/res/drawable ( "drawable" , )
  • , (.. drawable-hdpi, drawable-mdpi ..)
  • (.. : …)
  • Gradles

, . , , , , , .

- Android Studio Android Drawable Importer. :

  • Android- : Android/App/SRC/Main/Res/Drawable
  • : ""> " "

The plugin will handle the creation of drawn folders and the correct image sizes. Once you have imported your image, you can run Gradles assemblyRelease without duplicate resource errors.

0
source

It worked for me to just add this extra command to package.jsonand use it to build:

    "android-build-release": "cd ./android && rm -rf app/src/main/res/drawable* && ./gradlew app:assembleRelease",

0
source

Source: https://habr.com/ru/post/1688644/


All Articles