React-native: [Android] рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрдиреЛрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 10 рдирд╡ре░ 2018  ┬╖  103рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react-native

  • [x] рдкреНрд░рд▓реЗрдЦрди рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░реЗрдВ: https://facebook.github.io/react-native
  • [x] рдореМрдЬреВрджрд╛ рдореБрджреНрджреЛрдВ рдХреА рдЦреЛрдЬ рдХрд░реЗрдВ :
  • [x] рдирд╡реАрдирддрдо рдЕрднрд┐рдХреНрд░рд┐рдпрд╛ рдореВрд▓ рд░рд┐рд▓реАрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ: https://github.com/facebook/react-native/releases

рд╡рд╛рддрд╛рд╡рд░рдг

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкрд░реНрдпрд╛рд╡рд░рдг рд╕рдВрдмрдВрдзреА рдЬрд╛рдирдХрд╛рд░реА:

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

рд╡рд┐рд╡рд░рдг

рдореИрдВ Android рдореЗрдВ PNG рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд░рд┐рд▓реАрдЬрд╝ APK рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реВрдВред рд▓реЗрдХрд┐рди рдЬрдм рдкреАрдПрдирдЬреА рдХреА рдХреЛрдИ рдЫрд╡рд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдПрдХ рд░рд┐рд▓реАрдЬ APK рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд░рд┐рд▓реАрдЬ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рджреМрд░рд╛рди рддреНрд░реБрдЯрд┐ рдореБрдЭреЗ рдорд┐рд▓ рд░рд╣реА рд╣реИ

[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. рд╕рдВрдкрддреНрддрд┐ рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рдкреАрдПрдирдЬреА рдЫрд╡рд┐ рдЬреЛрдбрд╝реЗрдВред
  4. рдЕрдм рдЙрдкрд░реЛрдХреНрдд PNG рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде image рдШрдЯрдХ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
  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. рдЗрд╕рдХреЗ рдмрд╛рдж Generate Signed APK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рд▓реАрдЬрд╝ рдПрдкреАрдХреЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдореИрдкреНрд╕ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ https://stackoverflow.com/a/52750886 рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк /node_modules/react-native/react.gradle рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ doFirst рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж doLast рд╕рд╣реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП,ред

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 -+рекрез,рекрел,ремрек,рекрежрек

рдпрджрд┐ рдХреЛрдИ рд╣реЛ рддреЛ рдЖрдкрдХреЛ рдбреНрд░рд╛ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░ рдЫрд╡рд┐ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ?

@ ZeroCool00 Android рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?

рдореИрдкреНрд╕ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ https://stackoverflow.com/a/52750886 рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк /node_modules/react-native/react.gradle рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ doFirst рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж doLast рд╕рд╣реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП,ред

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

@ ZeroCool00 @mkchx рдореИрдВрдиреЗ рдЖрдкрдХреЗ рдЬрд╡рд╛рдм, рдЗрд╕рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ, рджреЛрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдБрдЪ рдХреАред рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рджреЛрд╕реНрддреЛрдВ :)

рд╣рд╛рдп рд╕рдм рд╣рдо рдЬреЗрдирдХрд┐рдВрд╕ рдиреМрдХрд░реА рдХреЗ рд╕рд╛рде рдпрд╣ рдХреИрд╕реЗ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдХреЗ рд░реВрдк рдореЗрдВ рдпрд╣ npm рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреЛ рд╣рдореЗрд╢рд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддрд╛ рд╣реИред рд╣рдо рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдкрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рдЬреЗрдирдХрд┐рдВрд╕ рдкрд░ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИред

рд╣рд╛рдп @ vivek-walecha-657 рдореИрдВрдиреЗ рдпрд╣ рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХреА рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рдСрдлрд╝рд▓рд╛рдЗрди рдмрдВрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЖрджреЗрд╢ рдХреЛ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ

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

рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП @Jffreyrajanofficial Thanx, рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рд╕рдорд╛рдзрд╛рди рд╕реЗ рдорджрдж рдорд┐рд▓реЗрдЧреА рдпрджрд┐ рд╣рдо рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВред рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓реЗрдВред рд▓реЗрдХрд┐рди рдореИрдВ рд╣рд░ рдмрд╛рд░ рдЬрдм рдореИрдВ npm рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ react.gradle рдлрд╝рд╛рдЗрд▓ рдХреЛ рдмрджрд▓рдХрд░ рд░рд┐рд▓реАрдЬрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред

@Jffreyrajanofficial рдХреНрдпрд╛ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕рд╛ рд╕рдВрд╕реНрдХрд░рдг (рдЗрд╕ рд╕реЗ рдХрдо рдпрд╛ рдЗрд╕ рд╕реЗ рдЕрдзрд┐рдХ) рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ, рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдмрд┐рдирд╛ред рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рд▓реАрдЬрд╝ рдиреЛрдЯ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣рд▓ рд╣реЛ рдЧрдИ рд╣реИред

рдЪреАрдЬреЗрдВ рдЕрдм RN> 57 react.gradle рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдВрдбрд▓ рдмрдирд╛рддреА рд╣реИрдВред
рдПрдХ рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ npm рд░рди рдмрд┐рд▓реНрдб рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ

55.4 рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдпрд╣рд╛рдВ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рдореЗрд░рд╛ рдирдореВрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ ред рдлрд┐рдХреНрд╕реЗрд╕ рдХреЗ рд╕рд╛рде рдкреИрдХреЗрдЬредрдЬрд╕рди ред

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

рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, macOS 10.14.3 + RN 0.57.8 + рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3.3 + рдЧреНрд░реЗрдбрд▓ 4.10.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╢рд╛рдпрдж рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ? рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдпрд╣рд╛рдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЦреЛрджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ @mkchx рдХреА рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдкреИрдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ "рдкреИрдЪ-рдкреИрдХреЗрдЬ" рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ( рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ .txt рдкреНрд░рддреНрдпрдп рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП postinstall: patch-package рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж 'npm рдЗрдВрд╕реНрдЯреЙрд▓' рдкрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред 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 /
рд░рди рдмрд┐рд▓реНрдб рдлрд┐рд░ рд╕реЗ, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдореБрджреНрджрд╛ рддрдп рдХрд┐рдпрд╛ред

рдореИрдВ рдЕрднреА рднреА RN0.58.x рдореЗрдВ рдпрд╣ рджреЗрдЦ рд░рд╣рд╛ рдерд╛ рдФрд░ рдпрд╣ RN0.59.x рдореЗрдВ рдЬрд╛рд░реА рд╣реИ - рдХреНрдпрд╛ рд╣рдо рдпрд╣рд╛рдВ рдХреБрдЫ рдЧрд▓рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрдЧ рд╣реИ?

рдкреИрдЪ-рдкреИрдХреЗрдЬ рдореЙрдбреНрдпреВрд▓ рдФрд░ рдЗрд╕ рдкреИрдЪ (RN0.59.1 рдХреЗ рд▓рд┐рдП рдЕрджреНрдпрддрди) рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдкреИрдЪ рдлреЙрд░реНрдо рдореЗрдВ рдПрдиреНрдХреЛрдбреЗрдб @mkchx рд╕реЗ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рд╕рдлрд▓рддрд╛ рдорд┐рд▓рддреА рд░рд╣рддреА рд╣реИ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ + 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 рдХрд░реА рдореЗрдВ рдПрдХ рд▓рд╛рдкрддрд╛ рд╣рд╛рдЗрдлрд╝рди рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реА рд╣реИред рд╕рдВрдпреЛрдЧ рд╕реЗ рдЖрдк рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдЕрдЧреНрд░рдгреА рдкрде?

рдЖрдкрдиреЗ рдореБрдЭреЗ 2 рдорд┐рдирдЯ рд╕реЗ рд╣рд░рд╛рдпрд╛, рдореИрдВ рдЙрд╕ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдерд╛ред рд╣рд╛рдВ, рдЕрдм рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдХрд╕реНрдЯрдо рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП "рдХрдЪреНрдЪреЗ" рдкрде рдХреЗ рд╕рд╛рде рдмрд┐рдЯ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

@dragosroua рдЦреБрд╢реА рд╣реИ рдХрд┐ рдЖрдк рдЕрдм рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ - рдореБрдЭреЗ рдпрд╛рдж рд╣реИ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд┐рддрдирд╛ рдирд┐рд░рд╛рд╢рд╛рдЬрдирдХ рдерд╛, рдФрд░ рдореИрдВ рдЕрднреА рднреА рдЪрдХрд┐рдд рд╣реВрдВ рдХрд┐ рдпрд╣ рдорд╛рд╕реНрдЯрд░ рдореЗрдВ рддрдп рдирд╣реАрдВ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рдПрдХ рдкреАрдЖрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдЬреЛ рднреА рд░рдЦрд╛ рд╣реИ рд╡рд╣ рдореБрдЭреЗ рдкрддрд╛ рд╣реИред редред

рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ рджреЗрдЦ рд░рд╣рд╛ рдерд╛, macOS 10.14.3 + RN 0.57.8 + рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3.3 + рдЧреНрд░реЗрдбрд▓ 4.10.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╢рд╛рдпрдж рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ? рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдпрд╣рд╛рдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЦреЛрджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ @mkchx рдХреА рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдкреИрдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ "рдкреИрдЪ-рдкреИрдХреЗрдЬ" рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ( рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ .txt рдкреНрд░рддреНрдпрдп рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП postinstall: patch-package рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж 'npm рдЗрдВрд╕реНрдЯреЙрд▓' рдкрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред json рд╕реНрдХреНрд░рд┐рдкреНрдЯред

рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ ...
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ + 0.57.8.patch.txt

Pls рдореБрдЭреЗ рд╕рдордЭрд╛рдПрдВ рдХрд┐ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ 0.57.5 рдХреЗ рд▓рд┐рдП рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ?
рдореИрдВрдиреЗ рдкреИрдХреНрдЯ рдлрд╛рдЗрд▓ рдмрдирд╛рдИред 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 рд╕рд╛рде рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдорд┐рд▓рддрд╛ рд╣реИ, рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЬрдЧрд░ рдЖрдкрдХреА рдЪреАрдЬ рд╣реИ рдФрд░ рдЖрдк рдЕрдзрд┐рдХ рдХреЛрдб рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рдкреИрдЪ-рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬреИрд╕реЗ 0.59.3
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ + 0.59.3.patch.txt

@hramos - # 19239 рд╕рдорд╛рди рдерд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдФрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рддрдп рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ рдХрд╛рд░рдг рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрдЪ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? (рдореИрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ)ред рдЕрдЧрд░ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдкреАрдЖрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддреЛ рдореИрдВ рдПрдХ ... рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ npm install patch-package рд╕рд╛рде рдЖрдкрдХреЛ рдЬреЛ рдХреБрдЫ рднреА рдорд┐рд▓рддрд╛ рд╣реИ, рдЙрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЕрдЬрдЧрд░ рдЖрдкрдХреА рдЪреАрдЬ рд╣реИ рдФрд░ рдЖрдк рдЕрдзрд┐рдХ рдХреЛрдб рдмрдирд╛рдП рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд▓рдЧрддрд╛ рд╣реИред рдореИрдВ рдЕрднреА рднреА рдкреИрдЪ-рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЬреЛ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдЬреИрд╕реЗ 0.59.3
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ + 0.59.3.patch.txt

@hramos - # 19239 рд╕рдорд╛рди рдерд╛ (рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ) рдФрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдПрдХ рддрдп рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЕрдВрддрд┐рдо рдирд┐рд░реНрдзрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреАрдЖрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдПрдХ рдХрд╛рд░рдг рдпрд╛рдж рдЖ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрдЪ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╣реИ? (рдореИрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реВрдВ)ред рдЕрдЧрд░ рд╣рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдкреАрдЖрд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ рддреЛ рдореИрдВ рдПрдХ ... рднреЗрдЬ рд╕рдХрддрд╛ рд╣реВрдВред

рдЗрд╕ рдкрде рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рдзрдиреНрдпрд╡рд╛рдж

@ZhanRu - https://github.com/ds300/patch-package#set -up - рдЖрдк рдмрд╕ рдкреИрдЪ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрд╕ рдкреИрдЪ рдХреЛ (рдкреИрдЪ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде) 'рдкреИрдЪ' рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреИрдХреЗрдЬ

@ZhanRu - https://github.com/ds300/patch-package#set -up - рдЖрдк рдмрд╕ рдкреИрдЪ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЙрд╕ рдкреИрдЪ рдХреЛ (рдкреИрдЪ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде) 'рдкреИрдЪ' рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдбрд╛рд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдкреИрдХреЗрдЬ

рдЖрдкрдХрд╛ рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж

рдХрд┐рд╕реА рдХреЗ рд╕рд╛рде рдЕрднреА рднреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдмрд╛рд╣рд░реА рдкреНрд░рдгрд╛рд▓реА рдХреЛ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЙрддреНрдкрд╛рджрди рдмрд╛рд╣рд░реА рдбреЗрдЯрд╛ рд╕реЗ рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ "рдлреНрд▓реЗрд╡рд░" рдХреЛ рдЧреНрд░реЗрдбреЗрд▓ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП qDebug, 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 )ред рдзрдиреНрдпрд╡рд╛рджред

рдмрд╣реБрдд рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ - рдореБрдЭреЗ рдХрдЪреНрдЪреЗ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реБрдИ рд╣реИ - рдЗрд╕ рдмрд╛рдд рд╕реЗ рдЕрд╡рдЧрдд рд░рд╣реЗрдВ рдХрд┐ рдореЗрд░реЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдиреЗ рдлреНрд▓реЗрд╡рд░ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдлреНрд▓реЗрд╡рд░ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЙрди рджреЛрдиреЛрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрд╕ рд╕реНрд╡рд╛рдж-рд╕рдорд░реНрдерди рдХреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдорд╛рдирдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП 2 рдлрд╝рдВрдХреНрд╢рдВрд╕ рджреЛрд╣рд░рд╛рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕ рдкрд░ рдЪрд┐рдВрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реВрдВред

рдореИрдВ рдХреЗрд╡рд▓ рдХрд▓реНрдкрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдлреЗрд╕рдмреБрдХ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ рд╕реАрдЖрдИ рдкрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ BUCK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЙрдирдХрд╛ CI рд╣рд░ рдмрд╛рд░ рд╕реНрд╡рдЪреНрдЫ рдмрдирд╛рддрд╛ рд╣реИред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЗ рдкрд╛рд╕ рдЗрд╕рдХрд╛ рд╕рд╛рдл рдкреБрдирд░реБрддреНрдкрд╛рджрди рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдПрдХ рдЕрдкрд╕реНрдЯреНрд░реАрдо рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреЗрдВ?

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрдЪреНрдЪреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдХреБрдЫ рдПрдордкреА 3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдлрд┐рд░ рдПрдХ рддреНрд╡рд░рд┐рдд + рдЖрд╕рд╛рди рд░рд┐рдкреНрд░реЛ рдХрд╛ рдЖрдзрд╛рд░ рдмрди рд╕рдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕ рддрд░рд╣ рдХреА (рдЕрднреА рддрдХ) рд╕рдВрдкрддреНрддрд┐ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд░реЗрдкреЛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ init рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдЖрд╕рд╛рди рд╣реИ, рддреЛ рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рд░рдЦ рджреЗрдВ рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рджреВрд╕рд░реЗ рд░рд┐рд▓реАрдЬ рдмрд┐рд▓реНрдб (рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рднреА?) рдкрд░ рдЖрдк рд╣реИрдВ ...?

@ рджреНрд░реЛрдХреНрд╡рд╛ рд╕рд┐рд░реНрдл рдПрдХ рд╕рд┐рд░ рд╣реИ, рдореЗрд░рд╛ рдкреИрдЪ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХрдЪреНрдЪреА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдЖрдкрдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдмрд╣реБрдд рдирд┐рдХрдЯ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдкреИрдЪ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рднреА рдорд░реНрдЬ рдореЗрдВ рдкрд░рд┐рд▓рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЕрдм рдЬрдм рдореЗрд░рд╛ рдкреИрдЪ рдЕрдВрджрд░ рд╣реИ, рддреЛ рдЖрдк рдпрд╣ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдХрдЪреНрдЪреЗ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдФрд░ рдПрдХ рдкреАрдЖрд░ рдХреЛ рдлрд┐рдХреНрд╕ рдХреА рдирд┐рд░рдВрддрд░рддрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдЗрд╕реЗ рдЖрдкрдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП?

рдареАрдХ,

рдореИрдВ рдЖрд╡рд╢реНрдпрдХ ASAP рдХрд░реВрдВрдЧрд╛ред

рд╕рд╛рджрд░,
рдбреЗрдорд┐рдпрди

рдирд┐рд╢реНрдЪрд┐рдд!

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдбреНрд░реЙрдмрд▓реНрд╕ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЗрдВ рдереАрдВ res/drawable-* рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдПрдВ рдЬреЛ рдореЗрд░реА рдЯреАрдореЛрдВ рдХреЗ рдХрд┐рд╕реА рдЕрдиреНрдп рджреЗрд╡ рд╕реЗ рдХрдорд┐рдЯ рдХрд░ рд░рд╣реА рдереАрдВ - рдореБрдЭреЗ рдЙрди рдлрд╝рд╛рдЗрд▓ рдирд╛рдореЛрдВ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реБрдП "рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди" рдорд┐рд▓ рд░рд╣рд╛ рдерд╛ - рдореИрдВрдиреЗ рдбреНрд░реЙрдмрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдФрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ЁЯСН

рдореИрдкреНрд╕ рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ https://stackoverflow.com/a/52750886 рдорджрдж рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП
рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк /node_modules/react-native/react.gradle рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдФрд░ рдореИрдиреНрдпреБрдЕрд▓ doFirst рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж doLast рд╕рд╣реА рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП,ред

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 рдХреЛ рдЦрд╛рд▓реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕реНрд╡рдЪреНрдЫ рд╣реИ - рдХреЗрд╡рд▓ рдЖрдкрдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдкрддреНрддрд┐

рдЕрдм, рдПрдХ рдСрдлрд╝рд▓рд╛рдЗрди рдмрдВрдбрд▓ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдкреАрдХреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рджреЗрд╡ рдореЗрдВ рднреА рдЖрдк рдЗрд╕реЗ рдПрдкреАрдЖрдИ <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 рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХрд╣рддреЗ рд╣реИрдВ - рдПрдХ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдЧреНрд░реЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕рдВрдкрддреНрддрд┐ рднреЗрдЬрдирд╛:
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 + рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ 3.3 + рдЧреНрд░реЗрдбрд▓ 4.10.3 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ред рд╢рд╛рдпрдж рдореИрдВ рдЕрдХреЗрд▓рд╛ рдирд╣реАрдВ рд╣реВрдВ? рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдпрд╣рд╛рдВ рдкреБрд╖реНрдЯрд┐ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдФрд░ рдЦреЛрджреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реВрдк рд╕реЗ рдареАрдХ рдХрд░реВрдВрдЧрд╛ред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ @mkchx рдХреА рдЙрдкрд░реЛрдХреНрдд рдЯрд┐рдкреНрдкрдгреА рдХреЗ рд╕рд╛рде рд╕рдВрд▓рдЧреНрди рдкреИрдЪ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ "рдкреИрдЪ-рдкреИрдХреЗрдЬ" рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реВрдВ ( рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ .txt рдкреНрд░рддреНрдпрдп рд╕рдВрд▓рдЧреНрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдореЗрд░реЗ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП postinstall: patch-package рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдмрд╛рдж 'npm рдЗрдВрд╕реНрдЯреЙрд▓' рдкрд░ рдЗрд╕реЗ рдареАрдХ рдХрд░реЗрдВред json рд╕реНрдХреНрд░рд┐рдкреНрдЯред

рд╢рд╛рдпрдж рдпрд╣ рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ ...
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ + 0.57.8.patch.txt

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛! рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╣ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЬрд╡рд╛рдм рд╣реИ!

рдореИрдВ рдЕрднреА рднреА рдЗрд╕реЗ 0.59.9 рдореЗрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВред @mkchx рдХреЗ рдЙрддреНрддрд░ рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛

@juliancorrea @scgough рдмрд╕ @mkchx рдЙрддреНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдХреБрдЫ рд╢рд░реНрддреЛрдВ рдХреЗ рддрд╣рдд - рдпрд╣ рдЕрдиреНрдп рд╕рд╛рдорд╛рдиреНрдп рдкрд░рд┐рджреГрд╢реНрдпреЛрдВ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИ, рдЬреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ

@mikehardy рдУрдХреЗ - рдореИрдВ рдЕрдм рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЛ
I _think_ рдЬреЛ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдПрдкреАрдХреЗ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рд╣реИ рдЬреЛ рдХрд┐ рдмрдВрдбрд▓ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЯрд░реНрдорд┐рдирд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ)ред
рдореЗрд░реЗ рдкрд╛рд╕ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрддреНрдд рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рд╣реЛрдЧреА рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдорджрдж рдХрд░рддреЗ рд╣реИрдВред

Im рдЕрднреА рднреА рдЗрд╕ рдХреЗ рд╕рд╛рде рдкрд░реЗрд╢рд╛рдиреА рд╣реЛ рд░рд╣реА рд╣реИ ...
рдореИрдВ рдЕрдкрдиреА рд░рд┐рд▓реАрдЬрд╝ рдПрдкреАрдХреЗ рдлрд╝рд╛рдЗрд▓ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддрд╛ред рдореБрдЭреЗ рд╣рд░ рдПрд╕реЗрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:

[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 рдлрд╝реЛрд▓реНрдбрд░ рдХреЗ рджреЛрдиреЛрдВ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдкреАрдХреЗ рдкреАрдврд╝реА рдЙрдиреНрд╣реЗрдВ рд╡рд╛рдкрд╕ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд░рдЦрддреА рд╣реИред
рдореИрдВ рдЕрдкрдиреА рдмрдВрдбрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд▓рд╛ рд░рд╣рд╛ рд╣реВрдВ:

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/

рдореЗрд░реЗ рдРрдк рдореЗрдВ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реИ:

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 )
рдлрд┐рд▓рд╣рд╛рд▓ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдореИрдВ рдЕрдкрдиреА рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдПрдкреАрдХреЗ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рд╡рд╣ doLast рдЙрд▓рдЯрд╛ рдкреАрдЖрд░ рдлрд┐рдХреНрд╕ рдХреЗ рдЬрд░рд┐рдП рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рдореБрджреНрджреЗ рдХрд╛ рдХрд╛рд░рдг / рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдореЗрд░рд╛ рдкреБрд░рд╛рдирд╛ рдмрдВрдбрд▓ рдХрдорд╛рдВрдб (рдореИрдВрдиреЗ 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/ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛
  • рдирдП рдлрд╝реЛрд▓реНрдбрд░ рд╕реНрдерд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдмрдВрдбрд▓ рдХрдорд╛рдВрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛
  • рдореЗрд░рд╛ рдПрдкреАрдХреЗ рдЕрдм рдмрдирд╛рддрд╛ рд╣реИ ... (_ рдореИрдВ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ_)

рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ
рдПрдкреАрдХреЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЗрдХрд┐рди рдЕрдкрд╡рд╛рдж рдХреЗ рд╕рд╛рде рдРрдк рдЕрдм рдХреНрд░реИрд╢ рд╣реЛ рдЧрдпрд╛:
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView

... рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдирд╣реАрдВ рдкрд╛ рд╕рдХрддрд╛ рд╣реИ it

рдЕрджреНрдпрддрди реи
рдПрдХ рд╣реА рд░рд╛рд╕реНрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреАрдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реВрдВ (рдЕрдм рддрдХ) рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ:

  • рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдмрдВрдбрд▓ рдХреЙрд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░реЗрдВ: android/app/src/main/res/
  • рдмрдВрдбрд▓ рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдВ
  • android/app/src/main/res/drawable-mdpi рд╕реЗ android/app/src/main/res/drawable-hdpi рдирд╛рдо рдмрджрд▓реЗрдВ
  • рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдП рдЧрдП APK рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВ

рдореЗрд░реА рдмрд┐рд▓реНрдб рдЧреНрд░реЗрдбреЗрд▓ рд╣реИ:

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

рдПрдкреАрдХреЗ рддрдм рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ ...

рдкрдХреНрд╖реАрдп рд▓реЗрдЦ:
рдореБрдЭреЗ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдмрдЧ рдлрд╕рд▓ рдорд┐рд▓реА, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЫрд╡рд┐ рд╕реНрд▓рд╛рдЗрдбрд░ рдШрдЯрдХ рдкрд░ createBitmap OutOfMemory рдЕрдкрд╡рд╛рдж рдерд╛ред
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореЗрдирд┐рдлреЗрд╕реНрдЯ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ рдЬреЛрдбрд╝рд╛ рд╣реИ рдФрд░ рдРрдк рдлрд┐рд░ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ: android:largeHeap="true"
рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдПрдХ рд▓реАрдХ / рдШрдЯрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рддрдХ рдРрдк рдлрд┐рд░ рд╕реЗ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рддрд╛ рд╣реИред

рд░рд┐рдПрдХреНрдЯ рдиреЗрдЯрд┐рд╡ 0.60.0 рдореЗрдВ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдореВрд▓ рдЖрдзрд╛рд░ рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди рдмрдирд╛ рд░рд╣рд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЙрдкрд░реЛрдХреНрдд рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдХрдЪреНрдЪреЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░ рд░рд╣рд╛ рд╣реИред

[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] C: \ Projects \ some-app \ CLIENT \ android \ app \ src \ main \ resrawnn_modules_nativebase_dist_src_basic_icon_nbicons
[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] C: \ рдкреНрд░реЛрдЬреЗрдХреНрдЯ \ some-app \ CLIENT \ android \ app \ build \ res \ react \ Rearelrelerawnode_modules_nativebase_drc_basic_nbonsons

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП:

        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 рдЪрд▓рд╛рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рддрдм рдирд╣реАрдВ рдЬрдм рдореИрдВ рд░рд┐рд▓реАрдЬ рдмрд┐рд▓реНрдб рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ рдЪрд▓рд╛рддрд╛ рд╣реВрдВред рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рдХреЛрдИ рднреА рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдЖрд░рдПрди 0.60.5

рдЕрджреНрдпрддрди: рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ рдореБрдЭреЗ release рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рдмрдЬрд╛рдп debug рдХрд╛ рд╣рд╡рд╛рд▓рд╛ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд "рдкреИрдЪ" рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ред рдореБрдЭреЗ рднреА рдЕрдкрдирд╛ raw рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдареАрдХ рдХрд░рдирд╛ рдерд╛

рдореИрдВ рднреА рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реВрдБ рдФрд░ react.gradle рдкреИрдЪ рдЗрд╕реЗ рдареАрдХ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдореЗрд░реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдП рдЧрдП рд╕рдВрд╕рд╛рдзрди .OBJ рдФрд░ .MTL рдлрд╝рд╛рдЗрд▓реЗрдВ рд╣реИрдВ, рдЫрд╡рд┐ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЗ рд╕рд╛рде рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред

[рдХрдЪреНрдЪреА / рд╕рдВрдкрддреНрддрд┐_рд╕реЗ_рд╕рд╛рд▓рдж_рд╕рд╛рд▓рдж] /User/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/res/raw/assets_salad_salad.mtl /android/app/src/main/res/raw/assets_res_salad_salad.obj: рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди
[рдХрдЪреНрдЪреА / рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ_рд╕реЗ_рд╕реНрдЯреАрдХ_рд╕реНрдЯреАрдХ] /User/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/res/raw/assets_res_st_steak_teak.mtl /android/app/src/main/res/raw/assets_res_steak_steak.obj: рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди
[рдХрдЪреНрдЪреА / рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ_рд╕реЗ_рд╕реИрд▓реНрдорди_рд╕рд╛рд▓рдореЛрди] /рдЙрдкрд╕рд░реНрд╡рд░ / рдЕрдиреБрдЧрд╛рдореА / рдХрд░реНрддреНрддрд╛ / рджрд░реЛрдЧрд╛ / рджрд░реЛрдЧрд╛ / рдмрдиреНрдзреБ / рд╕рд┐рдкрд╛рд╣реА / рднрд╛рдИ / рднрд╛рдИ / рднрд╛рдИ / рднрд╛рдИ / рднрд╛рдИ / рдмрд╣рд▓_рд╕рд╛рд▓рдореЛрдиреНрдпрд╛рдЪрд▓ред /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

hey @mikehardy рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛрдиреЛрдВ рддрд░реАрдХреЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рджреЛрдиреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдиреЗ рдЗрд╕реЗ рд░рд┐рд▓реАрдЬ рдмрд┐рд▓реНрдб рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ред рдпрд╣ рдбрд┐рдмрдЧ рдореЛрдб btw рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рдЬрдм ORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease s

рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдирд┐рд╖реНрдкрд╛рджрди рд╡рд┐рдлрд▓ рд░рд╣рд╛ ': рдРрдк: mergeArReleaseResources 'ред
[рдХрдЪреНрдЪреА / рд╕рдВрдкрддреНрддрд┐_рд╕реЗ_рд╕рд╛рд▓рдж_рд╕рд╛рд▓рдж] /User/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.mtl [рдХрдЪреНрдЪреА / рдЖрд╕реНрддрд┐рдпреЛрдВ_рд╕рд╛рд▓_рд╕рд╛рд▓_рджрд╛рд▓ред /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.obj: рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди
[рдХрдЪреНрдЪреА / рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ_рд╕реЗ_рд╕реНрдЯреАрдХ_рд╕реНрдЯреАрдХ] / рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ /sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/rawets_resets_res_steak_steak.mtl [рдХрдЪреНрдЪреА / рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ_рд╕реЗрдХ_рд╕реНрдЯреАрдХ] рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛] /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.obj: рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди
[рдХрдЪреНрдЪреА / рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ_рд╕реЗ_рд╕рд╛рд▓рдорди_рд╕рд╛рд▓рдореЛрди] /User/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.mtl [рдХрдЪреНрдЪреА / рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпрд╛рдВ_рд╕рд╛рд▓_рд╕реБрдмрд╣] /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.obj: рддреНрд░реБрдЯрд┐: рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд╕рдВрд╕рд╛рдзрди

рдЬрдм рдХреЙрдкреА-рдЯреВ-src doLast рддрд░реАрдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ; рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдлрд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб / рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ рд╕рд╛рдл рдХрд░рдирд╛ рдкрдбрд╝рд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рддрд░рд╣ рдРрдк рдореЗрдВ рд╕рдВрдкрддреНрддрд┐ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рдереАред рдпрд╣ рдореЗрд░реЗ рдХреЛрдб рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реИред

рдЬрдм рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ, рддреЛ рд╕рдм рдХреБрдЫ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ-рдХреЙрдкреА-рдЯреВ-src рддрд░реАрдХреЗ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ред рдореЗрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдкрд┐рдЫрд▓реА рдХреЙрдкреА-рдЯреВ-рдПрд╕рдХреЗрдПрд╕ рд╢реИрд▓реА рд╕реЗ рдПрдХ рдмрдВрдбрд▓ рдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ "рдХреВрдбрд╝реЗ" рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд╛рдл рдХрд░рдирд╛ рдерд╛, рдлрд┐рд░ рд╣рд░ рдмрд╛рд░ рдХрд╛рдо рдХрд┐рдпрд╛ред

@ rahulkumar1409 рдиреЗ рдореБрдЭреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдореЗрдВ рдорджрдж рдХреА рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдФрд░ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ

рдХрд╛рд░реНрдп: рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓-рд╕рд░рд▓-рдбрд╛рдЙрдирд▓реЛрдб- рдкреНрд░рдмрдВрдзрдХ: VerReleaseResources рд╡рд┐рдлрд▓

рдХреНрдпрд╛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реИ рдРрд╕рд╛ рдХреНрдпреЛрдВ рд╣реЛрддрд╛ рд╣реИ ??

рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред
рддреЛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЖрдк /node_modules/react-native/react.gradle рдлрд╝рд╛рдЗрд▓ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ
рдФрд░ doFast рдмреНрд▓реЙрдХ, рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ doLast рдХреЗ рдареАрдХ рдмрд╛рдж рдЬреЛрдбрд╝реЗрдВред

рдкрд╣рд▓реЗ рдХрд░реЛ { ... }
doLast {
def MoveFunc = {resSuffix ->
рдлрд╝рд╛рдЗрд▓ рдУрд░рд┐рдЬрд┐рдирд▓ = рдлрд╝рд╛рдЗрд▓ ("$ рдмрд┐рд▓реНрдбрдбрд┐рд░ / рдЬреЗрдирд░реЗрдЯ / рд░реЗрд╕ / рд░рд┐рдПрдХреНрд╢рди / рд░рд┐рд▓реАрдЬрд╝ / рдбреНрд░рд╛рдПрдмрд▓ - $ {рд░рд┐рд╕рд╕рдлрд╝рд┐рдХреНрд╕});
рдЕрдЧрд░ (рдореВрд▓Dex.exists ()) {
рдлрд╝рд╛рдЗрд▓ рдбреЗрд╕реНрдЯрд┐рд░ = рдлрд╝рд╛рдЗрд▓ ("$ рдмрд┐рд▓реНрдбрдбрд┐рд░ /../ src / main / res / drawable - $ {resSuffix}");
ant.move (рдлрд╝рд╛рдЗрд▓: рдУрд░рд┐рдЬрд┐рдирд▓, рдЯреЙрдлрд╛рдЗрд▓: рдбреЗрд╕реНрдЯрд┐рд░);
}
}
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 рдХреА рддрд░рд╣ рд╣реА рдЙрддреНрдкрд╛рдж рдХреЗ рдлреНрд▓реЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ 'рдХрдЪреНрдЪреЗ' рдлреЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдереА рдЬреИрд╕реЗ @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 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ

:

рдореИрдВрдиреЗ рдмрдВрдбрд▓рд▓реЗрдбрдмрдЧ рдХреЛ рд╕рд╣реА рдФрд░ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рдЕрд╕рд░ рдирд╣реАрдВ рд╣реБрдЖред

рдореИрдВ рдРрдк рд╕реЗрдВрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ src / main / рдЖрд╕реНрддрд┐рдпреЛрдВ / appcenter-config.json рдлрд╝рд╛рдЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдХрд╕реНрдЯрдо рдлреЛрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ src / main / рдЖрд╕реНрддрд┐рдпреЛрдВ / рдлреЛрдВрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рднреА рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ?

@ARichIVC рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдЖрдкрдХреА рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдореЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдлрд╝рд╛рдЗрд▓ рд╣реИред

рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ "рдореЗрд░рд╛ src / рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдкрд┐рдЫрд▓реЗ рдХреЙрдкреА-рд╕реНрдЯрд╛рдЗрд▓ рдмрдВрдбрд▓ рдкреИрдХреЗрдЬрд┐рдВрдЧ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рд╕реЗ рдкреНрд░рджреВрд╖рд┐рдд рд╣реИ" рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдЗрд╕ рдореВрд▓ рд╕рдорд╛рдзрд╛рди рд╕реЗ рдкрд╣рд▓реЗ рд╣рдо рд╕рднреА рдХреЛ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдпрд╣ рдПрдХ рдореГрдд-рдЕрдВрдд рд╕рдорд╛рдзрд╛рди рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдХреЙрдкреА рдХрд┐рдП рдЧрдП src / рдХреЛ рдЦрд╛рд▓реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ bundleInDebug рд╕рд╛рдорд╛рди рдХрд░рдиреЗ рдХреЗ рдлреЙрд▓реЛ-рдСрди рд╕рдорд╛рдзрд╛рди рдХреЛ рдЖрдЬрдорд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдХреА рдмрд╛рддреЗрдВред рдпрд╣ рд╕рдм рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╣реИ рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ рдЕрдирд┐рд╖реНрдЯрдХрд╛рд░реА рдФрд░ рд▓рдВрдмрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд╛рдирдХрд╛рд░реА рд╡рд╣рд╛рдВ рд╣реИ

рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж @mikehardy ред рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдПрд╕реЗрдЯреНрд╕ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдлреЛрдВрдЯ рдЖрджрд┐ рдореЗрдВ рдЫреЛрдбрд╝рдирд╛ рдареАрдХ рдерд╛, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдмрд┐рдЯреНрд╕ рдФрд░ рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рд▓рдЯрдХрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рдереАред \ Android \ app \ src \ main \ res \ drawable-hdpi \

рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдлреЛрдВрдЯ рдХреЗ рд▓рд┐рдП рднреА рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП - рдПрдХ рдЙрджрд╛рд╣рд░рдг: https://github.com/oblador/react-native-vector-icons#android рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕ рдлрд╛рдЗрд▓ рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдзреНрдпрд╛рди рд╕реЗ рдПрдХ рдЧреИрд░- src рдореЗрдВ рдХреЙрдкреА рд╣реЛ рдЬрд╛рддреА рд╣реИ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16 - рд╣рд░ рдХрд┐рд╕реА рдХрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ

рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рджреЗрд╢реА 0.60.5 рдкрд░ рд╣реИрдВред

рд╣рдо рдЙрд▓реНрд▓рд┐рдЦрд┐рдд @mikehardy рдХреА рддрд░рд╣ рд╣реА рдЙрддреНрдкрд╛рдж рдХреЗ рдлреНрд▓реЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рд╣рдореЗрдВ 'рдХрдЪреНрдЪреЗ' рдлреЛрд▓реНрдбрд░ рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдереА рдЬреИрд╕реЗ @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 рдпрд╛ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ react_gradod in 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()
        }

@ рджрд┐рдирдЪрдВрдж-рд╕рд┐рд╕реНрдЯрдореИрдЯрд┐рдХреНрд╕ рдпрд╣ рдмреБрд░реА рд╕рд▓рд╛рд╣ рд╣реИред рдЙрд╕ рд╢реИрд▓реА рд╕рдорд╛рдзрд╛рди рдХреЛ рдЙрд╕ рдмрд┐рдВрджреБ рддрдХ рд▓реЗ рдЬрд╛рдпрд╛ рдЧрдпрд╛ рдЬрд╣рд╛рдВ рдЙрд╕рдХрд╛ рдкреАрдЖрд░ рдерд╛ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╡рд┐рд▓рдп рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рддрдм рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдЧрд▓рдд рджрд┐рд╢рд╛ рдереА рдФрд░ рдкреАрдЖрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рдерд╛ред рдХреНрдпрд╛ рдЖрдк рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрдВрдЧреЗ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдкреАрдЖрд░ рдорд░реНрдЬ рдХреЛ рд╡рд╛рдкрд╕ рд▓рд╛рдиреЗ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛? рдореИрдВ рдирд╣реАрдВред https://github.com/facebook/react-native/issues/22234#issuecomment -504721069

@ рдорд╛рдпрд┐рдХрд╣рд╛рд░реНрдбреА рд╣рд╛рдВ рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдареАрдХ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рдФрд░ рд╕рд╛рде рд╣реА рдореИрдВ рдЖрдкрдХреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рдлрд╛рдЗрд▓реЗрдВ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдФрд░ рдбреАрдмреА рд░рд┐рд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВред

рд╣рд╛рдВ @ рджрд┐рдирдЪрдВрдж- 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 рдкреИрд░рд╛рдореАрдЯрд░ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рдирд┐рдХрд╛рд▓реЗрдВрдЧреЗ, рдЬреЛ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рдмрдВрдбрд▓ рдирд╣реАрдВ рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ... рдЗрд╕рд▓рд┐рдП рдЬрдм рдЖрдк рдЕрдкрдирд╛ рдПрдкреАрдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВ рддреЛ рд▓рд╛рдкрддрд╛ / рдмрд╛рд╣рд░ рд╣реЛрдиреЗ рдХрд╛ рдЦрддрд░рд╛ рд╣реЛрдЧрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рджрд┐рдирд╛рдВрдХ рд╕рдВрдкрддреНрддрд┐ рдлрд╝рд╛рдЗрд▓реЗрдВ?

@ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдорд╛рдорд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рд╣рдо рдЪреБрдирд┐рдВрджрд╛ рд░реВрдк рд╕реЗ рд╕рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдкрд░рд┐рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╣рдореЗрдВ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдпрд╛ рдЬреЛ рднреА рдЙрддреНрдкрд╛рджрди рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕реЗред

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

рдХреНрдпреЛрдВрдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рджреЛрдиреЛрдВ рдЙрд╕ рддрд░рд╣ рд╕реЗ рдХреЙрд▓ рдХрд░ рд░рд╣реЗ рд╣реИрдВ;

R.drawable.back
R.drawable.back

рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдирд┐рдХрд╛рд▓реЗрдВ рдпрд╛ рдирд╛рдо рдмрджрд▓реЗрдВред

рдирдорд╕реНрддреЗ,
рдореИрдВрдиреЗ react.gradle рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╣реИ: рдмрд┐рд▓реНрдб рдПрдХ рдХрджрдо рдЖрдЧреЗ рдЬрд╛рддрд╛ рд╣реИ (app.aab рдХрд╛ рдирд┐рд░реНрдорд╛рдг рд╣реЛрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдореИрдВ рдПрдкреАрдХреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

рдореИрдВрдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рд╕реНрдЯреВрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдПрдкреАрдХреЗ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ рдФрд░ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА (рдкреИрдЪ рдХреЗ рд╕рд╛рде react.gradle рдХреЗ рд▓рд┐рдП)ред
рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдлреА рдЕрдЬреАрдм рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреАрдХреЗ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджреЛрдиреЛрдВ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рд╕рдорд╛рди рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдореИ рдЧрд▓рдд рд╣реБ ?

рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдиреЗ 0.59.10 рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛ред рдЗрд╕ рдореБрдЯреНрдареА рдХреЗ рд╕рд╛рде рдорд┐рд╢реНрд░рд┐рддред

рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж, @ рджрд┐рдирдЪрдВрдж-рд╕рд┐рд╕реНрдЯрдореИрдЯрд┐рдХреНрд╕!

рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рдирд╛ рджреЛ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдерд╛:

рдореИрдВ рдЗрд╕реЗ рдпрд╣рд╛рдБ рдХрд┐рд╕реА рдФрд░ рдХреЗ рд▓рд┐рдП рдкреЗрд╕реНрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ рдЬрд┐рд╕реЗ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

`` `
рдбреАрдлрд╝ рдлреНрд▓реЗрд╡рд░рдкреИрдерд╕реЗрд╢рди = ""
Android.productFlavors.all {рд╕реНрд╡рд╛рдж ->
рдЕрдЧрд░ (targetName.toLowerCase ()ред (рдлреНрд▓реЗрд╡рд░.рдирд╛рдо рд╢рд╛рдорд┐рд▓ рд╣реИ)) {
tastePathSegment = рд╕реНрд╡рд╛рдж.рдирд╛рдо
}
}

        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 рдЖрдкрдиреЗ рдЗрд╕реЗ рдХрд╣рд╛рдБ рд░рдЦрд╛ рд╣реИ?

рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛.рдЧреНрд░реЗрдбред

DoFirst () рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд▓рдЧрд╛рдПрдВ

@AbhishekNairOfficial рдЖрдкрдиреЗ рдЗрд╕реЗ рдХрд╣рд╛рдБ рд░рдЦрд╛ рд╣реИ?

рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛.рдЧреНрд░реЗрдбред

DoFirst () рдмреНрд▓реЙрдХ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рд▓рдЧрд╛рдПрдВ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЕрдЧрд▓реЗ npm install ред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐, рд╕реАрдЖрдИ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛

рдХрд┐рд╕реА рдиреЗ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрджреЗрд╢реЛрдВ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА?

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 рдХрд╣ рд░рд╣рд╛ рд╣реИ, рдХрдЪреНрдЪреЗ рдФрд░

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд░рд┐рд▓реАрдЬрд╝ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдП рдЧрдП рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╡реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓ рд░рди-рдПрдВрдбреНрд░реЙрдЗрдб --variant = рд░рд┐рд▓реАрдЬрд╝ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рддрднреА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╡реЗ src / main рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

рдХрд┐рд╕реА рдХреЛ рднреА v0.61.5 рдкрд░ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реИ?

@ gudbrand3 рдореИрдВрдиреЗ рдЕрдВрддрддрдГ "рдиреЛрдб_рдореЙрдбреНрдпреВрд▓реНрд╕ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдореВрд▓рдХ / рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛.рдЧреНрд░рдиреНрде" рдХреЗ рдКрдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдлрд╝рд┐рдХреНрд╕ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдореИрдВ рдРрдкрд╕реНрдЯреЛрд░ рдореЗрдВ рдПрдХ рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХреВрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдХрд░рдирд╛ рдмреЗрддреБрдХрд╛ рд╣реИ, рдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рдХрд┐ рдпрд╣ рд╣рд╕рди рдХреНрдпреЛрдВ рд╣реИ 'рдЕрднреА рддрдХ рддрдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ...

@ wincod75 рд╕реБрди рд╕реБрди! рдореИрдВ рдЙрд╕реА рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ .. рдмреНрд▓рд╛ред рдореИрдВ рдпрд╛ рддреЛ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВ рдпрд╣ рд╕рд┐рд░реНрдл рдкреИрдХреЗрдЬ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдПрдХ рдмреЗрд╣рддрд░ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рдЕрдВрдд рдореЗрдВ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдм рдЗрд╕реЗ рдиреЛрдб_рдореЙрдбрд▓ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд▓реЛрдкрди рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдПрдирдкреАрдПрдо рдкреБрдирдГ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред #рдирд┐рд░рд╛рд╢рд╛ рд╣реЛрддреА

рдбреНрд░реЙ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдбреНрд░реЙрдмрд▓ рд╕рдВрд╕рд╛рдзрди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореБрдЭреЗ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореЗрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рд╛рде рдерд╛ 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

рд╕реНрд╡рдЪреНрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛, рдлрд┐рд░ рднреА рдирдЯрдЦрдЯ рднреВрдорд┐ рдХрдорд╛рди рдирд╣реАрдВ , рдлрд┐рд░ рд╕реЗ рдирд┐рд░реНрдорд╛рдгред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИ!

рдУрд╣ рдпрд╛рд░ред рд╢рд╛рдпрдж рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрдп рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИ?

рдореИрдВ v.0.61.4 рдкрд░ рдПрдХ рд╣реА рдореБрджреНрджрд╛ рд░рд╣рд╛ рд╣реВрдБ

рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ
рдкрд╣рд▓рд╛: рдореИрдВрдиреЗ рдирд┐рдореНрди рдХреЛрдб рдХреЛ 'doFirst' рдХреЗ рдмрд╛рдж node_modules / react-native / 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()
}

рджреВрд╕рд░рд╛: рдореИрдВрдиреЗ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рднреА рд╕рд╛рдордЧреНрд░рд┐рдпреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рд╣реИ android / app / src / main / res / raw
рдХрд┐рд╕реА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ

рдУрд╣ рдпрд╛рд░ред рд╢рд╛рдпрдж рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддрдп рд░рд╛рд╕реНрддреЗ рдкрд░ рд╣реИ?

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐, рдореИрдВ рдЖрд░.рдПрди. реж.ремреи.рез рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рднреА рднрд╛рдЧ рдЧрдпрд╛ рд╣реВрдВред

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:

рд╕рднреА рдиреЛрдб_рдореЙрдбреНрдпреВрд▓ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдХрдорд╛рдВрдб рдЪрд▓рд╛рдПрдБред

rm -rf drawable*/node*

рдЪрд░рдг 3:

рдЗрд╕ рдХрдорд╛рдВрдб рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдПрдкреАрдХреЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

./gradlew assembleRelease

рдЪрд░рдг 4:

рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдИ рдереАред 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 рдХреА рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВред

рдкреАрдЖрд░рдУ # 24518 рдФрд░ # 24778 рдореЗрдВ рдЙрд╕ рдбреЛрд▓рд╕реНрдЯ рд╕рд╛рдорд╛рди рдХреЛ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛, рдлрд┐рд░ # 25363 рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ред рдХреНрдпрд╛ рдХрд┐рд╕реА рдХреЛ рдкрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдХреНрдпреЛрдВ рд╣рдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛? рдпрд╣ рдПрдХ рд▓рдВрдмреА рдЦрдбрд╝реЗ рд╕рдорд╕реНрдпрд╛ рд░рд╣реА рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдЗрд╕реЗ рдареАрдХ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИред

рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ, рдпрд╣рд╛рдБ рдЙрддреНрддрд░ рджреЗрдВ:
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
рдФрд░ рдпрд╣рд╛рдБ: https://github.com/facebook/react-native/issues/25325

рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреЛ рдореЗрд░реА рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдПрдХ-рд▓рд╛рдЗрдирд░ рдХреЗ рдХреБрдЫ рдЬреЛрдбрд╝реЗ рд╣реИрдВ (рдПрдВрдбреНрд░реЙрдЗрдб рдПрдХреНрд╕ рдореБрджреНрджреЗ рдХреЗ рд▓рд┐рдП рднреА):

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 рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреИрдЪ рдлрд╝рд╛рдЗрд▓ рд╕рд╛рдЭрд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ

рдореИрдВрдиреЗ рдЗрд╕ рдкреИрдЪ рдХреЛ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдиреЗрдЯрд┐рд╡ 0.63.2 рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 'drawable- ' рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ 'mipmap-' рдХреЗ рд▓рд┐рдП рдирд╛рдо рджреЗрдВ, рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЛ рдПрдВрдбреНрд░реЙрдЗрдб / рдРрдк / 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

рдирдорд╕реНрддреЗ! рдХреНрдпрд╛ рдХреЛрдИ рдЗрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреАрдЖрд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИ? рдиреЛрдб_рдореЙрдбрд▓ рдХрд╛ рд╕рдВрдкрд╛рджрди рдЖрджрд░реНрд╢ рдирд╣реАрдВ рд╣реИред

рдирдорд╕реНрддреЗ,

рдореИрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рджреЗрд╢реА 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

madwed picture madwed  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ghost picture ghost  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

arunabha picture arunabha  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

josev55 picture josev55  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jobsamuel picture jobsamuel  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ