본문 바로가기

소프트웨어/안드로이드

NDK java.lang.UnsatisfiedLinkError minSdkVersion 22 문제

 Native Library를 포함한 Third party 라이브러리를 사용한 프로젝트를 진행하고 있었고 알파 버전으로 플레이스토어에 올리는 작업 단계였습니다.

 

 

 

 제가 사용하던 핸드폰은 갤럭시 S10e인데 얼마 전 Android-12(SDK 31)로 업데이트를 해두었죠. 불행중 다행으로 이 업데이트로 해당 이슈를 인지할 수 있었습니다. 업데이트 후 며칠정도 시간이 지난 후 알파 버전이 제대로 돌아가는지 문득 떠올라 구동을 해봤고 아주 시원하게 앱이 크래시가 났습니다.

 

 

 

 우선 특정 버전에서 문제가 되는 것인지 하여 갤럭시 노트5, Android-9(SDK 29)에서 동일한 버전으로 테스트하였고 여기서는 정상적으로 동작을 하였습니다. Android 12가 문제일 것이라 생각하였으나 해당 라이브러리의 샘플 프로젝트는 Android-12에서 또 정상적으로 돌아가는 것이었죠. 뭔가 갈피가 안잡혔습니다.

 

 

 

 

삽질 🪓

 

일단 이유를 좀 알기 위해 여러가지 테스트(라고 쓰고 삽질)를 진행하였습니다.

  • 기본적인 요소만 있는 프로젝트를 생성하고 해당 라이브러리를 참조 ➡ 크래시 발생!
  • NDK target 문제인가? 서드 파티 라이브러리 문서 참조하여 gradle 추가 세팅 ➡ 크래시 발생!
  • Android gradle plugin의 문제인가? 하여 샘플 프로젝트와 동일하게 세팅 ➡ 크래시 발생!
  • gradle.property의 문제인가? 하여 샘플 프로젝트와 동일하게 세팅 ➡ 크래시 발생!
  • compile SDK revision의 문제인가? 하여 샘플 프로젝트와 동일하게 세팅 ➡ 크래시 발생!
  • 범인은 kotlin?? Java로 프로젝트 변경 ➡ 어림도 없지, 크래시 발생!

 

 

 

 

 위와 같은 🐶삽질 끝에 minSdkVersion을 빼먹었다는 것을 깨닫고 19로 내려주었더니 이 때에는 큰 문제가 발생하지 않았습니다.

 

 

 

 

 

 이 녀석이 문제였구나.. 하고 minSdkVersion을 20, 21, 22.. 올리다 보니 22버전 부터 크래시가 발생하는 것을 발견했습니다. 그러나, minSdkVersion을 낮춰서 해결 끝~ 하면 참 좋겠지만 CameraX를 사용하고 있던지라 minSdkVersion21로 세팅할 수는 없었던 차에 얼마 전 저와 같은 문제를 겪은 귀하신 외국인 분이 아주 명쾌한 해답을 자문자답식으로 남겨두었습니다. (아래 출처 참조) 

 

 

 

 


 

Android Menifest

 

AndroidMenifest의 <application> 태그 attribute에 android:extractNativeLibs="true"를 추가해 주는 것이었습니다.

<application
    ...
	android:extractNativeLibs="true">

 

안드로이드 공식 문서를 보면 이 attribute의 default 값이 true라고..는 하는데 정확하게는 무슨 이유인지는 모르겠지만 명시적으로 해주지 않으면 true로 동작하지 않는 듯 하였습니다.

 

 

 

 

 


 

 

 

 

Gradle

 

 첫번째 해결법은 debug에서는 훌륭하게 동작하나 실제 배포시 생성된 aar에서는 AndroidMenifest에서 설정한 값이 반영되지 않고 패키징이 되는 문제가 있었습니다.

 

 이 경우에는 gradle에서 변경을 해주어야하며 아래 링크를 참조하면 상황에 맞도록 해결할 수 있을것입니다. 이후 버전에서는 다른 해결방법이 있을 수 있어서 링크로 대체합니다~ 

 

 

https://developer.android.com/studio/releases/gradle-plugin?hl=ko&buildsystem=cmake#behavior-changes 

 

Android Gradle 플러그인 출시 노트  |  Android 개발자  |  Android Developers

Android 스튜디오 빌드 시스템은 Gradle을 기반으로 하며 Android Gradle 플러그인에는 Android 앱을 빌드하는 데 사용하는 몇 가지 추가 기능이 있습니다.

developer.android.com

 

 

 

 


 

Gradle DSL (2022-03-07)

공식 문서에 extractNativeLibs가 AGP 4.2.0부터 DSL 옵션으로 대체되었다고 합니다. useLegacyPackaging 옵션을 사용하라고 하네요. Android Gradle Plugin (AGP) 4.2.0이상을 사용하시는 분들은 다음 옵션으로 해결을 하면 되지 않을까 합니다~

 

AGP 4.2.0 변경 사항

 

 

useLegacyPackaging

 

 

 

 

 

 

 

그럼 이만 뿅~ 😅

 

 

 

출처