React-native: [Android] خطأ: موارد مكررة

تم إنشاؤها على ١٠ نوفمبر ٢٠١٨  ·  103تعليقات  ·  مصدر: facebook/react-native

بيئة

تفاعل معلومات البيئة الأصلية:

System:
  OS: macOS 10.14
  CPU: (4) x64 Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
  Memory: 103.10 MB / 8.00 GB
  Shell: 3.2.57 - /bin/bash
Binaries:
  Node: 8.12.0 - /usr/local/bin/node
  Yarn: 1.0.1 - /usr/local/bin/yarn
  npm: 6.4.1 - /usr/local/bin/npm
  Watchman: 4.7.0 - /usr/local/bin/watchman
SDKs:
  iOS SDK:
    Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
  Android SDK:
    API Levels: 16, 17, 19, 21, 23, 24, 25, 26, 27, 28
    Build Tools: 19.1.0, 20.0.0, 23.0.1, 23.0.2, 23.0.3, 25.0.0, 25.0.1, 25.0.2, 25.0.3, 26.0.0, 26.0.1, 26.0.2, 26.0.3, 27.0.0, 27.0.1, 27.0.3, 28.0.0, 28.0.0, 28.0.2, 28.0.3
    System Images: android-16 | ARM EABI v7a, android-16 | MIPS, android-16 | Intel x86 Atom, android-16 | Google APIs Intel x86 Atom, android-19 | Google APIs Intel x86 Atom, android-24 | Google Play Intel x86 Atom, android-26 | Google APIs Intel x86 Atom, android-26 | Google APIs Intel x86 Atom_64, android-26 | Google Play Intel x86 Atom, android-27 | Google Play Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-P | Google APIs Intel x86 Atom, android-P | Google Play Intel x86 Atom
IDEs:
  Android Studio: 3.2 AI-181.5540.7.32.5056338
  Xcode: 10.1/10B61 - /usr/bin/xcodebuild
npmPackages:
  react: 16.6.0-alpha.8af6728 => 16.6.0-alpha.8af6728 
  react-native: 0.57.4 => 0.57.4 
npmGlobalPackages:
  babel-preset-react-native: 4.0.0
  react-native-cli: 2.0.1
  react-native-create-library: 3.1.2
  react-native-git-upgrade: 0.2.7

وصف

لا يمكنني إنشاء إصدار apk مع صورة PNG في Android. ولكن يمكنه إنشاء ملف apk للإصدار في حالة عدم وجود صورة PNG فيه. هذا هو الخطأ الذي أواجهه أثناء إنشاء بنية الإصدار

[drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/src/main/res/drawable-mdpi/assets_mario.png [drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/build/generated/res/react/release/drawable-mdpi-v4/assets_mario.png: Error: Duplicate resources
:app:mergeReleaseResources FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':app:mergeReleaseResources'.
> [drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/src/main/res/drawable-mdpi/assets_mario.png   [drawable-mdpi-v4/assets_mario] /Users/jeffreyrajan/Tutorials/RN/errorCheck/android/app/build/generated/res/react/release/drawable-mdpi-v4/assets_mario.png: Error: Duplicate resources

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

نسخة تجريبية قابلة للتكرار

  1. إنشاء تطبيق - react-native init demo
  2. قم بإنشاء مجلد assets في المجلد الجذر للمشروع.
  3. أضف صورة PNG داخل مجلد الأصول.
  4. الآن قم بتنفيذ مكون image مع صورة PNG أعلاه.
  5. الآن قم بتجميعها باستخدام cmd
    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/
  6. ثم أنشئ إصدار apk باستخدام Generate Signed APK
Bug Android

التعليق الأكثر فائدة

يجب أن تساعد إجابة Mapsy https://stackoverflow.com/a/52750886
لذلك تقوم بتحرير ملف /node_modules/react-native/react.gradle
وأضف doLast مباشرة بعد كتلة doFirst يدويًا.

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

ال 103 كومينتر

تحقق من هذا https://github.com/facebook/react-native/issues/19239#issuecomment -414564404

تحتاج إلى إزالة صورة المجلد القابلة للرسم إذا كان هناك أي منها؟

@ ZeroCool00 لن يؤثر على الصور في Android؟

يجب أن تساعد إجابة Mapsy https://stackoverflow.com/a/52750886
لذلك تقوم بتحرير ملف /node_modules/react-native/react.gradle
وأضف doLast مباشرة بعد كتلة doFirst يدويًا.

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

@ ZeroCool00mkchx لقد راجعت كل من إجابتك ، إنها تعمل. شكرا جزيلا يا أصدقاء :)

مرحبًا بكم جميعًا ، كيف سنتمكن من إنجاز ذلك مع وظيفة جينكينز. نظرًا لأنه سيتم تثبيت npm دائمًا والذي يتجاوز هذا التغيير في ملف response.gradle. يمكننا إنشاء بناء على android studio لنظام android ولكن ليس ممكنًا على jenkins.

مرحبًا @ vivek-walecha-657 لم أجرب هذا ولكن يمكنك تجربة هذا الأمر لإنشاء تجميع في وضع عدم الاتصال

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle

jeffreyrajanofficial Thanx للكتابة ، سيساعد الحل الذي قدمته إذا ذهبنا وقمنا بتغيير ملف رد فعل. لكنني لا أرغب في إجراء الإصدار عن طريق تغيير ملف رد فعل.

jeffreyrajanofficial هل يمكنك من فضلك معرفة أي إصدار (أحدث أقل من هذا أو أعلى من هذا) يعمل بشكل جيد ، بدون هذه المشكلة. لأن ملاحظات الإصدار لا تخبرنا بأي شيء عن حل هذه المشكلة.

يتم فرز الأشياء الآن في RN> 57 ملف React.gradle يقوم تلقائيًا بإنشاء الحزمة.
لإنشاء إصدار ، لن تحتاج إلى تشغيل npm run build: android : release

استخدام الإصدار الأصلي للتفاعل 55.4 هنا هو نموذج جوهر المشروع الخاص بي لـ package.json مع الإصلاحات

https://gist.github.com/Abhishekgarg727/daf031fb9f94fdfd985e84db57dedbe1

ما زلت أرى هذا ، باستخدام macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. ربما لست الوحيد؟ أو ربما يمكن لشخص ما هنا تأكيد نجاحه ، لذا سأحفر أكثر وأصلحه بنفسي بشكل حقيقي.

أنا أعمل حاليًا على حلها مع حزمة "patch-package" جنبًا إلى جنب مع التصحيح المرفق بناءً على التعليق أعلاه من mkchx (مع .txt حتى يقبل github المرفق) من أجل التشغيل تلقائيًا إصلاحه عند "تثبيت npm" بعد إضافة postinstall: patch-package إلى سكربتات package.json الخاصة بي.

ربما هذا مفيد لشخص ما ...
رد فعل أصلي + 0.57.8.patch.txt

قم بإزالة الملفات التي قد تكون لديك على:

android / app / src / main / res / drawable-mdpi /
android / app / src / main / res / drawable-xhdpi /
android / app / src / main / res / drawable-xxhdpi /
شغّل Build مرة أخرى ، أدى هذا إلى إصلاح المشكلة بالنسبة لي

كنت ما زلت أرى هذا في RN0.58.x ويستمر في RN0.59.x - هل نفعل شيئًا خاطئًا هنا أم أن هذا خطأ حقًا؟

ما زلت أحقق النجاح مع الحل البديل من mkchx المشفر في شكل تصحيح في دليل التصحيحات للاستخدام مع وحدة حزمة التصحيح وهذا التصحيح (تم التحديث لـ RN0.59.1)

رد فعل أصلي + 0.59.1.patch.txt

إذا تمت إضافة موارد إضافية في مجلدات مخصصة ، فقد ترغب في تجربة شيء مثل هذا:

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

ولكن إذا كانت لديك تبعيات تقوم بتعبئة أصولها الخاصة ، فإنها لا تعمل ، ولا تزال تتلقى هذا الخطأ (تم تعديله للتوضيح):

Execution failed for task ':app:mergeReleaseResources'.

> [drawable-xxxhdpi-v4/node_modules_reactnavigationstack_dist_views_assets_backicon] 
/[...]/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigationstack_dist_views_assets_backicon.png

[drawable-xxxhdpi-v4/node_modules_reactnavigationstack_dist_views_assets_backicon] 
/[...]/android/app/build/generated/res/react/release/drawable-xxxhdpi/node_modules_reactnavigationstack_dist_views_assets_backicon.png: 

Error: Duplicate resources

هل يتم تقييم هذا بشكل نشط ، أم يجب علينا المضي قدمًا في التصحيحات الخاصة بنا؟

dragosroua أرى واصلة مفقودة في كاري xxxhdpi. من قبيل الصدفة نفس المسارات التي تؤدي إلى مشاكل بالنسبة لك؟

لقد هزمتني بدقيقتين ، كنت على وشك تعديل هذا الجزء. نعم ، كل شيء يتم تجميعه بشكل جيد الآن ، ولكن الجزء الذي يحتوي على مسار "خام" للموارد المخصصة قد يكون مفيدًا لشخص ما.

dragosroua سعيد لأنك تقوم

ما زلت أرى هذا ، باستخدام macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. ربما لست الوحيد؟ أو ربما يمكن لشخص ما هنا تأكيد نجاحه ، لذا سأحفر أكثر وأصلحه بنفسي بشكل حقيقي.

أنا أعمل حاليًا على حلها مع حزمة "patch-package" جنبًا إلى جنب مع التصحيح المرفق بناءً على التعليق أعلاه من mkchx (مع .txt حتى يقبل github المرفق) من أجل التشغيل تلقائيًا إصلاحه عند "تثبيت npm" بعد إضافة postinstall: patch-package إلى سكربتات package.json الخاصة بي.

ربما هذا مفيد لشخص ما ...
رد فعل أصلي + 0.57.8.patch.txt

أرجو أن تشرحوا لي لماذا لا يعمل 0.57.5 المتفاعل الأصلي الخاص بي؟
لقد قمت بإنشاء ملف pacth. تمت الإضافة إلى package.json. تشغيل تثبيت npm ونتيجة لذلك

        def currentBundleTask = tasks.create(
            name: "bundle${targetName}JsAndAssets",
            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.deleteDir()
                jsBundleDir.mkdirs()
                resourcesDir.deleteDir()
                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

بدون تغييرات ضرورية.

zakabluk ، ستحتاج إلى ترحيل ناتج تثبيت npm الخاص بك ، ولكن على سبيل التخمين ، فذلك لأن حزمة حزمة التصحيح حريصة جدًا بشأن أرقام الإصدارات. أنت تحاول 57.5 ولكن التصحيح ضد 57.8؟

عادةً ما أقوم بعمل نصوص بيثون لتصحيح العقدة_الوحدات.
أضف هذا كـ postinstall.py وأضفه إلى البرنامج النصي لما بعد التثبيت أو قم بتشغيله باستخدام ./postinstall.py

#!/usr/bin/env python3

import os
import textwrap

def file_dir():
  return os.path.dirname(os.path.realpath(__file__))

def read_file(filename):
    '''
    Reads the specified file.

    :param filename: The file to read
    :return: The content of the specified file
    '''
    if os.path.exists(filename):
        with open(filename, "r") as file:
            return file.read()
    else:
        raise IOError("file {} not found.".format(filename))

def write_file(filename, text):
    '''
    Writes the specified text to the specified file.

    :param filename: The file to write to
    :param text: The text to write
    '''
    with open(filename, "w") as file:
        file.write(text)

def fix_android_assets():
  print("Fixing android error with duplicate assets: https://github.com/facebook/react-native/issues/22234")

  gradle_file_path = "{}/node_modules/react-native/react.gradle".format(file_dir())

  code_snippet = textwrap.indent("""\
            // Added by post_install
            // Fix for: https://github.com/facebook/react-native/issues/22234
            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()
            }
  """, "")

  text = read_file(gradle_file_path)

  start = text.find("doFirst", 0)
  end = text.find("}", start)
  end = text.find("\n", end) + 1

  text = text[:end] + code_snippet + text[end:]

  write_file(gradle_file_path, text)

def main():
    fix_android_assets()

if __name__ == "__main__":
    main()

هنا يمكنك إضافة البرامج النصية الخاصة بك إذا لزم الأمر

يبدو أنه إعادة تنفيذ لما تحصل عليه باستخدام npm install patch-package ولكن إذا كان Python هو الشيء الذي تفضله وتريد الاحتفاظ بمزيد من التعليمات البرمجية بنفسك ، فهذا يبدو قابلاً للتطبيق. ما زلت أستخدم حزمة التصحيح لما تستحقه ، مع 0.59.3 مثل ذلك
رد فعل أصلي + 0.59.3.patch.txt

hramos - # 19239 كان مشابهًا (على ما أعتقد) وهذا طويل الأمد ولكن يبدو أنه يحتوي على حل. هل هذا يحتاج فقط إلى PR لإصلاح نهائي أم أنني أفتقد سببًا يجعل التصحيح المستخدم هنا غير قابل للتطبيق؟ (ربما اكون). إذا احتجنا فقط إلى PR ، يمكنني إرسال واحدة في ...

يبدو أنه إعادة تنفيذ لما تحصل عليه باستخدام npm install patch-package ولكن إذا كان Python هو الشيء الذي تفضله وتريد الاحتفاظ بمزيد من التعليمات البرمجية بنفسك ، فهذا يبدو قابلاً للتطبيق. ما زلت أستخدم حزمة التصحيح لما تستحقه ، مع 0.59.3 مثل ذلك
رد فعل أصلي + 0.59.3.patch.txt

hramos - # 19239 كان مشابهًا (على ما أعتقد) وهذا طويل الأمد ولكن يبدو أنه يحتوي على حل. هل هذا يحتاج فقط إلى PR لإصلاح نهائي أم أنني أفتقد سببًا يجعل التصحيح المستخدم هنا غير قابل للتطبيق؟ (ربما اكون). إذا احتجنا فقط إلى PR ، يمكنني إرسال واحدة في ...

كيف تستخدم هذا الطريق ، شكرا

ZhanRu - https://github.com/ds300/patch-package#set -up - أنت فقط تريد وضع هذا التصحيح (بامتداد .patch) في دليل "patches" في مشروعك بعد تثبيت التصحيح وإعداده- صفقة

ZhanRu - https://github.com/ds300/patch-package#set -up - أنت فقط تريد وضع هذا التصحيح (بامتداد .patch) في دليل "patches" في مشروعك بعد تثبيت التصحيح وإعداده- صفقة

شكرا جزيلا

بالنسبة لأي شخص لا يزال يتابع ، قمت مؤخرًا بدمج نظام خارجي واحتجت إلى فصل اختباري عن بيانات الإنتاج الخارجية ، مما يؤدي إلى استخدام "نكهات" في gradle حتى تتمكن من الحصول على qaDebug ، و stagingRelease ، إلخ ، للإشارة إلى نظام خارجي مختلف. لم يدعم التصحيح هنا ذلك ، لذلك أضفت دعمًا للنكهة ، ويبدو التصحيح الخاص بي هكذا الآن. إنه موجود في patches/react-native+0.59.5.patch حيث يتم تطبيقه خلال npm i بعد npm install patch-package

diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 4ead2b6..e0f92b7 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -48,6 +48,33 @@ afterEvaluate {
                 resourcesDir.mkdirs()
             }

+            // From https://stackoverflow.com/questions/53239705/react-native-error-duplicate-resources-android
+            // Currently has no solution?
+
+            // IF you are using flavors, add flavor name to the path you move from
+            def flavorPathSegment = ""
+            android.productFlavors.all { flavor ->
+                if (targetName.toLowerCase().contains(flavor.name)) {
+                    flavorPathSegment = flavor.name + "/"
+                }
+            }
+
+            doLast {
+                def moveFunc = { resSuffix ->
+                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}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()
+            }
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)

في حالتي ، استمرت المشكلة مع الدليل raw .

الإصدار: react-native 0.59.5

بلدي الحل:

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);                                           
    }
  } 
  def moveRawFunc = { dir ->                                                                   
    File originalDir = file("$buildDir/generated/res/react/release/${dir}");     
    if (originalDir.exists()) {                                                                 
      File destDir = file("$buildDir/../src/main/res/${dir}");                 
      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()
  moveRawFunc.curry("raw").call()
}

مع تحياتي

Dbroqua نجح حلك بالنسبة لي (الإصدار react-native 0.59.5 ). شكرا لك.

مثير جدًا للاهتمام - لم أواجه مشكلة مع Raw - اعلم أن أحدث إصدار من التصحيح أضاف دعمًا للنكهات. إذا بدأت في عمل النكهات ، فستحتاج إلى دعم النكهة الآن في كلتا الوظيفتين. ربما يمكن تحديد المعلمات بطريقة أو بأخرى ، لذا فإن المرحلتين ليستا متكررتين ولكنني لست جيدًا بما يكفي للتفكير فيه.

يمكنني فقط أن أتخيل أن هذه ليست مشكلة في facebook وعلى التفاعل الأصلي CI لأنهم يستخدمون BUCK و CI يبني نظيفًا في كل مرة. هل لدى أي شخص نسخة نظيفة من هذا حتى نتمكن من الحصول على إصلاح في المنبع؟

في حالتي ، يحتوي الدليل الخام على بعض ملفات mp3 المستخدمة في تطبيقي.

قد يشكل ذلك أساسًا سريعًا وسهلًا عندئذٍ. ليس لدي أصول من هذا القبيل (حتى الآن) ولكن من السهل بما يكفي للتفاعل الأصلي في عملية إعادة الشراء ، ووضع بعض الأصول فيها ، وأعتقد أنه في الإصدار الثاني (ربما حتى الأول؟)

Dbroqua فقط ذكرك للأدلة الأولية التي ترتبط ارتباطًا وثيقًا جدًا ولكن غير مدرجة في التصحيح الخاص بي ينعكس أيضًا في الدمج. الآن بعد أن أصبح التصحيح الخاص بي قيد التشغيل ، قد ترغب في معرفة التغيير المطلوب للدليل الخام واقتراح علاقات عامة مع استمرار الإصلاح ، وتمديده لحالتك؟

حسنا،

سأفعل ما يلزم في أسرع وقت ممكن.

مع تحياتي،
داميان

ثابت!

في حالتي ، كانت هناك ملفات في الدلائل res/drawable-* التي كانت باقية من بعض المطورين الآخرين في التزام فريقي - لقد تلقيت رسالة "خطأ: تكرار الموارد" تشير إلى أسماء الملفات هذه - لقد حذفت الملفات من العناصر القابلة للرسم وكل شيء يعمل بشكل جيد

يجب أن تساعد إجابة Mapsy https://stackoverflow.com/a/52750886
لذلك تقوم بتحرير ملف /node_modules/react-native/react.gradle
وأضف doLast مباشرة بعد كتلة doFirst يدويًا.

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

لا تعمل لدي.

@ Nextt1 ستحتاج إلى فتح إصدار جديد - مع حالة اختبار

مرحبًا بالجميع - تم دمج العلاقات العامة التي اقترحتها لإصلاح هذا ولكن من الواضح أنها تسبب في حدوث تراجع - https://github.com/facebook/react-native/issues/25325 - أنا أقوم بالتحقيق ولكن إذا كان هناك أي معلمين متدرجين هنا الآن كيفية إصلاح هذه المشكلة دون التسبب في هذا التراجع ، سنكون ممتنين للمساعدة - شكرًا!

حسنًا ، العلاقات العامة ذات الصلة هنا سوف يكون لها "عودة إلى العلاقات العامة" - إنها تسبب تراجعًا ، والمشكلة الأساسية التي تسببت في هذه المشكلة كانت وثائق سيئة حقًا.

إليك الشيء: يجب ألا تنسخ الأشياء أبدًا في دليل src أثناء الإنشاء حقًا. تحتاج إلى نسخ الأشياء إلى وسائط وسيطة وما إلى ذلك. إذا كنت قد نسخت بالفعل أشياء إلى src (من الإصدارات السابقة باستخدام هذا التصحيح ، أو من أمر حزمة تفاعل أصلي): فأنت بحاجة إلى مسح تلك الأشياء بحيث يكون src / main / res الدليل نظيف - الأصول الحقيقية فقط من مشروعك

الآن ، لإنشاء ملف APK مع حزمة غير متصلة بالإنترنت - حتى في dev حتى تتمكن من تشغيله على API <17 ، يجب أن تفعل الأشياء بشكل مختلف عما يوصي به أي شخص على الويب (أو ستواجه هذه المشكلة).

ما تريده هو هذا في android/app/build.gradle :

project.ext.react = [

        // This is what most people will need
        bundleInDebug: project.hasProperty("bundleInDebug") ? project.getProperty("bundleInDebug") : false,

        // If you use build variants it has to be like this - put your own names in there
        bundleInDevDebug: project.hasProperty("bundleInDevDebug") ? project.getProperty("bundleInDevDebug") : false,
        bundleInQaDebug: project.hasProperty("bundleInQaDebug") ? project.getProperty("bundleInQaDebug") : false,
        bundleInStagingDebug: project.hasProperty("bundleInStagingDebug") ? project.getProperty("bundleInStagingDebug") : false,
        bundleInProdDebug: project.hasProperty("bundleInProdDebug") ? project.getProperty("bundleInProdDebug") : false
]

ثم تقوم باستدعاء react-native شيئًا من هذا القبيل - إرسال خاصية مشروع gradle عبر متغير بيئة:
ORG_GRADLE_PROJECT_bundleInDebug=true npx react-native run-android

(أو للمتغيرات شيء مثل هذا ORG_GRADLE_PROJECT_bundleInDevDebug=true npx react-native run-android --variant devDebug )

ما زلت أرى هذا ، باستخدام macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3. ربما لست الوحيد؟ أو ربما يمكن لشخص ما هنا تأكيد نجاحه ، لذا سأحفر أكثر وأصلحه بنفسي بشكل حقيقي.

أنا أعمل حاليًا على حلها مع حزمة "patch-package" جنبًا إلى جنب مع التصحيح المرفق بناءً على التعليق أعلاه من mkchx (مع .txt حتى يقبل github المرفق) من أجل التشغيل تلقائيًا إصلاحه عند "تثبيت npm" بعد إضافة postinstall: patch-package إلى سكربتات package.json الخاصة بي.

ربما هذا مفيد لشخص ما ...
رد فعل أصلي + 0.57.8.patch.txt

رائع! في الوقت الحالي ، إنها أفضل إجابة!

ما زلت أرى هذا في 0.59.9. حلّت إجابة

juliancorreascgough فقط كن حذرا مع ذلك، تابعت أن أسلوب حل لنهايته كاملة مع قبول PR حتى، ولكن بعد متابعة مشاكل نحن في حاجة للعودة إليها. إنه حل مسدود. لقد نشرت التفاصيل الكاملة للحل الموصى به حاليًا بعض التعليقات أعلاه ولا يمكنني إلا التوصية بالنمط الجديد. إذا كنت تستخدم التصحيح المرفق القديم الخاص بي بناءً على mkchx ، فستعمل الإجابة لك ، في الوقت الحالي ، ولكن فقط في ظل ظروف معينة - يفشل في السيناريوهات الشائعة الأخرى التي قد يحتاجها مشروعك في المستقبل

mikehardy حسنًا -
أعتقد أن ما أريده حقًا هو إنشاء ملف APK موقّع من Android Studio لتخطي الحزمة (كما أفعل ذلك يدويًا عبر الجهاز).
سألقي نظرة على الإعدادات التي قدمتها ومعرفة ما إذا كانت تساعد.

ما زلت أواجه مشكلة مع هذا ...
لا يمكنني إنشاء ملف APK الخاص بالإصدار. أحصل على الخطأ التالي لكل ملف أصل:

[drawable-mdpi-v4/filename] /Users/me/React/myapp/android/app/src/main/res/drawable-mdpi/filename.png
[drawable-mdpi-v4/filename] /Users/me/React/myapp/android/app/build/generated/res/react/release/drawable-mdpi/filename.png : خطأ: موارد مكررة

لقد قمت بحذف كلتا الحالتين من مجلدات drawable-mdpi لكن إنشاء APK يعيدهما ويظهر أخطاء.
أقوم بتشغيل ما يلي يدويًا لإنشاء الحزمة الخاصة بي:

react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/

في تطبيق gradle لدي:

project.ext.react = [
    entryFile: "index.android.js",
    bundleInRelease: true    //I've tried true and false here
]

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

تمامًا كمعلومات إضافية - يتم إنشاء تطبيقي جيدًا في تصحيح الأخطاء (عبر react-native run-android )
في لحظة الطريقة الوحيدة التي يمكنني الحصول على بلدي الإفراج APK إلى البناء هو عن طريق doLast عادت الإصلاح PR أعلاه.

أعتقد أنه قد يكون لدي سبب / حل لمشكلتي على الأقل.

دفع أمر الحزمة القديم (الذي استخدمته منذ RN 0.2.x ؟!) الأصول إلى مجلد الوجهة android/app/src/main/res/

لقد لاحظت منشورًا على الرابط أدناه يوضح أن> RN 57 يحتاج بالفعل إلى أصول مدفوعة إلى المجلد التالي:
android/app/build/intermediates/res/merged/release/

المصدر: https://github.com/facebook/react-native/issues/19211#issuecomment -448301870

قمت بما يلي:

  • حذف الأصول drawable-mdpi التي تم نسخها إلى android/app/src/main/res/
  • تحديث أمر الحزمة الخاص بي لاستخدام موقع المجلد الجديد
  • يبني ملف APK الخاص بي الآن ... (_ أنا على وشك اختباره_)

تحديث
تم تثبيت APK ولكن التطبيق يتعطل الآن باستثناء:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView

... لذلك يبدو أنه لا يمكن العثور على الصور 😞

التحديث 2
الطريقة الوحيدة التي تمكنت من خلالها تشغيل ملف APK (حتى الآن) هي القيام بما يلي:

  • قم بإعادة استدعاء الحزمة الخاص بي لاستخدام ما يلي للأصول: android/app/src/main/res/
  • قم بتشغيل أمر الحزمة
  • أعد تسمية android/app/src/main/res/drawable-mdpi إلى android/app/src/main/res/drawable-hdpi
  • إنشاء ملف APK الموقع

أبني gradle هو:

project.ext.react = [
    entryFile: "index.android.js"
]

يقوم ملف APK بعد ذلك بإنشاء وتشغيل ...

ملاحظة جانبية:
لقد ظهرت لي مشكلة غير متوقعة نتج عنها استثناء OutOfMemory createBitmap على مكون شريط تمرير الصورة.
لقد أضفت ما يلي إلى البيان الخاص بي وسيتم تشغيل التطبيق مرة أخرى: android:largeHeap="true"
أدرك أن الإضافة تتجاوز ما يمكن أن يكون مشكلة تسرب / مكون ولكن التطبيق يعمل حتى الآن بدون مشكلة مرة أخرى.

في React Native 0.60.0 ، لاحظت أن القاعدة الأصلية تقوم أيضًا بإنشاء موارد مكررة ولكن الحل أعلاه لن يعمل لأنه يستهدف المجلد الأولي.

[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] C: \ Projects \ some-app \ CLIENT \ android \ app \ src \ main \ resrawnode_modules_nativebase_dist_src_basic_icon_nbicons.json
[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] C: \ Projects \ some-app \ CLIENT \ android \ app \ build \ created \ res \ reactionreleaserawnode_modules_nativebase_dist_src_basic_icon_nbicons.json: خطأ: تكرار الموارد

للمستخدمين الآخرين الذين لديهم هذه المشكلة:

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

            File originalDir = file("$buildDir/generated/res/react/release/raw");
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/raw");
                    ant.move(file: originalDir, tofile: destDir);
            }
        }

كيف يمكننا حل هذا إذا كنا نستخدم CI؟

في حالتي ، استمرت المشكلة مع الدليل raw .

الإصدار: react-native 0.59.5

بلدي الحل:

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);                                           
    }
  } 
  def moveRawFunc = { dir ->                                                                   
    File originalDir = file("$buildDir/generated/res/react/release/${dir}");     
    if (originalDir.exists()) {                                                                 
      File destDir = file("$buildDir/../src/main/res/${dir}");                 
      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()
  moveRawFunc.curry("raw").call()
}

مع تحياتي

هذا يعمل!

[drawable-mdpi-v4/node_modules_reactnativemaplink_src_images_uber] /Users/umair/my-app/android/app/src/main/res/drawable-mdpi/node_modules_reactnativemaplink_src_images_uber.png   [drawable-mdpi-v4/node_modules_reactnativemaplink_src_images_uber] /Users/umair/my-app/android/app/build/generated/res/react/debug/drawable-mdpi/node_modules_reactnativemaplink_src_images_uber.png: Error: Duplicate resources

يظهر لي هذا الخطأ عند تشغيل react-native run-android ولكن ليس عند إنشاء إصدار الإصدار وتشغيله. لا يعمل أي من الحلول المذكورة أعلاه بالنسبة لي.

RN 0.60.5

تحديث: أدركت أنه يجب علي تعديل طرق "التصحيح" أعلاه لاستشهاد الدلائل debug بدلاً من الدلائل release وقد تم إصلاح ذلك. أنا أيضًا اضطررت إلى إصلاح دليلي raw

لدي أيضًا نفس المشكلة وأتفاعل. لن يصلح التصحيح البديل. في حالتي ، فإن مواردي المكررة هي ملفات .OBJ و .MTL ، ليس لدي أي مشاكل مع موارد الصور.

[raw / asset_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salad_salad.mtl [raw / asset_res_salad_salad] / Users / sercanov / diner / Projects / ARt /android/app/src/main/res/raw/assets_res_salad_salad.obj: خطأ: موارد مكررة
[raw / sources_res_steak_steak] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_steak_steak.mtl [raw / asset_res_steak_steak] / Users / sercanov / Projects / ARt / diner / Diner /android/app/src/main/res/raw/assets_res_steak_steak.obj: خطأ: موارد مكررة
[raw / asset_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salmon_salmon.mtl [raw / plants_res_salmon_salmon] / Users / sercanov / Diner / ARt /android/app/src/main/res/raw/assets_res_salmon_salmon.obj: خطأ: موارد مكررة

sercanov هل ما زلت تحاول استخدام النسخة في src؟ تم التحقيق في هذا النمط وفشل لأسباب معروفة ، فهناك طرق مدعومة للبناء لا تضع الأشياء في src - أو هل تحاول تلك الطرق التي لا تستخدم النسخ إلى src وما زلت تفشل؟ https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

heymikehardy جرب بالفعل كلا الطريقتين ، ولم ينجح أي منهما في إنشاء الإصدارات. يعمل بشكل جيد في وضع التصحيح راجع للشغل.

عند استخدام طريقة not-copy-to-src ORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease أحصل على هذا ؛

فشل تنفيذ المهمة ': app: mergeArReleaseResources '.
[raw / sources_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.mtl [raw / asset_res_salad_salad] / Users / sercanov /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.obj: خطأ: موارد مكررة
[raw / sources_res_steak_steak] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.mtl [raw / sources_res_steak_steak] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.obj: خطأ: موارد مكررة
[raw / sources_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.mtl [raw / plants_res_salmon_salmonov] / Users / /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.obj: خطأ: موارد مكررة

عند استخدام طريقة النسخ إلى src doLast ؛ اضطررت إلى مسح مجلد android / build في كل مرة أقوم بإنشائها لإنجاحها ولكن بطريقة ما لم تكن الأصول متاحة في التطبيق. قد يكون هذا متعلقًا بالشفرة الخاصة بي ، وأجري حاليًا تحريًا عنها.

عند التبديل إلى طريقة عدم النسخ إلى src ، يجب عليك تنظيف كل شيء أولاً ، لإجراء التبديل. كان مشروعي يحتوي على الكثير من "القمامة" من منظور التجميع من نمط النسخ إلى src السابق الذي كان عليّ تنظيفه قبل أن يعمل ، ثم نجح في كل مرة.

@ rahulkumar1409 ساعدني هذا في هذا الخطأ ولكنه

المهمة: رد فعل-أصلي-بسيط- تنزيل- مدير: التحقق من تحرير الموارد فشل

هل لديك اي فكرة لماذا حدث هذا ؟؟

عملت هذا الحل بالنسبة لي.
لذا فأنت تقوم بتحرير ملف /node_modules/react-native/react.gradle
وأضف doLast مباشرة بعد كتلة doFirst يدويًا.

افعل اولا { ... }
افعل آخر {
def moveFunc = {resSuffix ->
ملف originalDir = ملف ("$ buildDir / created / res / رد فعل / release / drawable - $ {resSuffix}")؛
إذا (originalDir.exists ()) {
ملف destDir = file ("$ buildDir /../ src / main / res / drawable - $ {resSuffix}") ؛
ant.move (ملف: 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 ()
}

نحن على التفاعل الأصلي 0.60.5.

نحن نستخدم نكهات المنتج تمامًا مثل mikehardy المذكور ولدينا مشاكل مع المجلد "raw" تمامًا مثل Dbroqua من ذوي الخبرة.

انتهى بي الأمر بخلط كلا الحلين ونستخدم هذا الرمز:

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
            ant.move(file: originalDir, tofile: destDir)
        }
    }
    def moveRawFunc = { dir ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/${dir}")
            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()
    moveRawFunc.curry("raw").call()
}

لقد كان هذا الموضوع مفيدًا حقًا ، شكرًا للجميع على المساهمة. 😄

أحصل على الخطأ المكرر فقط في إصدارات الإصدار. أنا أستخدم التفاعل الأصلي 60.5

/release/drawable-xhdpi/node_modules_reactnavigationstack_lib_module_views_assets_backicon.png: خطأ: موارد مكررة

لقد حاولت تعيين bundleInDebug على صواب وخطأ ولكن بدون أي تأثير.

أنا أقوم بإنشاء باستخدام مركز التطبيقات ، وهذا يتطلب ملف src / main / الأصول / appcenter-config.json. لدي أيضًا دليل src / main / الأصول / الخطوط لأنني أستخدم الخطوط المخصصة. هل هذا من المحتمل أن يسبب المشكلة؟

ARichIVC أظن أن المشكلة هي الملف المشار إليه في رسالة الخطأ الخاصة بك.

يبدو أن معيار "src / directory الخاص بي ملوث من المحاولات السابقة لنمط النسخ للتعامل مع مشكلة حزم الحزمة" من هذا الحل الأصلي قبل أن ندرك جميعًا أنه حل مسدود وتحتاج إلى مسح src / من تلك المنسوخة الأشياء قبل تجربة حل المتابعة الخاص بتنفيذ أشياء bundleInDebug. كل شيء في هذا الموضوع الذي هو للأسف غير عملي وطويل ، لكن المعلومات موجودة هناك

شكرا mikehardy لمساعدتكم. لقد وجدت أنه من الجيد ترك الخطوط وما إلى ذلك في دليل الأصول ولكني كنت بحاجة إلى حذف البتات والقطع الأخرى المعلقة. أي كل شيء في \ android \ app \ src \ main \ res \ drawable-hdpi \

لاحظ أنه حتى بالنسبة للخطوط يجب أن تكون في الدليل الصحيح - مثال: https://github.com/oblador/react-native-vector-icons#android الذي يوجهك لاستدعاء هذا الملف الذي يتم نسخه بعناية إلى ملف non-src الدليل https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16 - مشروع الجميع مختلف بالطبع ، لكنني اعتقدت أنه يستحق الذكر

نحن على التفاعل الأصلي 0.60.5.

نحن نستخدم نكهات المنتج تمامًا مثل mikehardy المذكور ولدينا مشاكل مع المجلد "raw" تمامًا مثل Dbroqua من ذوي الخبرة.

انتهى بي الأمر بخلط كلا الحلين ونستخدم هذا الرمز:

doLast {
    def moveFunc = { resSuffix ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
            ant.move(file: originalDir, tofile: destDir)
        }
    }
    def moveRawFunc = { dir ->
        File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
        if (originalDir.exists()) {
            File destDir = file("$buildDir/../src/main/res/${dir}")
            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()
    moveRawFunc.curry("raw").call()
}

لقد كان هذا الموضوع مفيدًا حقًا ، شكرًا للجميع على المساهمة. 😄

إنها تعمل! شكرا جزيلا! 👍

للتفاعل الأصلي 0.59.1 أو أكبر ، تحتاج إلى إضافة الكود أدناه في رد فعل. ترتيب في node_modules / رد فعل أصلي.

للاستخدام المنكه أدناه الكود.

        def flavorPathSegment = ""
        android.productFlavors.all { flavor ->
            if (targetName.toLowerCase().contains(flavor.name)) {
                flavorPathSegment = flavor.name
           }
        }
        doLast {
            def moveFunc = { resSuffix ->
                File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}/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()
        }

@ dayachand-systematix هذه النصيحة السيئة. تم متابعة حل الأسلوب هذا إلى النقطة التي كان بها علاقات عامة وتم دمجها حتى. ثم تم اكتشاف أنه كان الاتجاه الخاطئ وتم إرجاع العلاقات العامة. هل تنصح الأشخاص باستخدام حل تسبب بالفعل في التراجع عن دمج العلاقات العامة؟ وأود أن لا. https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

mikehardy نعم أعلم أن هذا ليس حلاً دائمًا ولكنه يعمل بشكل جيد. وأيضًا لا يمكنني استخدام الحل الخاص بك لأن لدي بعض الملفات الأخرى مثل شاشات البداية و DB في دليل الدقة .

نعم @ dayachand-systematix me أيضًا:

mike<strong i="6">@isabela</strong>:~/work/Kullki/ksocialscore/packages/public-app/android/app (lerna-import) % find . -type f |grep res
./src/main/res/drawable-xhdpi/minilogo_bw.png
./src/main/res/mipmap-xxhdpi/ic_launcher.png
./src/main/res/values-v21/styles.xml
./src/main/res/drawable-xxhdpi/minilogo_bw.png
./src/main/res/drawable-xxhdpi/kscore_splash.png
./src/main/res/drawable-hdpi/minilogo_bw.png
./src/main/res/mipmap-xxxhdpi/ic_launcher.png
./src/main/res/mipmap-hdpi/ic_launcher.png
./src/main/res/layout/launch_screen.xml
./src/main/res/drawable/background_launch.xml
./src/main/res/values/colors.xml
./src/main/res/values/styles.xml
./src/main/res/values/strings.xml
./src/main/res/mipmap-xhdpi/ic_launcher.png
./src/main/res/xml/filepaths.xml
./src/main/res/xml/react_native_config.xml
./src/main/res/drawable-mdpi/minilogo_bw.png
./src/main/res/drawable-xxxhdpi/minilogo_bw.png
./src/main/res/mipmap-mdpi/ic_launcher.png
./src/qa/res/mipmap-xxhdpi/ic_launcher.png
./src/qa/res/mipmap-xxxhdpi/ic_launcher.png
./src/qa/res/mipmap-hdpi/ic_launcher.png
./src/qa/res/values/strings.xml
./src/qa/res/mipmap-xhdpi/ic_launcher.png
./src/qa/res/mipmap-mdpi/ic_launcher.png
./src/debug/res/xml/react_native_config.xml
./src/staging/res/mipmap-xxhdpi/ic_launcher.png
./src/staging/res/mipmap-xxxhdpi/ic_launcher.png
./src/staging/res/mipmap-hdpi/ic_launcher.png
./src/staging/res/values/strings.xml
./src/staging/res/mipmap-xhdpi/ic_launcher.png
./src/staging/res/mipmap-mdpi/ic_launcher.png
./src/dev/res/mipmap-xxhdpi/ic_launcher.png
./src/dev/res/mipmap-xxxhdpi/ic_launcher.png
./src/dev/res/mipmap-hdpi/ic_launcher.png
./src/dev/res/values/strings.xml
./src/dev/res/mipmap-xhdpi/ic_launcher.png
./src/dev/res/mipmap-mdpi/ic_launcher.png

ولا يزال الحل المقترح / غير المعاد للعلاقات العامة مناسبًا لي: man_shrugging:

حسنًا ، أصلحناها بإزالة المعلمة --asset-dest :

react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle

@ hery-finimize hi - لن تؤدي إزالة المعلمة --asset-dest إلى عدم تجميع الأصول الأخيرة في المكان الصحيح ... لذلك عند إنشاء ملف APK الخاص بك ، سيكون هناك خطر فقدان / نفاد تاريخ ملفات الأصول في التطبيق؟

scgough اعتقدت أن هذا قد يكون هو الحال. إذا كان الأمر كذلك ، يمكننا بشكل انتقائي إزالة جميع الأصول المكررة باستثناء الأصول المحلية التي نحتاجها قبل الإنشاء باستخدام Android Studio أو أيًا كان سير عمل الإنتاج ، على سبيل المثال

find android/app/src/main/res/drawable-* \( -name launch_screen.png -o -name ic_stat_onesignal_default.png -prune \) -o -type f -exec rm {} +

ليست مثالية ولكن يجب أن تعمل حتى يتم حل هذا.

تحدث هذه المشكلة عندما يكون لديك ملفات بنفس الاسم وامتداد مختلف في مجلد الأصول من هذا القبيل

back.png
back.jpg

لأن كلاهما في android يتصلان بهذا الشكل ؛

R.drawable.back
R.drawable.back

إزالة أو إعادة تسمية أحد الملفات.

مرحبا،
لقد حاولت تعديل رد فعل gradle: يذهب البناء خطوة أخرى إلى الأمام (التطبيق app.aab هو إنشاء ولكن لا يمكنني إنشاء ملف APK.

لقد حاولت إنشاء APK باستخدام Android Studio ولم تكن هناك مشكلة (مع التصحيح للتفاعل. gradle).
إنه أمر غريب بالنسبة لي لأن عملية إنشاء APK يجب أن تكون هي نفسها في كلتا الحالتين. هل انا مخطئ

عمل هذا التعليق 0.59.10. مختلطة مع هذا جوهر .

شكرا جزيلا ، @ dayachand-systematix!

ما نجح معي هو مزيج من تعليقين:

ألصق هذا هنا لأي شخص آخر قد يحتاج إليه.

""
def flavourPathSegment = ""
android.productFlavors.all {flavour ->
إذا كان (targetName.toLowerCase (). يحتوي على (flavour.name)) {
flavourPathSegment = flavour.name
}
}

        doLast {
            def moveFunc = { resSuffix ->
                File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                    ant.move(file: originalDir, tofile: destDir)
                }
            }
            def moveRawFunc = { dir ->
                File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                if (originalDir.exists()) {
                    File destDir = file("$buildDir/../src/main/res/${dir}")
                    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()
            moveRawFunc.curry("raw").call()
        }

AbhishekNairOfficial أين تضع هذا؟

AbhishekNairOfficial أين تضع هذا؟

node_modules / رد فعل أصلي / رد فعل.

ضع هذا بعد كتلة doFirst ()

AbhishekNairOfficial أين تضع هذا؟

node_modules / رد فعل أصلي / رد فعل.

ضع هذا بعد كتلة doFirst ()

أعتقد أنها ليست الطريقة الصحيحة لحل هذه المشكلة. لأن هذا التغيير سيتم تجاوزه في npm install . حتى ، لن تعمل CI

شخص ما جرب الأوامر أدناه؟

cd android
./gradlew clean
cd ..

عملت معي

ما نجح معي هو مزيج من تعليقين:

ألصق هذا هنا لأي شخص آخر قد يحتاج إليه.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        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()
                moveRawFunc.curry("raw").call()
            }

يا رجل لقد أنقذت يومي <3

ما نجح معي هو مزيج من تعليقين:
ألصق هذا هنا لأي شخص آخر قد يحتاج إليه.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        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()
                moveRawFunc.curry("raw").call()
            }

يا رجل لقد أنقذت يومي <3

هههه شكرا. ظللت أذهب إلى هذا الموضوع بشكل يومي تقريبًا ، لذلك قررت أن أجعل الحياة أسهل للآخرين أيضًا.

عملت إزالة المجلد android/app/build والمبنى مرة أخرى بالنسبة لي.

بلدي الحل:
احذف جميع الملفات الموجودة في / your_project / android / app / src / main / raw / res .
إنه عمل بالنسبة لي!

ما نجح معي هو مزيج من تعليقين:

ألصق هذا هنا لأي شخص آخر قد يحتاج إليه.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        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()
                moveRawFunc.curry("raw").call()
            }

شكراً AbhishekNairOfficial. لقد وفر لي الكثير من الوقت.

rm -rf ./android/app/src/main/res/drawable-*
rm -rf ./android/app/src/main/res/raw

يعمل هذا بالفعل ، ولكن الصور الخاصة بك مفقودة ، لذلك إذا قمت بإعادة تجميع التطبيق الخاص بك ، فحاول إنشاء نفس الخطأ. أي شخص لديه إصلاح شرعي لهذا حتى الآن؟

الحصول على نفس الشيء في v0.61.5 وكما يقول @ wincod75 ، فإن حذف المجلدات الأولية

لقد حصلت على إعادة إنشائها من أجل إصدار الإصدار ، لكن سيكون من الجيد إذا عملوا أيضًا عند تشغيل رد فعل أصلي run-android --variant = release ، وهذا لا يعمل إلا عندما يكونون في طبقات src / main it ومن ثم لا يستطيع المرء البناء .

أي شخص كان قادرًا على حل مشكلة v0.61.5؟

@ gudbrand3 لقد نفذت في النهاية الإصلاح المشار إليه أعلاه على ملف "node_modules / رد فعل أصلي / رد فعل." تم إصلاحه بعد ...

@ wincod75 سماع سماع! انتهى بي الأمر مع نفس .. بلاه. أنا لا أفهم سبب عدم تضمينه في الحزمة فقط حتى يتم العثور على نهج أفضل لأن الأشخاص ينتهي بهم الأمر على أي حال يدويًا. الآن يجب إعادة القيام بذلك لكل حذف للوحدات node_modules وإعادة تثبيت npm. #frustrating

لن تعمل إزالة المجلدات القابلة للرسم بالنسبة لي لأن لدي موارد قابلة للرسم أحتاج إلى الاحتفاظ بها. كانت مشكلتي مع duplicate resources لكل شيء في المجلد android/app/src/main/res/raw والملفات التي بدأت بـ nodemodules... في المجلد android/app/src/main/res/drawable . هذا حل المشكلة بالنسبة لي:

الإضافة إلى android/app/build.gradle :

...
project.ext.react = [
    ...
    bundleInRelease        : true,
    resourcesDirRelease   : "src/release/res",
    ...
]
...

إزالة كل شيء بدأ بـ node من android/app/src/main/drawable* :

rm android/app/src/main/drawable*/node*
rm -rf android/app/src/main/raw

مشروع نظيف ، لا تقم بتشغيل أمر الحزمة الأصلية للتفاعل ، ثم

أمل أن هذا يساعد شخصاما!

يا ولد. ربما الإصلاح الرسمي في الطريق؟

أواجه نفس المشكلة في الإصدار 0.61.4

في حالتي
أولاً: لقد وضعت الكود التالي في node_modules / رد فعل أصلي / رد فعل. gradle بعد "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()
}

ثانيًا: قمت بحذف جميع محتويات المجلد android / app / src / main / res / raw
قد تكون مفيدة لشخص ما

يا ولد. ربما الإصلاح الرسمي في الطريق؟

آمل ذلك ، أنا أستخدم RN 0.62.1 وواجهت هذه المشكلة أيضًا.

تؤدي إضافة رمز doLast أو حذف مجلدات العناصر القابلة للرسم إلى حل هذه المشكلة.

أتساءل لمعرفة ما هي التوصية الرسمية؟

شكرا لك

لن تعمل إزالة المجلدات القابلة للرسم بالنسبة لي لأن لدي موارد قابلة للرسم أحتاج إلى الاحتفاظ بها. كانت مشكلتي مع duplicate resources لكل شيء في المجلد android/app/src/main/res/raw والملفات التي بدأت بـ nodemodules... في المجلد android/app/src/main/res/drawable . هذا حل المشكلة بالنسبة لي:

الإضافة إلى android/app/build.gradle :

...
project.ext.react = [
    ...
    bundleInRelease        : true,
    resourcesDirRelease   : "src/release/res",
    ...
]
...

إزالة كل شيء بدأ بـ node من android/app/src/main/drawable* :

rm android/app/src/main/drawable*/node*
rm -rf android/app/src/main/raw

مشروع نظيف ، لا تقم بتشغيل أمر الحزمة الأصلية للتفاعل ، ثم

أمل أن هذا يساعد شخصاما!

ساعدني الحل أعلاه في العثور على إجابة لائقة:

الخطوة 1:

إضافة إلى android/app/build.gradle :

... project.ext.react = [ ... bundleInRelease : true, resourcesDirRelease : "src/release/res", ... ] ...

الخطوة 2:

قم بتشغيل الأمر التالي لحذف جميع ملفات node_module.

rm -rf drawable*/node*

الخطوه 3:

قم بتشغيل هذا الأمر للبناء و APK.

./gradlew assembleRelease

الخطوة الرابعة:

لقد أنشأت النص التالي لاستخدامه في package.json الخاص بي

"release-apk": "cd android && yarn remove-duplicate-files  && ./gradlew assembleRelease"

أتمنى أن يساعدك هذا!
وشكرًا لكل من شارك في حلولهم

لأي شخص لديه مشكلة في الموارد الخام غير الصورية ؛ لقد قمت بحلها عن طريق إعادة تسمية الملفات بنفس الاسم ولكن بامتداد مختلف.

قضيتي

كان لدي ملفات object.obj و object.mtl . حتى إذا كانت الملحقات مختلفة ، فقد ألقى خطأ موارد مكررًا. لأن android يختارهم باسم الملف. لذا ، فقد أدت إعادة تسمية object.mtl إلى object_material.mtl إلى حل المشكلة بالنسبة لي.

قد يكون الأمر نفسه بالنسبة لموارد الصور أيضًا ، فحاول إعادة تسميتها إذا كانت لديك صور بأسماء متطابقة.

ما نجح معي هو مزيج من تعليقين:

ألصق هذا هنا لأي شخص آخر قد يحتاج إليه.

def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
                    flavorPathSegment = flavor.name
            }
            }

            doLast {
                def moveFunc = { resSuffix ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
                        ant.move(file: originalDir, tofile: destDir)
                    }
                }
                def moveRawFunc = { dir ->
                    File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}")
                    if (originalDir.exists()) {
                        File destDir = file("$buildDir/../src/main/res/${dir}")
                        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()
                moveRawFunc.curry("raw").call()
            }

عمل لي targetName.toLowerCase().contains(flavor.name.toLowerCase()) .
يبدو flavor.name مثل xxXX.

تمت إضافة جميع عناصر dolast في PRs # 24518 و # 24778 ، ثم تمت إزالتها مرة أخرى في # 25363. لا أحد يعرف لماذا تمت إزالته؟ لقد كانت هذه مشكلة طويلة الأمد ، واعتقدت أنهم قد تم إصلاحها.

لا تهتم ، الإجابات هنا:
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
وهنا: https://github.com/facebook/react-native/issues/25325

في حالة ما إذا كان ذلك مفيدًا ، فإليك سطرين من البرنامج النصي الخاص بي (لإصدار Android X أيضًا):

echo "Fixing java error: package android.support.v4.widget does not exist issue with Android X"

npm install jetifier
npx jetify

echo "Fixing duplicate resources issue"
rm -rf .../android/app/src/main/res/raw

cd .../node_modules/react-native

cat <<EOT >> react_gradle.patch
121a122,137
>             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()
>             }
> 
EOT

ls -l react_gradle.patch
patch react.gradle react_gradle.patch

وساعدني هذا الحل في إنشاء إصدار: https://github.com/facebook/react-native/issues/26245#issuecomment -631382817

لقد فعلت الخطوات التالية ذلك من أجلي:

1. gradlew clean
2. npm install
3. gradlew bundleRelease
System:
    OS: macOS 10.15.3
    CPU: (4) x64 Intel(R) Core(TM) i5-5257U CPU @ 2.70GHz
    Memory: 221.64 MB / 8.00 GB
    Shell: 5.7.1 - /bin/zsh
  Binaries:
    Node: 12.13.1 - ~/.nvm/versions/node/v12.13.1/bin/node
    Yarn: 1.22.4 - ~/Documents/youpendo-app-bareworkflow/node_modules/.bin/yarn
    npm: 6.12.1 - ~/.nvm/versions/node/v12.13.1/bin/npm
    Watchman: 4.9.0 - /usr/local/bin/watchman
  Managers:
    CocoaPods: 1.9.3 - /usr/local/bin/pod
  SDKs:
    iOS SDK:
      Platforms: iOS 13.2, DriverKit 19.0, macOS 10.15, tvOS 13.2, watchOS 6.1
    Android SDK:
      API Levels: 28, 29
      Build Tools: 28.0.3, 29.0.2
      System Images: android-28 | Google APIs Intel x86 Atom, android-29 | Google APIs Intel x86 Atom
      Android NDK: Not Found
  IDEs:
    Android Studio: 3.6 AI-192.7142.36.36.6392135
    Xcode: 11.3.1/11C504 - /usr/bin/xcodebuild
  Languages:
    Java: 1.8.0_232 - /usr/bin/javac
    Python: 2.7.16 - /usr/bin/python
  npmPackages:
    @react-native-community/cli: ^4.8.0 => 4.10.0
    react: 16.11.0 => 16.11.0
    react-native: 0.62.2 => 0.62.2
  npmGlobalPackages:
    *react-native*: Not Found

أنا على الحصول على نفس الخطأ. اي حل ؟

هل يمكن لشخص ما مشاركة ملف التصحيح للتفاعل الأصلي 0.62.2

لقد أنشأت هذا التصحيح لـ React Native 0.63.2. إذا كان لديك مجلدات " drawable- ، فأعد تسميتها بـ android / app / src / main / AndroidManifest.xml

قم بتشغيل هذا في جذر المشروع لإنشاء ملف التصحيح

cat <<EOT >> react-native-0.63.2-react.gradle.patch 
@@ -147,6 +147,23 @@
                 jsSourceMapsDir.mkdirs()
             }

+            doLast {
+                def moveFunc = { resFolder ->
+                    File originalDir = file("\${buildDir}/generated/res/react/release/\${resFolder}");
+                    if (originalDir.exists()) {
+                        File destDir = file("\${buildDir}/../src/main/res/\${resFolder}");
+                        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()
+            }
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)
EOT

ثم قم بتطبيق التصحيح باستخدام

patch node_modules/react-native/react.gradle < react-native-0.63.2-react.gradle.patch

نوصي أيضًا بالقيام به

rm -Rf android/.gradle
cd android && gradlew clean

انسخ node_ modules/react-native/react.gradle إلى android/app/react.gradle ، ثم عدّل android/app/build.gradle و android/app/react.gradle :

android/app/build.gradle

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

android/app/react.gradle

           doFirst {
                jsBundleDir.deleteDir()
                jsBundleDir.mkdirs()
                resourcesDir.deleteDir()
                resourcesDir.mkdirs()
                jsIntermediateSourceMapsDir.deleteDir()
                jsIntermediateSourceMapsDir.mkdirs()
                jsSourceMapsDir.deleteDir()
                jsSourceMapsDir.mkdirs()
            }
+
+           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)
+                   }
+               }
+               def moveRawFunc = { dir ->
+                  File originalDir = file("${resourcesDir}/${dir}")
+                  if (originalDir.exists()) {
+                      File destDir = file("$buildDir/../src/main/res/${dir}")
+                      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()
+              moveRawFunc.curry("raw").call()
+          }

هذا يعمل بالنسبة لي في react-native 0.63.2

            doLast {
                def flavorPathSegment = ""
                println targetName.toLowerCase();
                android.productFlavors.all { flavor ->
                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
                        flavorPathSegment = flavor.name
                    }
                }
                def moveFunc = { resFolder ->
                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
                    if (originalDir.exists()) {
                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
                        ant.move(file: originalDir, tofile: destDir);
                    }
                }

                moveFunc.curry("drawable").call()
                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()
            }


هنا ملف التصحيح react-native+0.63.2.patch

diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 6441d93..1eb4645 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -147,6 +147,33 @@ afterEvaluate {
                 jsSourceMapsDir.mkdirs()
             }

+            doLast {
+                def flavorPathSegment = ""
+                println targetName.toLowerCase();
+                android.productFlavors.all { flavor ->
+                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
+                        flavorPathSegment = flavor.name
+                    }
+                }
+                def moveFunc = { resFolder ->
+                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
+                    if (originalDir.exists()) {
+                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
+                        ant.move(file: originalDir, tofile: destDir);
+                    }
+                }
+
+                moveFunc.curry("drawable").call()
+                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()
+            }
+
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)
diff --git a/node_modules/react-native/scripts/.packager.env b/node_modules/react-native/scripts/.packager.env
new file mode 100644
index 0000000..21a13cf
--- /dev/null
+++ b/node_modules/react-native/scripts/.packager.env
@@ -0,0 +1 @@
+export RCT_METRO_PORT=8081
\ No newline at end of file

تحية للجميع! هل يمكن لشخص ما إجراء العلاقات العامة لهذه التغييرات؟ تحرير node_modules ليس مثاليًا.

تحية للجميع،

أنا أستخدم 0.63.2 المتفاعل الأصلي. لقد واجهت أيضًا هذه المشكلة وحاولت تحرير رد الفعل ، والموارد المحذوفة / القابلة للرسم وكلها. ولكن أخيرًا ، نجح تشغيل الأمر gradlew assembleRelease بالنسبة لي.

لم أقم بتشغيل أمر الحزمة التفاعلية. gradlew assembleRelease بتشغيل الحزمة التفاعلية الأصلية وإنشاء ملف apk نفسه.

هذا يعمل بالنسبة لي في react-native 0.63.2

            doLast {
                def flavorPathSegment = ""
                println targetName.toLowerCase();
                android.productFlavors.all { flavor ->
                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
                        flavorPathSegment = flavor.name
                    }
                }
                def moveFunc = { resFolder ->
                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
                    if (originalDir.exists()) {
                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
                        ant.move(file: originalDir, tofile: destDir);
                    }
                }

                moveFunc.curry("drawable").call()
                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()
            }

هنا ملف التصحيح react-native+0.63.2.patch

diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 6441d93..1eb4645 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -147,6 +147,33 @@ afterEvaluate {
                 jsSourceMapsDir.mkdirs()
             }

+            doLast {
+                def flavorPathSegment = ""
+                println targetName.toLowerCase();
+                android.productFlavors.all { flavor ->
+                    if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
+                        flavorPathSegment = flavor.name
+                    }
+                }
+                def moveFunc = { resFolder ->
+                    File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
+                    if (originalDir.exists()) {
+                        File destDir = file("${buildDir}/../src/main/res/${resFolder}");
+                        ant.move(file: originalDir, tofile: destDir);
+                    }
+                }
+
+                moveFunc.curry("drawable").call()
+                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()
+            }
+
+
             // Set up inputs and outputs so gradle can cache the result
             inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
             outputs.dir(jsBundleDir)
diff --git a/node_modules/react-native/scripts/.packager.env b/node_modules/react-native/scripts/.packager.env
new file mode 100644
index 0000000..21a13cf
--- /dev/null
+++ b/node_modules/react-native/scripts/.packager.env
@@ -0,0 +1 @@
+export RCT_METRO_PORT=8081
\ No newline at end of file

شكرا لك

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات