webentwicklung-frage-antwort-db.com.de

Reagieren Sie native doppelte Ressourcen

Nach dem Upgrade auf React Native 0.57 stehe ich vor einem Problem, wenn ich APK in React-Native-Router-Flux generiere. Bei der Ausführung von.\Gradlew assembleRelease erhalte ich folgende Fehlermeldung: -

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeReleaseResources'.
> [drawable-mdpi-v4/node_modules_reactnativerouterflux_images_back_chevron] 
R:\Workings\lisecapps\androidrepo\test-react- 
native\venutest\Android\app\src\main\res\drawable- 
mdpi\node_modules_reactnativerouterflux_images_back_chevron.png      
[drawable-mdpi-v4/node_modules_reactnativerouterflux_images_back_chevron] 
R:\Workings\lisecapps\androidrepo\test-react- 
emirnative\venutest\Android\app\build\generated\res\react\release\drawable- 
mdpi-v4\node_modules_reactnativerouterflux_images_back_chevron.png: Error: 
Duplicate resources
[drawable-mdpi-v4/node_modules_reactnativerouterflux_images_menu_burger] 
R:\Workings\lisecapps\androidrepo\test-react-nat 
ive\venutest\Android\app\src\main\res\drawable- 
mdpi\node_modules_reactnativerouterflux_images_menu_burger.png        
[drawable-mdpi-v4/node_modules_reactnativerouterflux_images_menu_burger] 
R:\Workings\lisecapps\androidrepo\test-react- 
native\venutest\Android\app\build\generated\res\react\release\drawable-mdpi- 
v4\node_modules_reactnativerouterflux_images_menu_burger.png: Error: 
Duplicate resources

Ich habe versucht folgendes zu beheben, aber immer noch den gleichen Fehler: -

  • Es wurde versucht, ein Skript wie in der ersten Antwort here beschrieben zu erstellen, um ein doppeltes Kopieren von Asset-Bildern zu vermeiden.
  • Der gesamte App/Build-Ordner wurde gelöscht
6
anbu selvan

Sie müssen die generierten Ressourcen/Drawable entfernen und erneut generieren.

rm -rf Android/app/src/main/res/drawable-*
react-native bundle --platform Android --dev false --entry-file index.js --bundle-output Android/app/src/main/assets/index.Android.bundle --assets-dest Android/app/src/main/res/

Und kompiliere Android erneut react-native run-Android

2
Tung Duong

Sie können versuchen, den Catch-Speicher zu bereinigen und Knotenmodule erneut zu installieren 

watchman watch-del-all
rm -rf node_modules && npm install
rm -fr $TMPDIR/react-*
npm cache clean
npm start -- --reset-cache

Es ist Arbeit für mich.

2
Jay

[0.57] Hässlicher Workaround

Wenn Sie die reaktionsgenaue Version nicht zurücksetzen möchten, können Sie einfach den reakt.gradle auf die letzte funktionierende Version zurücksetzen. Das hat bei mir funktioniert.

Kopieren Sie den Git-Code nach node_modules/react-native/react.gradle

https://github.com/facebook/react-native/blob/2d9e2f30e17b8e79f2c44ef533ecdd550671304c/react.gradle

Wenn das Problem weiterhin besteht, versuchen Sie, die if (isAndroidLibrary) von doLast zu entfernen.

1
João Baraky

react.gradle erstellt automatisch Ihr Javascript und kopiert alle in Ihr Javascript importierten Ressourcen in den Build-Ordner. Stellen Sie also sicher, dass Sie NICHT react-native bundle manuell aufrufen und alle Dateien oder Ordner als src/main/res/drawable-* und src/main/assets/*.bundle löschen. Nehmen Sie die folgenden Änderungen in Ihrem app/bundle.gradle vor.

project.ext.react = [
  entryFile      : "index.js", // or index.Android.js
  bundleInRelease: true,
  bundleInDebug: true
]

apply from: "../../node_modules/react-native/react.gradle"

Hinweis: Bitte beachten Sie, dass einige reaktive Versionen ein Problem mit dem lokalen cli.js haben. Stellen Sie sicher, dass Sie ein Upgrade auf eine neuere Version durchführen oder versuchen Sie, die folgende Konfiguration hinzuzufügen

 project.ext.react = [
    // ...
    cliPath: "node_modules/react-native/local-cli/cli.js"
 ]
0

Ich benutze:

"react": "^16.5.2",
"react-native": "0.57.1",

Ich habe das build.gradle meiner App so geändert

ext.react = [
        entryFile: "index.js",
        bundleInRelease       : true,
        resourcesDirRelease   : "src/main/res"
]
apply plugin: 'com.Android.application'
import com.Android.build.OutputFile

//using custom react gradle here to get around https://stackoverflow.com/questions/52464842/react-native-duplicate-resources
apply from: "../react.gradle"
//apply from: "../../node_modules/react-native/react.gradle"
apply from: "../../node_modules/react-native-code-Push/Android/codepush.gradle"

und dann sieht mein benutzerdefiniertes reag.gradle so aus

import org.Apache.tools.ant.taskdefs.condition.Os

def config = project.hasProperty("react") ? project.react : [];

def cliPath = config.cliPath ?: "node_modules/react-native/local-cli/cli.js"
def bundleAssetName = config.bundleAssetName ?: "index.Android.bundle"
def entryFile = config.entryFile ?: "index.Android.js"
def bundleCommand = config.bundleCommand ?: "bundle"

// because elvis operator
def elvisFile(thing) {
    return thing ? file(thing) : null;
}

def reactRoot = elvisFile(config.root) ?: file("../../")
def inputExcludes = config.inputExcludes ?: ["Android/**", "ios/**"]
def bundleConfig = config.bundleConfig ? "${reactRoot}/${config.bundleConfig}" : null ;

void runBefore(String dependentTaskName, Task task) {
    Task dependentTask = tasks.findByPath(dependentTaskName);
    if (dependentTask != null) {
        dependentTask.dependsOn task
    }
}

afterEvaluate {
    def isAndroidLibrary = plugins.hasPlugin("com.Android.library")
    // Grab all build types and product flavors
    def buildTypes = Android.buildTypes.collect { type -> type.name }
    def productFlavors = Android.productFlavors.collect { flavor -> flavor.name }

    // When no product flavors defined, use empty
    if (!productFlavors) productFlavors.add('')

    productFlavors.each { productFlavorName ->
        buildTypes.each { buildTypeName ->
            // Create variant and target names
            def flavorNameCapitalized = "${productFlavorName.capitalize()}"
            def buildNameCapitalized = "${buildTypeName.capitalize()}"
            def targetName = "${flavorNameCapitalized}${buildNameCapitalized}"
            def targetPath = productFlavorName ?
                    "${productFlavorName}/${buildTypeName}" :
                    "${buildTypeName}"

            // React js bundle directories
            def jsBundleDirConfigName = "jsBundleDir${targetName}"
            def jsBundleDir = elvisFile(config."$jsBundleDirConfigName") ?:
                    file("$buildDir/intermediates/assets/${targetPath}")

            def resourcesDirConfigName = "resourcesDir${targetName}"
            def resourcesDir = elvisFile(config."${resourcesDirConfigName}") ?:
                    file("$buildDir/intermediates/res/merged/${targetPath}")
            def jsBundleFile = file("$jsBundleDir/$bundleAssetName")

            // Bundle task name for variant
            def bundleJsAndAssetsTaskName = "bundle${targetName}JsAndAssets"

            // Additional node and packager commandline arguments
            def nodeExecutableAndArgs = config.nodeExecutableAndArgs ?: ["node"]
            def extraPackagerArgs = config.extraPackagerArgs ?: []

            def currentBundleTask = tasks.create(
                    name: bundleJsAndAssetsTaskName,
                    type: Exec) {
                group = "react"
                description = "bundle JS and assets for ${targetName}."

                // Create dirs if they are not there (e.g. the "clean" task just ran)
                doFirst {
                    jsBundleDir.mkdirs()
                    resourcesDir.mkdirs()
                }

                // Set up inputs and outputs so gradle can cache the result
                inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
                outputs.dir jsBundleDir
                outputs.dir resourcesDir

                // Set up the call to the react-native cli
                workingDir reactRoot

                // Set up dev mode
                def devEnabled = !(config."devDisabledIn${targetName}"
                        || targetName.toLowerCase().contains("release"))

                def extraArgs = extraPackagerArgs;

                if (bundleConfig) {
                    extraArgs = extraArgs.clone()
                    extraArgs.add("--config");
                    extraArgs.add(bundleConfig);
                }

                if (Os.isFamily(Os.FAMILY_WINDOWS)) {
                    commandLine("cmd", "/c", *nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "Android", "--dev", "${devEnabled}",
                            "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
                } else {
                    commandLine(*nodeExecutableAndArgs, cliPath, bundleCommand, "--platform", "Android", "--dev", "${devEnabled}",
                            "--reset-cache", "--entry-file", entryFile, "--bundle-output", jsBundleFile, "--assets-dest", resourcesDir, *extraArgs)
                }

                enabled config."bundleIn${targetName}" ||
                        config."bundleIn${buildTypeName.capitalize()}" ?:
                        targetName.toLowerCase().contains("release")

            }

            // Hook bundle${productFlavor}${buildType}JsAndAssets into the Android build process
            currentBundleTask.dependsOn("merge${targetName}Resources")
            currentBundleTask.dependsOn("merge${targetName}Assets")

            runBefore("process${flavorNameCapitalized}Armeabi-v7a${buildNameCapitalized}Resources", currentBundleTask)
            runBefore("process${flavorNameCapitalized}X86${buildNameCapitalized}Resources", currentBundleTask)
            runBefore("processUniversal${targetName}Resources", currentBundleTask)
            runBefore("process${targetName}Resources", currentBundleTask)
            runBefore("dataBindingProcessLayouts${targetName}", currentBundleTask)
        }
    }
}
0
Zayin Krige

Es gibt eine andere Möglichkeit, dieses Problem zu lösen. Für mich hat das Hinzufügen von Code in Android/build.gradle meines Projekts funktioniert:

subprojects {
    afterEvaluate {project ->
        if (project.hasProperty("Android")) {
            Android {
                compileSdkVersion 27
                buildToolsVersion "27.0.2"
            }
        }
    }
}
0
Sandy