HOME > android > tips

안드로이드 앱이 32/64bit 기기에서 동작하도록 만들기

By JS|05 Jul 2019

2019년 8월 1일부터 Google Play에 게시되는 앱에서는 64비트 아키텍처를 지원해야 합니다. 따라서, 현재 자신의 앱이 32비트 기기만 지원한다면 64비트도 지원되도록 해야 합니다. 사실 앱이 네이티브(c++, JNI가 컴파일된 so 파일) 라이브러리만 사용하지 않는다면 32/64비트 기기에서 모두 동작합니다. 왜냐하면 네이티브 라이브러리가 없다는 것은 순수하게 자바 코드로만 동작한다는 의미이고, 자바는 바이트코드가 가상머신에서 동작하기 때문에 32/64비트 기기에서 모두 동작할 수 있습니다.

앱에 32비트 네이티브 라이브러리만 있는 경우, 64비트 기기에서 동작할 수 있습니다. 문제는 구글이 이를 허용하지 않는 것입니다. 8월 1일부터 신규로 등록하거나 업데이트되는 앱은 꼭 64비트로 동작할 수 있게 만들어야 합니다.

따라서 간단히 정리하면 다음과 같습니다.

  • 네이티브 라이브러리를 사용하지 않으면 32/64비트에서 동작하기 때문에 고려할 필요가 없습니다
  • 네이티브 라이브러리를 사용한다면 32/64비트 라이브러리를 제공해야 합니다.

내 앱이 32/64비트를 지원하는지 확인하는 방법을 알려드리고, 64비트 기기에서 동작하려면 어떻게 해야 하는지 설명하겠습니다.

내 앱이 32/64 비트를 지원하는지 확인

Native Library를 사용하지 않으면 32/64비트 모두 지원합니다. 하지만 나도 모르게 사용하는 오픈소스 라이브러리가 네이티브 라이브러리를 포함할 수 있습니다. 내 프로젝트에 보이지 않기 때문에, 나도 모르게 네이티브 라이브러리가 없다고 착각할 수 있습니다. 이런 경우 Apk 파일에 네이티브 라이브러리가 있는지 확인해야 합니다.

안드로이드 스튜디오는 Analyze APK라는 기능을 제공합니다. 이것은 Apk에 포함된 파일을 분석하는 툴 입니다. 이 툴을 사용하면 Apk 안에 네이티브 라이브러리가 포함되었는지 확인할 수 있습니다.

메뉴에서 [Build] -> [Analyze APK]를 눌러 툴을 실행합니다. 그리고 분석할 Apk를 찾아서 OK버튼을 누릅니다. 그럼 오른쪽 창에 Apk의 내부 파일들이 보입니다. 네이티브 라이브러리는 /lib 폴더에 저장됩니다. 이 폴더가 없다면 32/64비트를 모두 지원하는 앱입니다. 또한, ARM, Intel, Mips 등 어떤 아키텍처에 의존적이지 않고 동작할 수 있습니다.

아래 그림은 Analyze APK로 apk를 분석한 결과입니다. analyze apk

여기는 lib/armeabi-v7alib/arm64-v8a가 모두 존재합니다. 이 앱은 ARM의 32/64비트를 모두 지원하는 앱입니다. 하지만 Intel의 X86이나 X86_64 기기에서는 동작하지 못합니다. Intel 기기에서 동작하게 하려면 X86과 X86_64 라이브러리를 제공해야 합니다.

만약 자신의 앱에 32비트 라이브러리만 있다면 64비트 라이브러리도 포함되도록 만들어야 합니다.

32/64비트를 지원하게 만들기

플레이스토어에 올리는 조건은 64비트를 지원하는 앱입니다. 안드로이드 디벨로퍼의 앱에서 64비트 기기를 지원하는지 확인를 보시면 모든 CPU를 지원할 필요는 없지만 특정 CPU에 32비트 라이브러리를 제공하면 64비트도 제공해야 한다고 되어있습니다. 32비트는 제공하지 않고 64비트만 제공해도 되는지는 해보지 않아서 잘 모르겠습니다. 하지만 32비트만 지원하는 기기가 있기 때문에 32비트 라이브러리도 제공하는 것이 좋습니다.

아래 표를 참고하시면 apk의 /lib 아래의 폴더 이름이 어떤 CPU의 32/64비트를 지원하는 라이브러리인지 알 수 있습니다.

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

만약 자신의 앱에 32비트 라이브러리만 있다면 64비트 라이브러리도 추가해야 합니다. 안드로이드 스튜디오에서 네이티브 라이브러리를 추가하는 방법은 안드로이드 스튜디오에서 so 라이브러리를 추가하는 방법을 참고하시면 됩니다.

디바이스가 어떤 아키텍처를 지원하는지 확인

디바이스가 32비트만 지원하는지 64비트도 지원하는지 어떻게 알 수 있을까요? 디바이스의 특정 프로퍼티를 확인하면 이것을 알 수 있습니다. ro.product.cpu.abi 프로퍼티는 디바이스의 아키텍처가 적혀있습니다. adb shell getprop ro.product.cpu.abi 명령어로 어떤 값이 적혀있는지 알 수 있습니다.

예를 들어, 프로퍼티가 다음처럼 설정되어있다면 의미는 다음과 같습니다.

  • ro.product.cpu.abi = armeabi-v7a => ARM 32비트
  • ro.product.cpu.abi = arm64-v8a => ARM 64비트
  • ro.product.cpu.abi = x86 => Intel 32비트
  • ro.product.cpu.abi = x86_64 => Intel 64비트

하지만 ARM 64비트의 경우 ARM 32도 함께 지원하는 경우도 있습니다. 이럴 때는 ro.product.cpu.abilist 프로퍼티를 확인하면 지원하는 모든 아키텍처를 알 수 있습니다.

아래는 삼성 갤럭시 S10에서 확인한 내용입니다. S10은 다음과 같은 아키텍처를 모두 지원합니다. S10에서는 32/64비트 앱 모두 동작할 수 있습니다.

$ adb shell getprop ro.product.cpu.abilist
arm64-v8a,armeabi-v7a,armeabi

정리

최근 구글 플레이스토어는 64비트를 지원하는 앱만 등록되도록 정책을 변경하였습니다. 앱 개발팀들이 32와 64비트를 모두 지원하는 것이 부담스럽기 때문에 64비트 정책을 고수하는 것 같습니다. 또한 현재 분위기가 대부분 64비트를 지원하기 때문에 32비트 앱을 유지하는 것이 불필요하다고 생각할 수 있습니다. 이런 정책에 대응하는 방법에 대해서 간단히 알아보았습니다.

참고