APK 생성시 네이티브 Android 중복 파일 오류에 대응
을 사용하여 Android apk를 생성하려고 할 때 ./gradlew installRelease
콘솔에 다음 오류가 발생합니다.
~/React-Native/mockingbird/android/app/build/intermediates/res/merged/release/drawable-mdpi-v4/src_resources_img_loading.gif: error: Duplicate file.
~/React-Native/mockingbird/android/app/build/intermediates/res/merged/release/drawable-mdpi/src_resources_img_loading.gif: Original is here. The version qualifier may be implied.
Build->Clean Project
Android Studio를 통해 시도 하고 ./gradlew installRelease
다시 실행 했습니다. 그것도 작동하지 않았습니다.
또한 build
폴더 삭제를 시도했지만 도움이되지 않습니다.
당신을 위해 몇 가지 팁을 제공하십시오.
"react": "16.7.0", "react-native": "0.57.8"로 업데이트
중복 파일 오류를 완벽하게 해결하는 사용자 정의 node_modules / react-native / react.gradle . currentBundleTask 의 생성 블록에 다음 코드를 추가합니다 ( doFirst 블록 이후 ).
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);
}
}
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-react-gradle-fix
파일 생성- 스크립트
android-release-gradle-fix.js
파일 생성 업데이트
package.json
파일 :"scripts": { "postinstall": "node ./android-release-gradle-fix.js" },
그게 다야! npm install
굉장해지기 위해 달려라 .
참고 :npm install
jenkins와 같은 ci에서 실행 하면 오류가 발생할 수 있습니다. postinstall: cannot run in wd %s %s (wd=%s) node
=> npm install --unsafe-perm
대신 사용하십시오.
가지고있을 수있는 파일을 제거하십시오.
android/app/src/main/res/drawable-mdpi/
android/app/src/main/res/drawable-xhdpi/
android/app/src/main/res/drawable-xxhdpi/
빌드를 다시 실행하면 문제가 해결되었습니다.
글을 쓰는 시점에서 React Native의 최신 버전 (> 0.57.0)은 changelog에 표시된대로 Gradle 래퍼 수준을 4.4로, Gradle 플러그인을 3.1.4로 높였습니다 . 이는 Gradle 빌드 프로세스 가 이전과 다른 디렉토리에 현재 필요한 AAPT 결과를 저장하도록 만드는 효과가 있습니다.
의 측면에서 냔 카오 의 멋진 해결 방법 은 이전 디렉토리가 아닌 응용 프로그램의에서 지적 보인다 있기 때문에, 우리는 중복 된 자원 충돌을 방지하기 위해 약간 수정해야 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의 솔루션을 다음과 같이 업데이트 할 수 있습니다 ( in currentBundleTask
선언 후에 포함해야합니다 .doFirst
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()
}
앱이 /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()
}
react-native bundle
이전에 실행하지 마십시오 ./gradlew assembleRelease
.
나 자신을 위해 나는 달리기 react-native bundle
전에 달리고 있었다 ./gradlew assembleRelease
.
내 자산 중 하나에 유사한 중복 오류 메시지가 표시되었습니다.
상기 찾고 ./gradlew assembleRelease
출력, 나는 (덕분 자체로 JS 번들을 빌드를 말할 수있는 apply from: "../node_modules/react-native/react.gradle"
당신에 build.gradle
그것을 수동으로 실행하는 데 필요한이 없었다 파일) react-native bundle
손 전.
If I simply did not run react-native bundle
before running ./gradlew assembleRelease
everything worked great.
I tested the Release APK and the JS bundle loads fine, including all images.
My only concern is whether the source maps --sourcemap-output
(for Bugsnag) will be created. If not, I'm sure there's a way to have ./gradlew assembleRelease
generate those as well. I just have not tested it yet.
In order to get my build working for React Native 0.57.5, I used Mapsy's answer with a minor enhancement. I needed to be able to build for multiple flavors and generally I try to avoid hardcoding things. When looking through my react.gradle
file, I found it had the following variable defined:
def resourcesDir = file("$buildDir/generated/res/react/${targetPath}")
So instead of hardcoding the build type/flavor in the path like this:
File originalDir = file("$buildDir/generated/res/react/release/drawable-${resSuffix}");
I instead used the resourcesDir
variable to set the originalDir
path like this:
File originalDir = file("${resourcesDir}/drawable-${resSuffix}");
As a result, my doLast
looks like this:
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);
}
}
moveFunc.curry("ldpi").call()
moveFunc.curry("mdpi").call()
moveFunc.curry("hdpi").call()
moveFunc.curry("xhdpi").call()
moveFunc.curry("xxhdpi").call()
moveFunc.curry("xxxhdpi").call()
}
For me it work to remove the folder: android/build
and run ./gradlew assembleRelease
again.
A way to remove the error would be to:
- put your images in the android/app/src/main/res/drawable folder (create a “drawable” folder if one doesn’t exist)
- delete all the drawable folders that have suffixes (i.e. drawable-hdpi, drawable-mdpi, etc)
- don’t bundle assets (i.e. don’t run: react-native bundle …)
- run Gradle’s assembleRelease
However, this is not an ideal solution because each image will only have one resolution for all device sizes. For images that are too big for a device it leaves downscaling to the device and leads to download size and speed issues, and for images too small for a device it leads to diminished image quality.
One convenient solution I’ve found is to use an Android Studio plugin called Android Drawable Importer. To use it after it is installed:
- open your project in Android studio and navigate to: android/app/src/main/res/drawable
- right click on the folder and choose: New > Batch Drawable Import
- select and configure image assets to import
The plugin will handle the generation of the drawable folders and correct image sizes. Once you’ve imported your image, you should be able to run Gradle’s assembleRelease without the duplicate resources error.
What worked for me was simply adding this extra command in package.json
, and use that for building:
"android-build-release": "cd ./android && rm -rf app/src/main/res/drawable* && ./gradlew app:assembleRelease",
ReferenceURL : https://stackoverflow.com/questions/47084810/react-native-android-duplicate-file-error-when-generating-apk
'development' 카테고리의 다른 글
Swift UIView 배경색 불투명도 (0) | 2020.12.31 |
---|---|
PKCS12 내보내기 중에 OpenSSL이 " '화면'을 임의 상태로로드 중"과 함께 중단됨 (0) | 2020.12.31 |
Android 자동 가로 스크롤 TextView (0) | 2020.12.31 |
모델을 만들려고 할 때 'rails generate'명령이 중단됨 (0) | 2020.12.31 |
Git 현재 분기 및 색상이있는 PS1 라인 (0) | 2020.12.31 |