React Native Error: Failed to parse APK file
React Native 프로젝트를 빌드하여 테스트하려 할 때 다음 에러가 나타나면서 빌드에 실패하는 경우가 있습니다.
* 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 BUILD FAILED in 1m 40s error Failed to install the app. Make sure you have the Android development environment set up: https://reactnative.dev/docs/environment-setup. Error: Command failed: gradlew.bat app:installDebug -PreactNativeDevServerPort=8081 Note: C:\project\my-project\android\app\src\debug\java\com\myproject\ReactNativeFlipper.java uses or overrides a deprecated API. Note: Recompile with -Xlint:deprecation for details. Unable to install C:\project\my-project\android\app\build\outputs\apk\debug\app-debug.apk com.android.ddmlib.InstallException: Unknown failure: Exception occurred while executing 'install': java.lang.IllegalArgumentException: Error: Failed to parse APK file: /data/local/tmp/app-debug.apk: Failed to parse /data/local/tmp/app-debug.apk at com.android.server.pm.PackageManagerShellCommand.setParamsSize(PackageManagerShellCommand.java:581) at com.android.server.pm.PackageManagerShellCommand.doRunInstall(PackageManagerShellCommand.java:1337) at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:1303) at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:193) at com.android.modules.utils.BasicShellCommandHandler.exec(BasicShellCommandHandler.java:97) at android.os.ShellCommand.exec(ShellCommand.java:38) at com.android.server.pm.PackageManagerService.onShellCommand(PackageManager Service.java:24612) at android.os.Binder.shellCommand(Binder.java:950) at android.os.Binder.onTransact(Binder.java:834) at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4818) at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:8506) at android.os.Binder.execTransactInternal(Binder.java:1184) at android.os.Binder.execTransact(Binder.java:1143) Caused by: java.io.FileNotFoundException: AndroidManifest.xml at android.content.res.ApkAssets.nativeOpenXml(Native Method) at android.content.res.ApkAssets.openXml(ApkAssets.java:379) at android.content.pm.parsing.ApkLiteParseUtils.parseApkLiteInner(ApkLiteParseUtils.java:302) at android.content.pm.parsing.ApkLiteParseUtils.parseApkLite(ApkLiteParseUtils.java:283) at com.android.server.pm.PackageManagerShellCommand.setParamsSize(PackageManagerShellCommand.java:575) ... 12 more {{중략}} FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:installDebug'. > java.util.concurrent.ExecutionException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Unknown failure: Exception occurred while executing 'install': java.lang.IllegalArgumentException: Error: Failed to parse APK file: /data/local/tmp/app-debug.apk: Failed to parse /data/local/tmp/app-debug.apk at com.android.server.pm.PackageManagerShellCommand.setParamsSize(PackageManagerShellCommand.java:581) at com.android.server.pm.PackageManagerShellCommand.doRunInstall(PackageManagerShellCommand.java:1337) at com.android.server.pm.PackageManagerShellCommand.runInstall(PackageManagerShellCommand.java:1303) at com.android.server.pm.PackageManagerShellCommand.onCommand(PackageManagerShellCommand.java:193) at android.os.Binder.shellCommand(Binder.java:950) at android.os.Binder.onTransact(Binder.java:834) at android.content.pm.IPackageManager$Stub.onTransact(IPackageManager.java:4818) at com.android.server.pm.PackageManagerService.onTransact(PackageManagerService.java:8506) at android.os.Binder.execTransactInternal(Binder.java:1184) at android.os.Binder.execTransact(Binder.java:1143) Caused by: java.io.FileNotFoundException: AndroidManifest.xml at android.content.res.ApkAssets.nativeOpenXml(Native Method) at android.content.res.ApkAssets.openXml(ApkAssets.java:379) at android.content.pm.parsing.ApkLiteParseUtils.parseApkLiteInner(ApkLiteParseUtils.java:302) at android.content.pm.parsing.ApkLiteParseUtils.parseApkLite(ApkLiteParseUtils.java:283) at com.android.server.pm.PackageManagerShellCommand.setParamsSize(PackageManagerShellCommand.java:575) ... 12 more
내용이 상당히 긴 것을 확인할 수 있는데 여기서 하단부의 ‘What went wrong’ 부분을 보시면 주요 원인을 파악할 수 있습니다. 여기서는 아래 메시지가 주요 원인이 되겠습니다.
Execution failed for task ':app:installDebug'. > java.util.concurrent.ExecutionException: com.android.builder.testing.api.DeviceException: com.android.ddmlib.InstallException: Unknown failure: Exception occurred while executing 'install': java.lang.IllegalArgumentException: Error: Failed to parse APK file:
대략 디버깅용 APK 파일을 설치하는 도중 데이터 파싱 에러가 발생하여 설치에 실패했다는 내용인데, 이에 대한 주요 해결책은 다음과 같습니다.
해결 방법
먼저 이 과정을 하기 전, React Native를 위한 개발 환경 설정이 모두 완료되었는지 확인해주셔야 합니다.
React Native의 개발 환경 설정은 아래 문서에서 확인해보실 수 있습니다.
https://reactnative.dev/docs/environment-setup
간혹 SDK 버전이 문서와 다른 버전이 설치되어 있을 수 있는데, 문서에 나와있는 SDK 버전과 AVD의 API 버전을 문서와 동일하게 설정하는 것을 권장합니다.
위 설정을 모두 마치셨다면 이제 미리 빌드된 APK파일을 깨끗이 삭제해주어야 합니다. 디버그와 릴리스용 APK 중 현재 발생한 환경에 맞는 APK파일을 삭제해주면 됩니다.
일반적으로는 다음 경로에 위치합니다:
{프로젝트 폴더}/app/build/outputs/apk/release {프로젝트 폴더}/app/build/outputs/apk/debug
위 경로의 파일을 모두 삭제한 뒤 현재 편집중인 에디터(IDE), 콘솔, 가상 기기(AVD)를 모두 다시 시작합니다.
이제 다시 빌드를 시도하면 대부분 문제가 해결 될 것입니다.