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를 분석한 결과입니다.
여기는 lib/armeabi-v7a
와 lib/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비트 앱을 유지하는 것이 불필요하다고 생각할 수 있습니다. 이런 정책에 대응하는 방법에 대해서 간단히 알아보았습니다.
참고
Related Posts
- Android 14 - 사진/동영상 파일, 일부 접근 권한 소개
- Android - adb push, pull로 파일 복사, 다운로드
- Android 14 - 암시적 인텐트 변경사항 및 문제 해결
- Jetpack Compose - Row와 Column
- Android 13, AOSP 오픈소스 다운로드 및 빌드
- Android 13 - 세분화된 미디어 파일 권한
- Android 13에서 Notification 권한 요청, 알림 띄우기
- Android 13에서 'Access blocked: ComponentInfo' 에러 해결
- 에러 해결: android gradle plugin requires java 11 to run. you are currently using java 1.8.
- 안드로이드 - 코루틴과 Retrofit으로 비동기 통신 예제
- 안드로이드 - 코루틴으로 URL 이미지 불러오기
- Android - 진동, Vibrator, VibrationEffect 예제
- Some problems were found with the configuration of task 에러 수정
- Query method parameters should either be a type that can be converted into a database column or a List
- 우분투에서 Android 12 오픈소스 다운로드 및 빌드
- Android - ViewModel을 생성하는 방법
- Android - Transformations.map(), switchMap() 차이점
- Android - Transformations.distinctUntilChanged() 소개
- Android - TabLayout 구현 방법 (+ ViewPager2)
- Android - 휴대폰 전화번호 가져오는 방법
- Android 12 - Splash Screens 알아보기
- Android 12 - Incremental Install (Play as you Download) 소개
- Android - adb 명령어로 bugreport 로그 파일 추출
- Android - adb 명령어로 App 데이터 삭제
- Android - adb 명령어로 앱 비활성화, 활성화
- Android - adb 명령어로 특정 패키지의 PID 찾기
- Android - adb 명령어로 퍼미션 Grant 또는 Revoke
- Android - adb 명령어로 apk 설치, 삭제
- Android - adb 명령어로 특정 패키지의 프로세스 종료
- Android - adb 명령어로 screen capture 저장
- Android - adb 명령어로 System 앱 삭제, 설치
- Android - adb 명령어로 settings value 확인, 변경
- Android 12 - IntentFilter의 exported 명시적 선언
- Android - adb 명령어로 공장초기화(Factory reset)
- Android - adb logcat 명령어로 로그 출력