React Nativeç°å¢æ å ±ïŒ
System:
OS: macOS 10.14
CPU: (4) x64 Intel(R) Core(TM) i5-7267U CPU @ 3.10GHz
Memory: 103.10 MB / 8.00 GB
Shell: 3.2.57 - /bin/bash
Binaries:
Node: 8.12.0 - /usr/local/bin/node
Yarn: 1.0.1 - /usr/local/bin/yarn
npm: 6.4.1 - /usr/local/bin/npm
Watchman: 4.7.0 - /usr/local/bin/watchman
SDKs:
iOS SDK:
Platforms: iOS 12.1, macOS 10.14, tvOS 12.1, watchOS 5.1
Android SDK:
API Levels: 16, 17, 19, 21, 23, 24, 25, 26, 27, 28
Build Tools: 19.1.0, 20.0.0, 23.0.1, 23.0.2, 23.0.3, 25.0.0, 25.0.1, 25.0.2, 25.0.3, 26.0.0, 26.0.1, 26.0.2, 26.0.3, 27.0.0, 27.0.1, 27.0.3, 28.0.0, 28.0.0, 28.0.2, 28.0.3
System Images: android-16 | ARM EABI v7a, android-16 | MIPS, android-16 | Intel x86 Atom, android-16 | Google APIs Intel x86 Atom, android-19 | Google APIs Intel x86 Atom, android-24 | Google Play Intel x86 Atom, android-26 | Google APIs Intel x86 Atom, android-26 | Google APIs Intel x86 Atom_64, android-26 | Google Play Intel x86 Atom, android-27 | Google Play Intel x86 Atom, android-28 | Google APIs Intel x86 Atom, android-P | Google APIs Intel x86 Atom, android-P | Google Play Intel x86 Atom
IDEs:
Android Studio: 3.2 AI-181.5540.7.32.5056338
Xcode: 10.1/10B61 - /usr/bin/xcodebuild
npmPackages:
react: 16.6.0-alpha.8af6728 => 16.6.0-alpha.8af6728
react-native: 0.57.4 => 0.57.4
npmGlobalPackages:
babel-preset-react-native: 4.0.0
react-native-cli: 2.0.1
react-native-create-library: 3.1.2
react-native-git-upgrade: 0.2.7
Androidã§PNGç»åã䜿çšããŠãªãªãŒã¹APKãäœæã§ããŸããã ãã ããPNGã€ã¡ãŒãžãå«ãŸããŠããªãå Žåã¯ããªãªãŒã¹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
react-native init demo
assets
ãã©ã«ããŒãäœæããŸããimage
ã³ã³ããŒãã³ããå®è£
ããŸãã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/
Generate Signed APK
ã䜿çšããŠãªãªãŒã¹APKãçæããŸãããã確èªããŠãã ããhttps://github.com/facebook/react-native/issues/19239#issuecomment-414564404
ãããŒã¢ãã«ãã©ã«ãã®ç»åãããå Žåã¯åé€ããå¿ èŠããããŸããïŒ
@ ZeroCool00ã¯Androidã®ç»åã«åœ±é¿ããŸãããïŒ
Mapsyã®çãã¯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 installãåžžã«å®è¡ãããããreact.gradleãã¡ã€ã«ã®ãã®å€æŽããªãŒããŒã©ã€ãããŸãã androidçšã®androidstudioã§ãã«ããäœæã§ããŸãããjenkinsã§ã¯äœæã§ããŸããã
ããã«ã¡ã¯@ vivek-walecha-657ç§ã¯ãããè©ŠããŠããŸãããããªãã©ã€ã³ãã³ããªã³ã°ãäœæããããã«ãã®ã³ãã³ããè©Šãããšãã§ããŸã
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle
@jeffreyrajanofficialæžããŠ
@jeffreyrajanofficialãã®åé¡ãçºçããããšãªããã©ã®ããŒãžã§ã³ïŒããããäœãããŒãžã§ã³ãŸãã¯ããããé«ãããŒãžã§ã³ïŒã
RN> 57ã§ãœãŒããããããã«ãªããŸãããreact.gradleãã¡ã€ã«ãèªåçã«ãã³ãã«ãäœæããŸãã
ãªãªãŒã¹ãã«ããäœæããããã«ã npm run buildïŒandroid ïŒreleaseãå®è¡å¿
èŠã¯ãããŸãã
55.4ã¯ããã«ãã€ãã£ãçãåå¿ãã䜿çšãããšãä¿®æ£ãbuild.gradle package.jsonã®ããã®ç§ã®ãµã³ãã«ãããžã§ã¯ãã®äž»æšã§ãã
https://gist.github.com/Abhishekgarg727/daf031fb9f94fdfd985e84db57dedbe1
macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3ã䜿çšããŠãããã¯ãŸã 衚瀺ãããŠããŸããã å€åç§ã ãã§ã¯ãªãã®ã§ããïŒ ãŸãã¯ãããã®èª°ãããããæ©èœããããšã確èªã§ããã®ã§ããã£ãšæãäžããŠå®éã«èªåã§ä¿®æ£ããŸãã
ç§ã¯çŸåšã @ mkchxããã®äžèšã®ã³ã¡ã³ãïŒgithubãæ·»ä»ãã¡ã€ã«ãåãå
¥ããããã«.txt
ãµãã£ãã¯ã¹ãè¿œå ãããŠããïŒã«åºã¥ããŠãæ·»ä»ããããšçµã¿åããããpatch-packageãããã±ãŒãžã§åé¿ããŠãpostinstall: patch-package
ãè¿œå ããåŸããnpminstallãã§ä¿®æ£ããŠãã ããã
å€åããã¯èª°ãã«åœ¹ç«ã€ã§ããã...
react-native + 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çšã«æŽæ°ïŒã§äœ¿çšããããã«ã patchsãã£ã¬ã¯ããªã«ããã圢åŒã§ãšã³ã³ãŒãããã
ã«ã¹ã¿ã ãã©ã«ãã«è¿œå ã®ãªãœãŒã¹ãããå Žåã¯ã次ã®ãããªãã®ãè©ŠããŠã¿ãŠãã ããã
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
ããã¯ç©æ¥µçã«è©äŸ¡ãããŠããŸããããããšãç¬èªã®ãããã§åé²ããå¿ èŠããããŸããïŒ
@dragosrouaxxxhdpiã«ã¬ãŒã«ãã€ãã³ããããŸããã å¶ç¶ã«ãããªãã«ãšã£ãŠåé¡ã®ããåãå å°çãªéã¯ãããŸããïŒ
ããªãã¯2åã§ç§ãæã¡è² ãããŸãããç§ã¯ãã®éšåãç·šéããããšããŠããŸããã ã¯ãããã¹ãŠããã³ãã«ãããŠããŸãããã«ã¹ã¿ã ãªãœãŒã¹ã®ãçã®ããã¹ãå«ãŸããŠãããããã¯èª°ãã«åœ¹ç«ã€å¯èœæ§ããããŸãã
@dragosrouaããªããä»ã³ã³ãã€ã«ããŠãããŠããããã§ã-ãããç§ã«ãšã£ãŠã©ãã»ã©èç«ãããããšã ã£ããèŠããŠããŸãããããŠç§ãPRãææ¡ããŠããŸãããããã¹ã¿ãŒã§ä¿®æ£ãããŠããªãããšã«ãŸã é©ããŠããŸãã ..
macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3ã䜿çšããŠãããã¯ãŸã 衚瀺ãããŠããŸããã å€åç§ã ãã§ã¯ãªãã®ã§ããïŒ ãŸãã¯ãããã®èª°ãããããæ©èœããããšã確èªã§ããã®ã§ããã£ãšæãäžããŠå®éã«èªåã§ä¿®æ£ããŸãã
ç§ã¯çŸåšã @ mkchxããã®äžèšã®ã³ã¡ã³ãïŒgithubãæ·»ä»ãã¡ã€ã«ãåãå ¥ããããã«
.txt
ãµãã£ãã¯ã¹ãè¿œå ãããŠããïŒã«åºã¥ããŠãæ·»ä»ããããšçµã¿åããããpatch-packageãããã±ãŒãžã§åé¿ããŠãpostinstall: patch-package
ãè¿œå ããåŸããnpminstallãã§ä¿®æ£ããŠãã ãããå€åããã¯èª°ãã«åœ¹ç«ã€ã§ããã...
react-native + 0.57.8.patch.txt
plsã¯ç§ã®react-native0.57.5ã§ã¯ãªããããæ©èœããªãã®ã説æããŠãããŸããïŒ
pacthãã¡ã€ã«ãäœæããŸããã package.jsonã«è¿œå ãããŸããã npm installãå®è¡ãããšãçµæãšããŠ
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ã«å¯ŸããŠã§ããïŒ
ç§ã¯éåžžãnode_modulesã«ããããé©çšããããã®Pythonã¹ã¯ãªãããäœæããŸãã
ãããpostinstall.py
ãšããŠè¿œå ããã€ã³ã¹ããŒã«åŸã®ã¹ã¯ãªããã«è¿œå ãããã ./postinstall.py
å®è¡ããŸãã
#!/usr/bin/env python3
import os
import textwrap
def file_dir():
return os.path.dirname(os.path.realpath(__file__))
def read_file(filename):
'''
Reads the specified file.
:param filename: The file to read
:return: The content of the specified file
'''
if os.path.exists(filename):
with open(filename, "r") as file:
return file.read()
else:
raise IOError("file {} not found.".format(filename))
def write_file(filename, text):
'''
Writes the specified text to the specified file.
:param filename: The file to write to
:param text: The text to write
'''
with open(filename, "w") as file:
file.write(text)
def fix_android_assets():
print("Fixing android error with duplicate assets: https://github.com/facebook/react-native/issues/22234")
gradle_file_path = "{}/node_modules/react-native/react.gradle".format(file_dir())
code_snippet = textwrap.indent("""\
// Added by post_install
// Fix for: https://github.com/facebook/react-native/issues/22234
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
""", "")
text = read_file(gradle_file_path)
start = text.find("doFirst", 0)
end = text.find("}", start)
end = text.find("\n", end) + 1
text = text[:end] + code_snippet + text[end:]
write_file(gradle_file_path, text)
def main():
fix_android_assets()
if __name__ == "__main__":
main()
ããã§ã¯ãå¿ èŠã«å¿ããŠç¬èªã®ã¹ã¯ãªãããè¿œå ã§ããŸã
npm install patch-package
åŸããããã®ã®åå®è£
ã®ããã«èŠããŸãããPythonãããªãã®ãã®ã§ãããèªåã§ããå€ãã®ã³ãŒããç¶æãããå Žåãããã¯å®è¡å¯èœã§ããããã«èŠããŸãã ç§ã¯ãŸã ãããããã±ãŒãžããã®äŸ¡å€ã®ããã«äœ¿çšããŠããŸãã0.59.3ã®ããã«
react-native + 0.59.3.patch.txt
@ hramos- ïŒ19239ã¯äŒŒãŠããŠïŒç§ã¯æãïŒãããã¯é·å¹Žã®ããšã§ãããä¿®æ£ãããŠããããã§ãã ããã¯æçµçãªä¿®æ£ã®ããã«PRãå¿ èŠãªã ãã§ããããããšãããã§äœ¿çšãããŠããããããå®è¡å¯èœã§ãªãçç±ããããŸãããïŒ ïŒç§ã¯ãããããããŸããïŒã PRãå¿ èŠãªå Žåã¯ãéä¿¡ã§ããŸã...
npm install patch-package
åŸããããã®ã®åå®è£ ã®ããã«èŠããŸãããPythonãããªãã®ãã®ã§ãããèªåã§ããå€ãã®ã³ãŒããç¶æãããå Žåãããã¯å®è¡å¯èœã§ããããã«èŠããŸãã ç§ã¯ãŸã ãããããã±ãŒãžããã®äŸ¡å€ã®ããã«äœ¿çšããŠããŸãã0.59.3ã®ããã«
react-native + 0.59.3.patch.txt@ hramos- ïŒ19239ã¯äŒŒãŠããŠïŒç§ã¯æãïŒãããã¯é·å¹Žã®ããšã§ãããä¿®æ£ãããŠããããã§ãã ããã¯æçµçãªä¿®æ£ã®ããã«PRãå¿ èŠãªã ãã§ããããããšãããã§äœ¿çšãããŠããããããå®è¡å¯èœã§ãªãçç±ããããŸãããïŒ ïŒç§ã¯ãããããããŸããïŒã PRãå¿ èŠãªå Žåã¯ãéä¿¡ã§ããŸã...
ãã®ãã¹ã®äœ¿ãæ¹ãããããšã
@ ZhanRu - httpsïŒ //github.com/ds300/patch-package#set -up-ããããã€ã³ã¹ããŒã«ããŠèšå®ããåŸããããžã§ã¯ãã®ãpatchesããã£ã¬ã¯ããªã«ãã®ãããïŒæ¡åŒµåã¯.patchïŒãé 眮ãããã ãã§ã-ããã±ãŒãž
@ ZhanRu - httpsïŒ //github.com/ds300/patch-package#set -up-ããããã€ã³ã¹ããŒã«ããŠèšå®ããåŸããããžã§ã¯ãã®ãpatchesããã£ã¬ã¯ããªã«ãã®ãããïŒæ¡åŒµåã¯.patchïŒãé 眮ãããã ãã§ã-ããã±ãŒãž
ã©ããããããšãããããŸãã
ãŸã ãã©ããŒããŠãã人ã®ããã«ãç§ã¯æè¿å€éšã·ã¹ãã ãçµ±åãããã¹ããæ¬çªã®å€éšããŒã¿ããåé¢ããå¿
èŠããããŸãããããã«ãããgradleã§ããã¬ãŒããŒãã䜿çšããŠãqaDebugãstagingReleaseãªã©ãå¥ã®å€éšã·ã¹ãã ã«ãã€ã³ããããããšãã§ããŸãã ããã®ãããã¯ããããµããŒãããŠããªãã£ãã®ã§ããã¬ãŒããŒã®ãµããŒããè¿œå ããŸãããç§ã®ãããã¯ä»ãã®ããã«ãªã£ãŠããŸãã patches/react-native+0.59.5.patch
ããã npm install patch-package
åŸã«npm i
ãå®è¡ãããŠããéã«é©çšãããŸãã
diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 4ead2b6..e0f92b7 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -48,6 +48,33 @@ afterEvaluate {
resourcesDir.mkdirs()
}
+ // From https://stackoverflow.com/questions/53239705/react-native-error-duplicate-resources-android
+ // Currently has no solution?
+
+ // IF you are using flavors, add flavor name to the path you move from
+ def flavorPathSegment = ""
+ android.productFlavors.all { flavor ->
+ if (targetName.toLowerCase().contains(flavor.name)) {
+ flavorPathSegment = flavor.name + "/"
+ }
+ }
+
+ doLast {
+ def moveFunc = { resSuffix ->
+ File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}")
+ if (originalDir.exists()) {
+ File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
+ ant.move(file: originalDir, tofile: destDir);
+ }
+ }
+ moveFunc.curry("ldpi").call()
+ moveFunc.curry("mdpi").call()
+ moveFunc.curry("hdpi").call()
+ moveFunc.curry("xhdpi").call()
+ moveFunc.curry("xxhdpi").call()
+ moveFunc.curry("xxxhdpi").call()
+ }
+
// Set up inputs and outputs so gradle can cache the result
inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
outputs.dir(jsBundleDir)
ç§ã®å Žåãåé¡ã¯raw
ãã£ã¬ã¯ããªã§è§£æ±ºã
ããŒãžã§ã³ïŒ react-native 0.59.5
ç§ã®è§£æ±ºçïŒ
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
def moveRawFunc = { dir ->
File originalDir = file("$buildDir/generated/res/react/release/${dir}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/${dir}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
moveRawFunc.curry("raw").call()
}
ãããã
@Dbroquaããªãã®ãœãªã¥ãŒã·ã§ã³ã¯ç§ã®ããã«åããïŒããŒãžã§ã³react-native 0.59.5
ïŒã ããããšãããããŸããã
éåžžã«èå³æ·±ã-ç§ã¯rawã«åé¡ã¯ãããŸããã§ãã-ç§ã®ææ°ããŒãžã§ã³ã®ãããããã¬ãŒããŒã®ãµããŒããè¿œå ããããšã«æ³šæããŠãã ããã ãã¬ãŒããŒã䜿ãå§ããå Žåã¯ããããã®äž¡æ¹ã®æ©èœã§ãã¬ãŒããŒããµããŒãããå¿ èŠããããŸãã ãã¶ãããã¯ã©ãããããããã©ã¡ãŒã¿åãããŠããã®ã§ã2ã€ã®æ©èœã¯ããã»ã©å埩çã§ã¯ãããŸããããç§ã¯ãããçèããã®ã«ååãªã°ã«ãŒãŽã£ãŒã§ã¯ãããŸããã
Facebookãreact-nativeCIã§ã¯ãBUCKã䜿çšããŠããŠãCIãã«ããæ¯åã¯ãªãŒã³ã§ããããããããåé¡ã§ã¯ãªããšæ³åã§ããŸãã 誰ããããããããã«åçŸããŠããã®ã§ãã¢ããã¹ããªãŒã ã§ä¿®æ£ãååŸã§ããŸããïŒ
ç§ã®å Žåãrawãã£ã¬ã¯ããªã«ã¯ã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšãããmp3ãå«ãŸããŠããŸãã
ããããè¿ éã§ç°¡åãªåçŸã®åºç€ã圢æãããããããŸããã ç§ã¯ãã®ãããªã¢ã»ãããïŒãŸã ïŒæã£ãŠããŸããããåå¿ããã®ã«ååç°¡åã§ã-ã¬ãã®ãã€ãã£ãinitãããã€ãã®ã¢ã»ãããå ¥ããŠã2çªç®ã®ãªãªãŒã¹ãã«ãïŒããããæåã®ãã«ãã§ãïŒïŒã§ããªãã¯ããããããŠãããšæããŸã...
@Dbroquaã¯æ³šæãå¿ èŠã§ããç§ã®ãããã¯ããŒãžãããŸããããçã®ãã£ã¬ã¯ããªã¯éåžžã«å¯æ¥ã«é¢é£ããŠããããç§ã®ãããã«ã¯å«ãŸããŠããªããšããããªãã®èšåãããŒãžã«åæ ãããŠããŸãã ç§ã®ããããå ¥ã£ãã®ã§ãrawãã£ã¬ã¯ããªã«ã©ã®ãããªå€æŽãå¿ èŠãã確èªããä¿®æ£ãç¶ç¶ããŠPRãææ¡ããã±ãŒã¹ã«åãããŠæ¡åŒµããããšããå§ãããŸãã
OKã
å¿ èŠãªããšã¯ã§ããã ãæ©ãããŸãã
ããããã
ããã¢ã³
ä¿®ç¹ïŒ
ç§ã®å ŽåããããŒã¢ãã«res/drawable-*
ãã£ã¬ã¯ããªã«ãããŒã ã³ãããã®ä»ã®éçºè
ããæ®ã£ãŠãããã¡ã€ã«ããããŸãã-ãããã®ãã¡ã€ã«åãæãããšã©ãŒïŒãªãœãŒã¹ã®éè€ããçºçããŸãã-ãããŒã¢ãã«ãããã¡ã€ã«ãåé€ããŸãããããŠãã¹ãŠãããŸããããŸãð
Mapsyã®çãã¯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ã¯ãæ°ããåé¡ãéãå¿ èŠããããŸã-å¯èœã§ããã°ããããªãã¯ãªããžããªã§åçŸå¯èœãªãã¹ãã±ãŒã¹ã䜿çšããŠ-ãããŠããããæ°ããPRãææ¡ããŸãã ãã®åé¡ã¯ç§ã®PRã«ãã£ãŠã¯ããŒãºãããè¿œå ã®åé¡ïŒæåã®PRãããŸãåŠçãããªãã£ãã±ãŒã¹ã®åŠçïŒãããŒãžãããã®ã§ãç§ãã¡ã¯ãã¹ãŠå ã«é²ã¿ãã»ãšãã©ã®å Žåã¯æ©èœããŠãããšæãã®ã§ããã®åé¡ã¯çºçããªãå¯èœæ§ããããŸã泚æã
ã¿ãªãããããã«ã¡ã¯-ãããä¿®æ£ããããã«ææ¡ããPRã¯ããŒãžãããŸããããæããã«ãªã°ã¬ãã·ã§ã³ãåŒãèµ·ãããŸã-httpsïŒ//github.com/facebook/react-native/issues/25325-調æ»äžã§ãããããã«Gradleã®é人ããããã©ãããã®ãªã°ã¬ãã·ã§ã³ãåŒãèµ·ãããã«ãã®åé¡ãä¿®æ£ããæ¹æ³ãå©ããŠããã ããã°å¹žãã§ã-ããããšãïŒ
ããŠãããã§é¢é£ããPRã«ã¯ãå ã«æ»ãPRãããããŸã-ããã¯ãªã°ã¬ãã·ã§ã³ãåŒãèµ·ããããã®åé¡ãåŒãèµ·ãããæ ¹æ¬çãªåé¡ã¯æ¬åœã«æªãããã¥ã¡ã³ãã§ããã
ãããéèŠã§ããå®éã«ã¯ããã«ãäžã«srcãã£ã¬ã¯ããªã«ã³ããŒããªãã§ãã ããã ç©äºãäžéäœã«ã³ããŒããŠçæããå¿ èŠããããŸãããã§ã«srcã«ç©äºãã³ããŒããŠããå ŽåïŒãã®ãããã䜿çšãã以åã®ãã«ãããããŸãã¯react-native bundleã³ãã³ãããïŒïŒ src / main / resã«ãªãããã«ããããã¯ãªã¢ããå¿ èŠããããŸããã£ã¬ã¯ããªã¯ã¯ãªãŒã³ã§ã-ãããžã§ã¯ãã®å®éã®ã¢ã»ããã®ã¿
ããã§ããªãã©ã€ã³ãã³ãã«ã䜿çšããŠAPKãæ§ç¯ããã«ã¯ãAPI <17ã§å®è¡ã§ããããã«éçºã§ããWebäžã®ãã¹ãŠã®äººãæšå¥šããæ¹æ³ãšã¯ç°ãªãæ¹æ³ã§å®è¡ããå¿ èŠããããŸãïŒãŸãã¯ãã®åé¡ãçºçããŸãïŒã
ããªãã欲ããã®ã¯ããªãã®android/app/build.gradle
ã§ãïŒ
project.ext.react = [
// This is what most people will need
bundleInDebug: project.hasProperty("bundleInDebug") ? project.getProperty("bundleInDebug") : false,
// If you use build variants it has to be like this - put your own names in there
bundleInDevDebug: project.hasProperty("bundleInDevDebug") ? project.getProperty("bundleInDevDebug") : false,
bundleInQaDebug: project.hasProperty("bundleInQaDebug") ? project.getProperty("bundleInQaDebug") : false,
bundleInStagingDebug: project.hasProperty("bundleInStagingDebug") ? project.getProperty("bundleInStagingDebug") : false,
bundleInProdDebug: project.hasProperty("bundleInProdDebug") ? project.getProperty("bundleInProdDebug") : false
]
次ã«ã react-native
次ã®ããã«åŒã³åºããŸããç°å¢å€æ°ãä»ããŠgradleãããžã§ã¯ãããããã£ãéä¿¡ããŸãã
ORG_GRADLE_PROJECT_bundleInDebug=true npx react-native run-android
ïŒãŸãã¯ããã®ORG_GRADLE_PROJECT_bundleInDevDebug=true npx react-native run-android --variant devDebug
ãããªããªã¢ã³ãã®å ŽåïŒ
macOS 10.14.3 + RN 0.57.8 + Android Studio 3.3 + Gradle 4.10.3ã䜿çšããŠãããã¯ãŸã 衚瀺ãããŠããŸããã å€åç§ã ãã§ã¯ãªãã®ã§ããïŒ ãŸãã¯ãããã®èª°ãããããæ©èœããããšã確èªã§ããã®ã§ããã£ãšæãäžããŠå®éã«èªåã§ä¿®æ£ããŸãã
ç§ã¯çŸåšã @ mkchxããã®äžèšã®ã³ã¡ã³ãïŒgithubãæ·»ä»ãã¡ã€ã«ãåãå ¥ããããã«
.txt
ãµãã£ãã¯ã¹ãè¿œå ãããŠããïŒã«åºã¥ããŠãæ·»ä»ããããšçµã¿åããããpatch-packageãããã±ãŒãžã§åé¿ããŠãpostinstall: patch-package
ãè¿œå ããåŸããnpminstallãã§ä¿®æ£ããŠãã ãããå€åããã¯èª°ãã«åœ¹ç«ã€ã§ããã...
react-native + 0.57.8.patch.txt
é©ãã°ããïŒ ä»ã®ãšããããããæè¯ã®çãã§ãïŒ
ç§ã¯ãŸã 0.59.9ã§ãããèŠãŠããŸãã @mkchxã®çãã¯ç§ã®ããã«åé¡ãæŽçããŸãã
@juliancorrea @scgoughã¯ããã«æ³šæããŠãã ãããç§ã¯ãã®ãœãªã¥ãŒã·ã§ã³ã¹ã¿ã€ã«ãå®å šã«å®è¡ããPRãåãå ¥ããŸãããããã®åŸã®åé¡ã®åŸããããå ã«æ»ãå¿ èŠããããŸããã ããã¯è¡ãæ¢ãŸãã®ãœãªã¥ãŒã·ã§ã³ã§ãã çŸåšæšå¥šãããŠãããœãªã¥ãŒã·ã§ã³ã®è©³çŽ°ãããã€ãäžèšã«æçš¿ããŸããããæšå¥šã§ããã®ã¯æ°ããã¹ã¿ã€ã«ã®ã¿ã§ãã @mkchxã®åçã«åºã¥ããŠæ·»ä»ãããå€ããããã䜿çšãããšãä»ã®ãšããã¯æ©èœããŸãããç¹å®ã®æ¡ä»¶äžã§ã®ã¿æ©èœããŸãããããžã§ã¯ãã§å°æ¥å¿ èŠã«ãªãå¯èœæ§ã®ããä»ã®äžè¬çãªã·ããªãªã§ã¯å€±æããŸãã
@ mikehardyOK-ä»ããããªãã®è§£æ±ºçãèŠãŠãããŸãã
ç§ãå®éã«æãã§ããã®ã¯ãAndroid Studioã®çœ²åä»ãAPKãã«ãããã³ãã«ãã¹ãããããããšã§ãïŒã¿ãŒããã«ãä»ããŠæåã§ãããè¡ãããïŒã
ããªããæäŸããèšå®ãèŠãŠããããã圹ç«ã€ãã©ããã確èªããŸãã
ç§ã¯ãŸã ããã§åé¡ãæ±ããŠããŸã...
ãªãªãŒã¹APKãã¡ã€ã«ãäœæã§ããªãããã§ãã ãã¹ãŠã®ã¢ã»ãããã¡ã€ã«ã§æ¬¡ã®ãšã©ãŒãçºçããŸãã
[drawable-mdpi-v4/filename] /Users/me/React/myapp/android/app/src/main/res/drawable-mdpi/filename.png
[drawable-mdpi-v4/filename] /Users/me/React/myapp/android/app/build/generated/res/react/release/drawable-mdpi/filename.png
ïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
drawable-mdpi
ãã©ã«ããŒã®äž¡æ¹ã®ã€ã³ã¹ã¿ã³ã¹ãåé€ããŸããããAPKçæã«ããããããå
ã«æ»ãããŠãšã©ãŒãçºçããŸãã
ãã³ãã«ãäœæããããã«ã以äžãæåã§å®è¡ããŠããŸãã
react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output android/app/src/main/assets/index.android.bundle --assets-dest android/app/src/main/res/
ç§ã®ã¢ããªã®gradleã«ã¯æ¬¡ã®ãã®ããããŸãã
project.ext.react = [
entryFile: "index.android.js",
bundleInRelease: true //I've tried true and false here
]
apply from: "../../node_modules/react-native/react.gradle"
è¿œå æ
å ±ãšåãããã«-ç§ã®ã¢ããªã¯ãããã°ã§æ£åžžã«ãã«ããããŸãïŒ react-native run-android
çµç±ïŒ
çŸæç¹ã§ã¯ããªãªãŒã¹APKããã«ãããå¯äžã®æ¹æ³ã¯ãäžèšã®doLast
å
ã«æ»ããPRä¿®æ£ã䜿çšããããšã§ãã
å°ãªããšãç§ã®åé¡ã®çç±/解決çããããããããªããšæããŸãã
ç§ã®å€ããã³ãã«ã³ãã³ãïŒRN 0.2.xãã䜿çšããŠããŸããïŒïŒïŒã¯ãã¢ã»ãããå®å
ãã©ã«ããŒandroid/app/src/main/res/
ããã·ã¥ããŸãã
以äžã®ãªã³ã¯ã«ã> RN57ã§ã¯å®éã«ã¢ã»ããã次ã®ãã©ã«ããŒã«ããã·ã¥ããå¿
èŠããããšããæçš¿ãæžãçããŸããã
android/app/build/intermediates/res/merged/release/
ãœãŒã¹ïŒ https ïŒ
ç§ã¯æ¬¡ã®ããšãããŸããïŒ
android/app/src/main/res/
ã³ããŒãããdrawable-mdpi
ã¢ã»ãããåé€ããŸããæŽæ°
APKã¯ã€ã³ã¹ããŒã«ãããŸããããã¢ããªã¯äŸå€ãé€ããŠã¯ã©ãã·ã¥ããŸãã
com.facebook.react.bridge.JSApplicationIllegalArgumentException: Error while updating property 'defaultSrc' of a view managed by: RCTImageView
...ç»åãèŠã€ãããªãããã§ãð
ã¢ããããŒã2
ïŒãããŸã§ã®ãšããïŒAPKãæ©èœãããããšãã§ããå¯äžã®æ¹æ³ã¯ã次ã®ããšãè¡ãããšã§ãã
android/app/src/main/res/
android/app/src/main/res/drawable-mdpi
ååãandroid/app/src/main/res/drawable-hdpi
ç§ã®ãã«ãgradleã¯æ¬¡ã®ãšããã§ãã
project.ext.react = [
entryFile: "index.android.js"
]
次ã«ãAPKããã«ããããŠå®è¡ãããŸã...
ãµã€ãããŒãïŒ
äºæããªããã°ãçºçããç»åã¹ã©ã€ããŒã³ã³ããŒãã³ãã§createBitmap
OutOfMemoryäŸå€ãçºçããŸããã
ãããã§ã¹ãã«ä»¥äžãè¿œå ãããšãã¢ããªãå床å®è¡ãããŸãïŒ android:largeHeap="true"
è¿œå ã«ãã£ãŠãªãŒã¯/ã³ã³ããŒãã³ãã®åé¡ãåé¿ãããããšã¯æ¿ç¥ããŠããŸããããããŸã§ã®ãšãããã¢ããªã¯åé¡ãªãå®è¡ãããŠããŸãã
React Native 0.60.0ã§ã¯ããã€ãã£ãããŒã¹ãéè€ãããªãœãŒã¹ãäœæããŠããããšã«æ°ä»ããŸããããrawãã©ã«ããŒã察象ãšããŠãããããäžèšã®åé¿çã¯æ©èœããŸããã
[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] CïŒ\ Projects \ some-app \ CLIENT \ android \ app \ src \ main \ resrawnode_modules_nativebase_dist_src_basic_icon_nbicons.json
[raw / node_modules_nativebase_dist_src_basic_icon_nbicons] CïŒ\ Projects \ some-app \ CLIENT \ android \ app \ build \ generate \ res \ reactreleaserawnode_modules_nativebase_dist_src_basic_icon_nbicons.jsonïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
ãã®åé¡ãæ±ããŠããä»ã®ãŠãŒã¶ãŒã®å ŽåïŒ
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
File originalDir = file("$buildDir/generated/res/react/release/raw");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/raw");
ant.move(file: originalDir, tofile: destDir);
}
}
CIã䜿çšããŠããå Žåãã©ãããã°ããã解決ã§ããŸããïŒ
ç§ã®å Žåãåé¡ã¯
raw
ãã£ã¬ã¯ããªã§è§£æ±ºãããŒãžã§ã³ïŒ
react-native 0.59.5
ç§ã®è§£æ±ºçïŒ
doLast { def moveFunc = { resSuffix -> File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}"); if (originalDir.exists()) { File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}"); ant.move(file: originalDir, tofile: destDir); } } def moveRawFunc = { dir -> File originalDir = file("$buildDir/generated/res/react/release/${dir}"); if (originalDir.exists()) { File destDir = file("$buildDir/../src/main/res/${dir}"); ant.move(file: originalDir, tofile: destDir); } } moveFunc.curry("ldpi").call() moveFunc.curry("mdpi").call() moveFunc.curry("hdpi").call() moveFunc.curry("xhdpi").call() moveFunc.curry("xxhdpi").call() moveFunc.curry("xxxhdpi").call() moveRawFunc.curry("raw").call() }
ãããã
ããã¯ããŸããããŸãïŒ
[drawable-mdpi-v4/node_modules_reactnativemaplink_src_images_uber] /Users/umair/my-app/android/app/src/main/res/drawable-mdpi/node_modules_reactnativemaplink_src_images_uber.png [drawable-mdpi-v4/node_modules_reactnativemaplink_src_images_uber] /Users/umair/my-app/android/app/build/generated/res/react/debug/drawable-mdpi/node_modules_reactnativemaplink_src_images_uber.png: Error: Duplicate resources
react-native run-android
ãå®è¡ãããšãã®ãšã©ãŒãçºçããŸããããªãªãŒã¹ãã«ãããã«ãããŠå®è¡ãããšçºçããŸããã äžèšã®è§£æ±ºçã¯ã©ããç§ã«ã¯ããŸããããŸããã
RN 0.60.5
æŽæ°ïŒäžèšã®ãããããã¡ãœãããå€æŽããŠã release
ãã£ã¬ã¯ããªã§ã¯ãªãdebug
ãåŒçšããå¿
èŠãããããšã«æ°ä»ãããããä¿®æ£ããŸããã ç§ãraw
ãã£ã¬ã¯ããªãä¿®æ£ããå¿
èŠããããŸãã
ç§ãåãåé¡ãæ±ããŠãããreact.gradleãããã¯ãããä¿®æ£ããŸããã ç§ã®å Žåãè€è£œããããªãœãŒã¹ã¯.OBJãã¡ã€ã«ãš.MTLãã¡ã€ã«ã§ãããç»åãªãœãŒã¹ã«åé¡ã¯ãããŸããã
[raw / assets_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salad_salad.mtl [raw / assets_res_salad_salad] / Users / sercanov / Projects / ARt / diner / DinerApp /android/app/src/main/res/raw/assets_res_salad_salad.objïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
[raw / assets_res_steak_steak] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_steak_steak.mtl [raw / assets_res_steak_steak] / Users / sercanov / Projects / ARt / diner /android/app/src/main/res/raw/assets_res_steak_steak.objïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
[raw / assets_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/src/main/res/raw/assets_res_salmon_salmon.mtl [raw / assets_res_salmon_salmon] / Users / sercanov / Projects / ARt / diner / DinerApp /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
ã¡ãã£ãš@mikehardyã¯å®éã«äž¡æ¹ã®ã¢ãããŒããè©ŠããŸããããã©ã¡ãããªãªãŒã¹ãã«ãã§æ©èœããŸããã§ããã ãããã°ã¢ãŒãã§ãåé¡ãªãåäœããŸãã
not-copy-to-srcã®æ¹æ³ã䜿çšãããšORG_GRADLE_PROJECT_bundleInArRelease=true npx react-native run-android --variant arRelease
ãããååŸããŸãã
ã¿ã¹ã¯ 'ïŒ appïŒmergeArReleaseResources 'ã®å®è¡ã«å€±æããŸããã
[raw / assets_res_salad_salad] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.mtl [raw / assets_res_salad_salad] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salad_salad.objïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
[raw / assets_res_steak_steak] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.mtl [raw / assets_res_steak_steak] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_steak_steak.objïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
[raw / assets_res_salmon_salmon] /Users/sercanov/Projects/ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.mtl [raw / assets_res_salmon_salmon] / Users / sercanov / Projects /ARt/diner/DinerApp/android/app/build/generated/res/react/ar/release/raw/assets_res_salmon_salmon.objïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
copy-to-srcdoLastã®æ¹æ³ã§äœ¿çšããå Žåã ãã«ããããã³ã«android / buildãã©ã«ããŒãã¯ãªã¢ããŠæåãããå¿ èŠããããŸããããã©ããããããã¢ã»ãããã¢ããªã§å©çšã§ããŸããã§ããã ããã¯ãçŸåšèª¿æ»äžã®ç§ã®ã³ãŒãã«é¢é£ããŠããå¯èœæ§ããããŸãã
not-copy-to-srcã®æ¹æ³ã«åãæ¿ãããšãã¯ãæåã«ãã¹ãŠãã¯ãªãŒã³ã¢ããããŠãåãæ¿ããå¿ èŠããããŸãã ç§ã®ãããžã§ã¯ãã«ã¯ã以åã®copy-to-srcã¹ã¿ã€ã«ããã®ãã³ãã«ã®èŠ³ç¹ããå€ãã®ããã¿ããããããããæ©èœããåã«ã¯ãªãŒã³ã¢ããããå¿ èŠãããããã®åŸã¯æ¯åæ©èœããŸããã
@ rahulkumar1409ããã¯ãã®ãšã©ãŒã§ç§ãå©ããŸããããå¥ã®ãšã©ãŒãã¹ããŒããŸã
ã¿ã¹ã¯ïŒreact-native-simple-download- managerïŒverifyReleaseResourcesã倱æããŸãã
ãªããããèµ·ããã®ãåãããŸããïŒ
ãã®è§£æ±ºçã¯ç§ã®ããã«åããã
ãããã£ãŠãåºæ¬çã«ã¯/node_modules/react-native/react.gradleãã¡ã€ã«ãç·šéããŸã
doFirstãããã¯ã®çŽåŸã«doLastãæåã§è¿œå ããŸãã
doFirst {...}
doLast {
def moveFunc = {resSuffix->
ãã¡ã€ã«originalDir = fileïŒ "$ buildDir / generate / res / react / release / drawable- $ {resSuffix}"ïŒ;
ifïŒoriginalDir.existsïŒïŒïŒ{
ãã¡ã€ã«destDir = fileïŒ "$ buildDir /../ src / main / res / drawable- $ {resSuffix}"ïŒ;
ant.moveïŒãã¡ã€ã«ïŒoriginalDirãtofileïŒdestDirïŒ;
}
}
moveFunc.curryïŒ "ldpi"ïŒãcallïŒïŒ
moveFunc.curryïŒ "mdpi"ïŒãcallïŒïŒ
moveFunc.curryïŒ "hdpi"ïŒãcallïŒïŒ
moveFunc.curryïŒ "xhdpi"ïŒãcallïŒïŒ
moveFunc.curryïŒ "xxhdpi"ïŒãcallïŒïŒ
moveFunc.curryïŒ "xxxhdpi"ïŒãcallïŒïŒ
}
ç§ãã¡ã¯react-native0.60.5ã䜿çšããŠããŸãã
@mikehardyãè¿°ã¹ãããã«è£œåãã¬ãŒããŒã䜿çšããŠããã @ Dbroquaãçµéšããããã«ãrawããã©ã«ããŒã«åé¡ããããŸããã
æçµçã«äž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ãæ··åãã次ã®ã³ãŒãã䜿çšããŸãã
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()
}
ãã®ã¹ã¬ããã¯ãè²¢ç®ããŠããããã¹ãŠã®äººã«æè¬ããæ¬åœã«åœ¹ã«ç«ã¡ãŸããã ð
ãªãªãŒã¹ãã«ãã§ã®ã¿éè€ãšã©ãŒãçºçããŸãã ç§ã¯react-native60.5ã䜿çšããŠããŸã
/release/drawable-xhdpi/node_modules_reactnavigationstack_lib_module_views_assets_backicon.pngïŒãšã©ãŒïŒãªãœãŒã¹ãéè€ããŠããŸã
bundleInDebugãtrueãšfalseã«èšå®ããããšããŸãããã圱é¿ã¯ãããŸããã
ã¢ããªã»ã³ã¿ãŒã䜿çšããŠãã«ãããŠããŸããããã«ã¯ãsrc / main / assets /appcenter-config.jsonãã¡ã€ã«ãå¿ èŠã§ãã ã«ã¹ã¿ã ãã©ã³ãã䜿çšããŠããã®ã§ãsrc / main / assets / fontsãã£ã¬ã¯ããªããããŸãã ãããåé¡ãåŒãèµ·ãããŠããå¯èœæ§ããããŸããïŒ
@ARichIVCåé¡ã¯ããšã©ãŒã¡ãã»ãŒãžã§åç §ãããŠãããã¡ã€ã«ã«ãããšæããŸãã
ãããè¡ãæ¢ãŸãã®ãœãªã¥ãŒã·ã§ã³ã§ãããã³ããŒããããã®ããsrc /ãã¯ãªã¢ããå¿ èŠãããããšã«æ°ä»ãåã«ããã®å ã®ãœãªã¥ãŒã·ã§ã³ã®æšæºçãªãç§ã®src /ãã£ã¬ã¯ããªã以åã®ã³ããŒã¹ã¿ã€ã«ã®ãã³ãã«ããã±ãŒãžåŠçã®è©Šã¿ã«ãã£ãŠæ±æãããŠãããåé¡ã®ããã§ãã bundleInDebugãå®è¡ããåŸç¶ã®ãœãªã¥ãŒã·ã§ã³ãè©Šãåã®ããšã æ®å¿µãªããæ±ãã«ããé·ãã®ã¯ãã®ã¹ã¬ããã®ãã¹ãŠã§ãããæ å ±ã¯ããã«ãããŸã
@mikehardyã«ãååããã ãããããšãããããŸãã ã¢ã»ãããã£ã¬ã¯ããªã«ãã©ã³ããªã©ãæ®ããŠããã®ã¯åé¡ãªãããšãããããŸããããã¶ãäžãã£ãŠããä»ã®æçãåé€ããå¿ èŠããããŸããã ã€ãŸãã\ android \ app \ src \ main \ res \ drawable-hdpi \ã®ãã¹ãŠ
ãã©ã³ãã®å Žåã§ããæ£ãããã£ã¬ã¯ããªã«ããå¿ èŠãããããšã«æ³šæããŠãã ãã-äŸïŒ https ïŒ https://github.com/oblador/react-native-vector-icons/blob/master/fonts.gradle#L16-ãã¡ããããã¹ãŠã®ãããžã§ã¯ãã¯ç°ãªããŸãããèšåãã䟡å€ããããšæããŸãã
ç§ãã¡ã¯react-native0.60.5ã䜿çšããŠããŸãã
@mikehardyãè¿°ã¹ãããã«è£œåãã¬ãŒããŒã䜿çšããŠããã @ Dbroquaãçµéšããããã«ãrawããã©ã«ããŒã«åé¡ããããŸããã
æçµçã«äž¡æ¹ã®ãœãªã¥ãŒã·ã§ã³ãæ··åãã次ã®ã³ãŒãã䜿çšããŸãã
doLast { def moveFunc = { resSuffix -> File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/drawable-${resSuffix}") if (originalDir.exists()) { File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}") ant.move(file: originalDir, tofile: destDir) } } def moveRawFunc = { dir -> File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}release/${dir}") if (originalDir.exists()) { File destDir = file("$buildDir/../src/main/res/${dir}") ant.move(file: originalDir, tofile: destDir) } } moveFunc.curry("ldpi").call() moveFunc.curry("mdpi").call() moveFunc.curry("hdpi").call() moveFunc.curry("xhdpi").call() moveFunc.curry("xxhdpi").call() moveFunc.curry("xxxhdpi").call() moveRawFunc.curry("raw").call() }
ãã®ã¹ã¬ããã¯ãè²¢ç®ããŠããããã¹ãŠã®äººã«æè¬ããæ¬åœã«åœ¹ã«ç«ã¡ãŸããã ð
ã§ããŸãïŒ ã©ããããããšãããããŸãïŒ ð
åå¿ãã€ãã£ã0.59.1以éã®å Žåãnode_modules / react-nativeã®react.gradleã«ä»¥äžã®ã³ãŒããè¿œå ããå¿ èŠããããŸãã
def flavorPathSegment = ""
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name)) {
flavorPathSegment = flavor.name
}
}
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/${flavorPathSegment}/release/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
@ dayachand-systematixãã®æªãã¢ããã€ã¹ã ãã®ã¹ã¿ã€ã«ã®ãœãªã¥ãŒã·ã§ã³ã¯ãPRããããçµ±åããããŸã§è¿œæ±ãããŸããã ãã®åŸãæ¹åãééã£ãŠããããšãå€æããPRãå ã«æ»ãããŸããã å®éã«PRããŒãžãå ã«æ»ãããåå ãšãªã£ããœãªã¥ãŒã·ã§ã³ã䜿çšããããã«ã¢ããã€ã¹ããŸããïŒ ãããã¯ã»ã»ã»ããªãã ããã https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
@mikehardyã¯ãããããæ°žç¶çãªè§£æ±ºçã§ã¯ãªãããšã¯ããã£ãŠããŸãããæ£åžžã«æ©èœããŠããŸãã ãŸãã resãã£ã¬ã¯ããªã«ã¹ãã©ãã·ã¥ç»é¢ãDBãªã©ã®ä»ã®ãã¡ã€ã«ãããããããœãªã¥ãŒã·ã§ã³ã䜿çšã§ããŸããã
ã¯ã@ dayachand-ç§ãsystematixïŒ
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
ããã§ããææ¡ããã/ PRãå ã«æ»ãããŠããªã解決çã¯ç§ã«ãšã£ãŠã¯ããŸããããŸãïŒman_shruggingïŒ
ããã --asset-dest
ãã©ã¡ãŒã¿ãåé€ããŠä¿®æ£ããŸããã
react-native bundle --platform android --dev false --entry-file index.js --bundle-output android/app/src/main/assets/index.android.bundle
@ hery-finimize hi- --asset-dest
ãã©ã¡ãŒã¿ãåé€ããªããšãææ°ã®ã¢ã»ãããæ£ããå Žæã«ãã³ãã«ãããŸãã...ãããã£ãŠãAPKãäœæãããšãæ¬ èœããããæ¬ èœãããããå±éºããããŸããã¢ããªã®ã¢ã»ãããã¡ã€ã«ã®æ¥ä»ïŒ
@scgoughãããããããªããšæããŸããã ãã®å ŽåãAndroid Studioã§ãã«ãããåã«å¿ èŠãªããŒã«ã«ã¢ã»ãããé€ããŠãéè€ãããã¹ãŠã®ã¢ã»ãããéžæçã«åé€ã§ããŸãã
find android/app/src/main/res/drawable-* \( -name launch_screen.png -o -name ic_stat_onesignal_default.png -prune \) -o -type f -exec rm {} +
çæ³çã§ã¯ãããŸããããããã解決ããããŸã§æ©èœããã¯ãã§ãã
ãã®åé¡ã¯ããã®ãããªã¢ã»ãããã©ã«ãã«åãååãšç°ãªãæ¡åŒµåã®ãã¡ã€ã«ãããå Žåã«çºçããŸãã
back.png
back.jpg
ã¢ã³ããã€ãã§ã¯äž¡æ¹ãšããã®ããã«åŒãã§ããããã§ãã
R.drawable.back
R.drawable.back
ãã¡ã€ã«ã®1ã€ãåé€ãããååãå€æŽããŸãã
ããã«ã¡ã¯ã
react.gradleãå€æŽããããšããŸããïŒãã«ãã¯ããã«äžæ©é²ãã§ããŸãïŒapp.aabã¯ãã«ããããŠããŸãããAPKããã«ãã§ããŸããã
Android Studioã§APKããã«ãããããšããŸããããåé¡ã¯ãããŸããã§ããïŒreact.gradleãžã®ãããã§ïŒã
APKããã«ãããããã»ã¹ã¯ã©ã¡ãã®å Žåãåãã§ããå¿
èŠããããããç§ã«ãšã£ãŠã¯éåžžã«å¥åŠã§ãã ç§ãééã£ãŠãã ïŒ
ãã®ã³ã¡ã³ãã¯0.59.10ã§æ©èœããŸããã ãã®èŠç¹ãšæ··ããŠã
ã©ããããããšãã@ dayachand-systematixïŒ
ç§ã®ããã«åããã®ã¯ã2ã€ã®ã³ã¡ã³ãã®çµã¿åããã§ããïŒ
ä»ã®äººãå¿ èŠãšãããããããªã人ã®ããã«ããããããã«è²Œãä»ããŠããŸãã
`` `
defflavorPathSegment = ""
android.productFlavors.all {ãã¬ãŒããŒ->
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ããã¯ã©ãã«çœ®ããŸããïŒ
@AbhishekNairOfficialããã¯ã©ãã«çœ®ããŸããïŒ
node_modules / react-native /react.gradleã
ãããdoFirstïŒïŒãããã¯ã®åŸã«çœ®ããŸã
@AbhishekNairOfficialããã¯ã©ãã«çœ®ããŸããïŒ
node_modules / react-native /react.gradleã
ãããdoFirstïŒïŒãããã¯ã®åŸã«çœ®ããŸã
ãã®åé¡ãåé¿ããæ£ããæ¹æ³ã§ã¯ãªããšæããŸãã ãã®å€æŽã¯æ¬¡ã®npm install
ã§äžæžããããããã§ãã ã§ããCIã¯æ©èœããŸãã
誰ãã以äžã®ã³ãã³ããè©ŠããŸãããïŒ
cd android
./gradlew clean
cd ..
ããã¯ç§ã®ããã«åãã
ç§ã®ããã«åããã®ã¯ã2ã€ã®ã³ã¡ã³ãã®çµã¿åããã§ããïŒ
ä»ã®äººãå¿ èŠãšãããããããªã人ã®ããã«ããããããã«è²Œãä»ããŠããŸãã
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
ç§ã®ããã«åããã®ã¯ã2ã€ã®ã³ã¡ã³ãã®çµã¿åããã§ããïŒ
ä»ã®äººãå¿ èŠãšãããããããªã人ã®ããã«ããããããã«è²Œãä»ããŠããŸãã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å
ã®ãã¹ãŠã®ãã¡ã€ã«ãåé€
ããã¯ç§ã®ããã«åããŠããŸãïŒ
ç§ã®ããã«åããã®ã¯ã2ã€ã®ã³ã¡ã³ãã®çµã¿åããã§ããïŒ
ä»ã®äººãå¿ èŠãšãããããããªã人ã®ããã«ããããããã«è²Œãä»ããŠããŸãã
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ãèšã£ãŠããããã«ãçã®æç»å¯èœãªãã©ã«ããŒãåé€ããããšã¯ããã¹ãŠã®ç»åãåé€ããããããå®éã«ã¯è§£æ±ºçã§ã¯ãããŸããã
ãããã¯ãªãªãŒã¹ãã«ãçšã«åäœæãããŸãããreact-native run-android --variant = releaseãå®è¡ããŠãããšãã«ãæ©èœããsrc / mainã«ããå Žåã«ã®ã¿æ©èœãããã®åŸãã«ãã§ããªããšäŸ¿å©ã§ãã ã
誰ã§ãv0.61.5ã§è§£æ±ºã§ããŸãããïŒ
@ gudbrand3æçµçã«ããnode_modules / react-native / react.gradleããã¡ã€ã«ã«äžèšã®ä¿®æ£ãå®è£ ããŠãã¢ããªã¹ãã¢ã«æ°ãããã«ããååŸã§ããããã«ããŸãããããããè¡ãå¿ èŠãããã®ã¯ã°ãããŠããŸãããŸã ä¿®æ£ãããŠããŸãã...
@ wincod75ãã€ãã€ïŒ ç§ã¯åãã§çµãã£ã..äœãšãã ãšã«ããæåã§ããããšã«ãªãã®ã§ãããè¯ãã¢ãããŒããèŠã€ãããŸã§ãããã±ãŒãžã«å«ãŸããŠããªãçç±ãããããŸããã ããã§ãnode_modulesãåé€ãããã³ã«åå®è¡ããnpminstallãåå®è¡ããå¿ èŠããããŸãã ïŒã€ã©ã€ã©ãã
ä¿æããå¿
èŠã®ãããããŒã¢ãã«ãªãœãŒã¹ããã£ãããããããŒã¢ãã«ãã©ã«ããåé€ããŠãæ©èœããŸããã§ããã ç§ã®åé¡ã¯ã android/app/src/main/res/raw
ãã©ã«ããŒå
ã®ãã¹ãŠã®duplicate resources
ãšã android/app/src/main/res/drawable
ãã©ã«ããŒå
ã®nodemodules...
ã§å§ãŸããã¡ã€ã«ã«ãããŸããã ããã¯ç§ã«ãšã£ãŠåé¡ã解決ããŸããïŒ
android/app/build.gradle
è¿œå ïŒ
...
project.ext.react = [
...
bundleInRelease : true,
resourcesDirRelease : "src/release/res",
...
]
...
android/app/src/main/drawable*
ããnode
ã§å§ãŸããã¹ãŠãåé€ããïŒ
rm android/app/src/main/drawable*/node*
rm -rf android/app/src/main/raw
ãããžã§ã¯ããã¯ãªãŒã³ã¢ãããã REACT NATIVE BUNDLEã³ãã³ããå®è¡ããªãã§ãã ããããã®åŸãåãã«ãããŠãã ããã
ããã誰ããå©ããããšãé¡ã£ãŠããŸãïŒ
ããå°å¹Žã ãã¶ããå ¬åŒã®ä¿®æ£ãé²è¡äžã§ããïŒ
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()
}
2çªç®ïŒandroid / app / src / main / res / rawãã©ã«ããŒã®ãã¹ãŠã®ã³ã³ãã³ããåé€ããŸãã
誰ãã«åœ¹ç«ã€ãããããŸãã
ããå°å¹Žã ãã¶ããå ¬åŒã®ä¿®æ£ãé²è¡äžã§ããïŒ
ç§ã¯ããé¡ã£ãŠããŸããç§ã¯RN 0.62.1ã䜿çšããŠããŠããã®åé¡ã«ãééããŸããã
doLastã³ãŒããè¿œå ãããã ãã©ã«ããŒããŸãã
å ¬åŒã®æšå¥šäºé ãç¥ãããã®ã§ããïŒ
ããããšãããããŸãã
ä¿æããå¿ èŠã®ãããããŒã¢ãã«ãªãœãŒã¹ããã£ãããããããŒã¢ãã«ãã©ã«ããåé€ããŠãæ©èœããŸããã§ããã ç§ã®åé¡ã¯ã
android/app/src/main/res/raw
ãã©ã«ããŒå ã®ãã¹ãŠã®duplicate resources
ãšãandroid/app/src/main/res/drawable
ãã©ã«ããŒå ã®nodemodules...
ã§å§ãŸããã¡ã€ã«ã«ãããŸããã ããã¯ç§ã«ãšã£ãŠåé¡ã解決ããŸããïŒ
android/app/build.gradle
è¿œå ïŒ... project.ext.react = [ ... bundleInRelease : true, resourcesDirRelease : "src/release/res", ... ] ...
android/app/src/main/drawable*
ããnode
ã§å§ãŸããã¹ãŠãåé€ããïŒrm android/app/src/main/drawable*/node* rm -rf android/app/src/main/raw
ãããžã§ã¯ããã¯ãªãŒã³ã¢ãããã REACT NATIVE BUNDLEã³ãã³ããå®è¡ããªãã§ãã ããããã®åŸãåãã«ãããŠãã ããã
ããã誰ããå©ããããšãé¡ã£ãŠããŸãïŒ
äžèšã®è§£æ±ºçã¯ç§ããŸãšããªçããèŠã€ããã®ã«åœ¹ç«ã¡ãŸããïŒ
android/app/build.gradle
è¿œå ïŒ
...
project.ext.react = [
...
bundleInRelease : true,
resourcesDirRelease : "src/release/res",
...
]
...
次ã®ã³ãã³ããå®è¡ããŠããã¹ãŠã®node_moduleãã¡ã€ã«ãåé€ããŸãã
rm -rf drawable*/node*
ãã®ã³ãã³ããå®è¡ããŠãAPKããã«ãããŸãã
./gradlew assembleRelease
package.jsonã§äœ¿çšãã次ã®ã¹ã¯ãªãããäœæããŸãã
"release-apk": "cd android && yarn remove-duplicate-files && ./gradlew assembleRelease"
ã圹ã«ç«ãŠãã°ïŒ
ãããŠããœãªã¥ãŒã·ã§ã³ãææ¡ããŠããããã¹ãŠã®äººã«æè¬ããŸã
ç»å以å€ã®RAWãªãœãŒã¹ã«åé¡ãããå Žåã åãååã§æ¡åŒµåãç°ãªããã¡ã€ã«ã®ååãå€æŽããããšã§è§£æ±ºããŸãã
object.obj
ãšobject.mtl
ãã¡ã€ã«ããããŸããã æ¡åŒµæ©èœãç°ãªã£ãŠããŠããéè€ãªãœãŒã¹ãšã©ãŒãçºçããŸããã ã¢ã³ããã€ãã¯ãã¡ã€ã«åã§ããããæŸãããã§ãã ãããã£ãŠã object.mtl
ååãobject_material.mtl
ã«å€æŽãããšããããã解決ããŸããã
ç»åãªãœãŒã¹ã«ã€ããŠãåãå ŽåããããŸããåãååã®ç»åãããå Žåã¯ãååãå€æŽããŠã¿ãŠãã ããã
ç§ã®ããã«åããã®ã¯ã2ã€ã®ã³ã¡ã³ãã®çµã¿åããã§ããïŒ
ä»ã®äººãå¿ èŠãšãããããããªã人ã®ããã«ããããããã«è²Œãä»ããŠããŸãã
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ã®ããã«èŠããŸãã
ãã®ãã¹ãŠã®ææªã®ãã®ã¯PRïŒ24518ãšïŒ24778ã§è¿œå ãããïŒ25363ã§åã³åé€ãããŸããã ãªãåé€ãããã®ã誰ãç¥ã£ãŠããŸããïŒ ããã¯é·å¹Žã®åé¡ã§ãããç§ã¯åœŒãããããä¿®æ£ãããšæããŸããã
æ°ã«ããªãã§ãããã§çããŠãã ããïŒ
https://github.com/facebook/react-native/issues/22234#issuecomment -504721069
ãããŠããïŒ https ïŒ
ããã圹ç«ã€å Žåã¯ãããã«ç§ã®ã¹ã¯ãªããããã®ã¯ã³ã©ã€ããŒãããã€ããããŸãïŒAndroid Xã®åé¡ã«ã€ããŠãïŒïŒ
echo "Fixing java error: package android.support.v4.widget does not exist issue with Android X"
npm install jetifier
npx jetify
echo "Fixing duplicate resources issue"
rm -rf .../android/app/src/main/res/raw
cd .../node_modules/react-native
cat <<EOT >> react_gradle.patch
121a122,137
> doLast {
> def moveFunc = { resSuffix ->
> File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
> if (originalDir.exists()) {
> File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
> ant.move(file: originalDir, tofile: destDir);
> }
> }
> moveFunc.curry("ldpi").call()
> moveFunc.curry("mdpi").call()
> moveFunc.curry("hdpi").call()
> moveFunc.curry("xhdpi").call()
> moveFunc.curry("xxhdpi").call()
> moveFunc.curry("xxxhdpi").call()
> }
>
EOT
ls -l react_gradle.patch
patch react.gradle react_gradle.patch
ãããŠããã®ãœãªã¥ãŒã·ã§ã³ã¯ããªãªãŒã¹ãã«ãã®äœæã«åœ¹ç«ã¡ãŸããïŒ https ïŒ
次ã®æé ã¯ç§ã®ããã«ãããããŸããïŒ
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
åããšã©ãŒãçºçããŸãã 解決çã¯ãããŸããïŒ
誰ããreactnative0.62.2ã®ããããã¡ã€ã«ãå ±æã§ããŸãã
React Native0.63.2çšã«ãã®ããããäœæããŸããã 'drawable- 'ãã©ã«ããŒãããå Žåã¯ãååã'mipmap-'ã«å€æŽããŸãããã®ãã©ã«ããŒã®åç §ã¯ã android / app / src / main /AndroidManifest.xmlã§å€æŽã§ããŸãã
ããããããžã§ã¯ãã®ã«ãŒãã§å®è¡ããŠãããããã¡ã€ã«ãäœæããŸã
cat <<EOT >> react-native-0.63.2-react.gradle.patch
@@ -147,6 +147,23 @@
jsSourceMapsDir.mkdirs()
}
+ doLast {
+ def moveFunc = { resFolder ->
+ File originalDir = file("\${buildDir}/generated/res/react/release/\${resFolder}");
+ if (originalDir.exists()) {
+ File destDir = file("\${buildDir}/../src/main/res/\${resFolder}");
+ ant.move(file: originalDir, tofile: destDir);
+ }
+ }
+ moveFunc.curry("drawable-ldpi").call()
+ moveFunc.curry("drawable-mdpi").call()
+ moveFunc.curry("drawable-hdpi").call()
+ moveFunc.curry("drawable-xhdpi").call()
+ moveFunc.curry("drawable-xxhdpi").call()
+ moveFunc.curry("drawable-xxxhdpi").call()
+ moveFunc.curry("raw").call()
+ }
+
// Set up inputs and outputs so gradle can cache the result
inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
outputs.dir(jsBundleDir)
EOT
次ã«ãããããé©çšããŸã
patch node_modules/react-native/react.gradle < react-native-0.63.2-react.gradle.patch
ãŸããè¡ãããšããå§ãããŸã
rm -Rf android/.gradle
cd android && gradlew clean
node_ modules/react-native/react.gradle
ãandroid/app/react.gradle
ã«ã³ããŒããŠããã android/app/build.gradle
ãšandroid/app/react.gradle
ãŸãã
android/app/build.gradle
- apply from: "../../node_modules/react-native/react.gradle"
+ apply from: "./react.gradle"
android/app/react.gradle
doFirst {
jsBundleDir.deleteDir()
jsBundleDir.mkdirs()
resourcesDir.deleteDir()
resourcesDir.mkdirs()
jsIntermediateSourceMapsDir.deleteDir()
jsIntermediateSourceMapsDir.mkdirs()
jsSourceMapsDir.deleteDir()
jsSourceMapsDir.mkdirs()
}
+
+ doLast {
+ def moveFunc = { resSuffix ->
+ File originalDir = file("${resourcesDir}/drawable-${resSuffix}")
+ if (originalDir.exists()) {
+ File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}")
+ ant.move(file: originalDir, tofile: destDir)
+ }
+ }
+ def moveRawFunc = { dir ->
+ File originalDir = file("${resourcesDir}/${dir}")
+ if (originalDir.exists()) {
+ File destDir = file("$buildDir/../src/main/res/${dir}")
+ ant.move(file: originalDir, tofile: destDir)
+ }
+ }
+
+ moveFunc.curry("ldpi").call()
+ moveFunc.curry("mdpi").call()
+ moveFunc.curry("hdpi").call()
+ moveFunc.curry("xhdpi").call()
+ moveFunc.curry("xxhdpi").call()
+ moveFunc.curry("xxxhdpi").call()
+ moveRawFunc.curry("raw").call()
+ }
ããã¯react-native 0.63.2
ã§ç§ã®ããã«åããŸã
doLast {
def flavorPathSegment = ""
println targetName.toLowerCase();
android.productFlavors.all { flavor ->
if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
flavorPathSegment = flavor.name
}
}
def moveFunc = { resFolder ->
File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
if (originalDir.exists()) {
File destDir = file("${buildDir}/../src/main/res/${resFolder}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("drawable").call()
moveFunc.curry("drawable-ldpi").call()
moveFunc.curry("drawable-mdpi").call()
moveFunc.curry("drawable-hdpi").call()
moveFunc.curry("drawable-xhdpi").call()
moveFunc.curry("drawable-xxhdpi").call()
moveFunc.curry("drawable-xxxhdpi").call()
moveFunc.curry("raw").call()
}
ããã«ããããã¡ã€ã«react-native+0.63.2.patch
diff --git a/node_modules/react-native/react.gradle b/node_modules/react-native/react.gradle
index 6441d93..1eb4645 100644
--- a/node_modules/react-native/react.gradle
+++ b/node_modules/react-native/react.gradle
@@ -147,6 +147,33 @@ afterEvaluate {
jsSourceMapsDir.mkdirs()
}
+ doLast {
+ def flavorPathSegment = ""
+ println targetName.toLowerCase();
+ android.productFlavors.all { flavor ->
+ if (targetName.toLowerCase().contains(flavor.name.toLowerCase())) {
+ flavorPathSegment = flavor.name
+ }
+ }
+ def moveFunc = { resFolder ->
+ File originalDir = file("${buildDir}/generated/res/react/${flavorPathSegment}/release/${resFolder}");
+ if (originalDir.exists()) {
+ File destDir = file("${buildDir}/../src/main/res/${resFolder}");
+ ant.move(file: originalDir, tofile: destDir);
+ }
+ }
+
+ moveFunc.curry("drawable").call()
+ moveFunc.curry("drawable-ldpi").call()
+ moveFunc.curry("drawable-mdpi").call()
+ moveFunc.curry("drawable-hdpi").call()
+ moveFunc.curry("drawable-xhdpi").call()
+ moveFunc.curry("drawable-xxhdpi").call()
+ moveFunc.curry("drawable-xxxhdpi").call()
+ moveFunc.curry("raw").call()
+ }
+
+
// Set up inputs and outputs so gradle can cache the result
inputs.files fileTree(dir: reactRoot, excludes: inputExcludes)
outputs.dir(jsBundleDir)
diff --git a/node_modules/react-native/scripts/.packager.env b/node_modules/react-native/scripts/.packager.env
new file mode 100644
index 0000000..21a13cf
--- /dev/null
+++ b/node_modules/react-native/scripts/.packager.env
@@ -0,0 +1 @@
+export RCT_METRO_PORT=8081
\ No newline at end of file
ããã«ã¡ã¯ãã¿ããªïŒ 誰ãããããã®å€æŽã®PRãè¡ãããšãã§ããŸããïŒ node_modulesã®ç·šéã¯çæ³çã§ã¯ãããŸããã
ããã«ã¡ã¯ãã¿ããªã
ç§ã¯react-native0.63.2ã䜿çšããŠããŸãã ãŸãããã®åé¡ã«çŽé¢ããreact.gradleã®ç·šéããªãœãŒã¹/ãããŒã¢ãã«ã®åé€ãªã©ãè©ŠããŸããã ããããã€ãã«ã³ãã³ãgradlew assembleRelease
ããŸããããŸããã
ç§ã¯react-nativebundleã³ãã³ããå®è¡ããŸããã§ããã gradlew assembleRelease
ã¯react-nativeãã³ãã«ãå®è¡ãã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
ããããšãããããŸãã
æãåèã«ãªãã³ã¡ã³ã
Mapsyã®çãã¯https://stackoverflow.com/a/52750886ã«åœ¹ç«ã€ã¯ãã§ã
ãããã£ãŠãåºæ¬çã«ã¯/node_modules/react-native/react.gradleãã¡ã€ã«ãç·šéããŸã
ãããŠæåã§ãå³doFirstãããã¯ã®åŸdoLastãè¿œå ããŸãã