안드로이드 아키텍처 관련 에러

1 분 소요

안드로이드 에러 INSTALL_FAILED_NO_MATCHING_

Installation did not succeed. The application could not be installed: INSTALL_FAILED_NO_MATCHING_ABIS Installation failed due to: ‘null’

에러 (1)

ERROR: Conflicting configuration : ‘armeabi’ in ndk abiFilters cannot be present when splits abi filters are set : x86,armeabi-v7a Affected Modules: app

https://stackoverflow.com/questions/24572052/install-failed-no-matching-abis-when-install-apk

에러 (2)

device supports x86 but apk only supports armeabi-v7a


에러를 해결하기 위한 사전 지식

CPU 아키텍쳐

x86, AMD64, ARM, RISC-V, POWER, PowerPC, MIPS등이 있다. Arm이 일반 대중에게 널리 알려진 계기는 대체로 2010년 이후로, 스마트폰이 대세가 되면서 스마트폰에서 CPU 역할을 하는 AP(Application Processor)가 확산되면서부터 급격히 커지기 시작했다.

https://namu.wiki/w/ARM(CPU)

ndk 란??

Android NDK(Native Development Kit): Android에서 C 및 C++ 코드를 사용할 수 있도록 지원하고 네이티브 활동을 관리하며 물리적 기기 구성요소(예: 센서 및 터치 입력)에 액세스할 수 있는 플랫폼 라이브러리를 제공하는 도구 모음입니다.

https://developer.android.com/studio/projects/add-native-code?hl=ko

64비트 아키텍처 시작

2019년 8월 1일부터 Google Play에 게시되는 앱에서는 64비트 아키텍처를 지원해야 합니다. 64비트 CPU는 사용자에게 더 빠르고 풍부한 환경을 제공합니다. 앱의 64비트 버전을 추가하면 성능이 향상되고 향후 혁신을 이룰 가능성이 높아지며 64비트 전용 하드웨어가 장착된 기기에 대응할 수 있습니다. 이 가이드에서는 32비트 앱에서 64비트 기기를 지원할 준비가 되었는지 확인하기 위해 현재 취할 수 있는 단계를 설명합니다.

앱에 64비트 라이브러리가 포함되어 있는지 확인

ARM 아키텍처의 경우 32비트 라이브러리는 armeabi-v7a에 있으며 이때 64비트에 해당하는 라이브러리는 arm64-v8a입니다. x86 아키텍처의 경우 32비트용 x86과 64비트용 x86_64를 찾아보세요.

가장 먼저 해야 할 일은 이러한 두 폴더에 네이티브 라이브러리가 있는지 확인하는 것입니다. 요약하면 다음과 같습니다.

플랫폼 32비트 라이브러리 폴더 64비트 라이브러리 폴더
ARM lib/armeabi-v7a lib/arm64-v8a
x86 lib/x86 lib/x86_64

참고 : https://developer.android.com/distribute/best-practices/develop/64-bit

ABI

안드로이드 디바이스는 제조사의 사정에 따라서 입맛대로 CPU를 골라 쓸 수 있다. 이쪽에서 가장 대표적인 ARM을 비롯하여 MIPS, x86을 지원한다. 이들이 사용하는 명령 세트는 모두 다르며, 각 아키텍쳐 – 명령세트의 조합은 자신들에게 맞는 ABI(Application Binary Interface)를 갖는다. ABI란, 런타임에 시스템과 앱의 머신코드가 어떻게 상호작용할지를 기술한 인터페이스이다.

참고 : https://blog.yatopark.net/2016/03/12/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C%EC%9D%98-abi-%EA%B4%80%EB%A6%AC/


에러 분석

에러의 원인?

export한 project의 native library가 x86(에뮬레이터)용만 포함하고 있는 것 같습니다. 그래서 arm계열(스마트폰)을 지원 못하는 상황으로 보이네요.

http://www.masterqna.com/android/83764/%EB%9F%B0-%EA%B4%80%EB%A0%A8%EC%A7%88%EB%AC%B8-%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4

해결

export한 project가 native build source를 포함하고 있으면 가능합니다. ndk { abiFilters }에 arm abi를 추가하거나 미리 정의되어 있는 build variant가 있는지 확인해 보세요.

https://stackoverflow.com/questions/41775988/what-is-the-reason-for-the-error-device-supports-x86-but-apk-only-supports-arm?rq=1

build.gradle에서 ndk로 armeabi 부분이 보인다.

ndk {
    abiFilters "armeabi"
}

댓글남기기