在撰写本文时,React Native的最新版本(>0.57.0)已将Gradle包装器升级到4.4,并将Gradle插件升级到3.1.4,正如changelog所示。这会导致Gradle构建过程将AAPT的结果存储在不同于以前的目录中,而这些结果现在是必需的。
就Nhan Cao的妙招而言,我们需要进行一些微小的修改,以防止重复资源冲突,因为它似乎指向了旧目录而不是应用程序的generated
目录。通过更改合并这些重复文件的目标目录,我们仍然可以去重资源。
现有的react.gradle
引用了以下路径:
$buildDir === <project-working-directory>/android/app/build
重复的文件路径可能出现在以下位置之间:
file("$buildDir/../src/main/res/drawable-${resSuffix}")
file("$buildDir/generated/res/react/release/drawable-${resSuffix}")
作为一种解决方法,我们可以按照以下方式更新Nhan的解决方案(请务必将其包含在react.gradle
中doFirst
声明之后的currentBundleTask
中):
作为变通方法,我们可以更新 Nhan 的解决方案如下(一定要在react.gradle
中 doFirst
声明后以currentBundleTask
的形式包含此内容):
(Two possible translations depending on whether the content is meant for technical or general audience.)
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/drawable-${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
如果您的应用程序也依赖于/raw
资源,则下面概述的方法应该能够帮助您:
doLast {
def moveFunc = { resSuffix ->
File originalDir = file("$buildDir/generated/res/react/release/${resSuffix}");
if (originalDir.exists()) {
File destDir = file("$buildDir/../src/main/res/${resSuffix}");
ant.move(file: originalDir, tofile: destDir);
}
}
moveFunc.curry("drawable-ldpi").call()
moveFunc.curry("drawable-mdpi").call()
moveFunc.curry("drawable-hdpi").call()
moveFunc.curry("drawable-xhdpi").call()
moveFunc.curry("drawable-xxhdpi").call()
moveFunc.curry("drawable-xxxhdpi").call()
moveFunc.curry("raw").call()
}
如果您的应用程序除了 release
之外还使用自定义的“构建类型”,例如preRelease
或stagingRelease
(Android Gradle Plugin允许您在 build.gradle
中定义它们),则应像以下更改 originalDir
变量:
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}")
File originalDir = file("$buildDir/generated/res/react/${targetName}/drawable-${resSuffix}")