IT_Programming/Android_NDK

[펌][안드로이드] 2019년 8월부터 구글 플레이에 올라가는 앱 64비트 대응하기 | Android 64비트 대응하기 - ARM , X86, MIPS

JJun ™ 2019. 2. 15. 15:09



 * 출처

 : https://duzi077.tistory.com/284

 : https://metalkin.tistory.com/81

 : https://justbobby.tistory.com/14


 * 참고 자료

 : https://developers-kr.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html

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




2019년 8월부터 구글 플레이에 올라가는 앱 64비트 대응하기


안드로이드는 2017년 롤리팝 때 부터 64비트 cpu를 지원했습니다. 그리고 이제 곧 다가올 2019년 8월 1일부터 구글 플레이에 앱을 새롭게 등록하거나 업데이트를 할 때 네이티브 코드를 사용하고 있다면 32, 64비트 so 파일들을 포함시켜야 합니다.   


앞으로 64비트 so 파일이 포함되지 않은 앱은 스토어에 등록되지 않는다는 것을 의미합니다. 이미 현재 기준 지금 사용하고 계신 스마트폰은 64비트가 대부분일 것입니다. 몇년전부터 64비트 지원으로 인해 대부분 4기가 이상 RAM을 탑재하고 있고 앞으로 더 많은 RAM을 탑재한 단말기가 나올 것 입니다.  그래서 구글에서 언젠간 CPU 성능이 낮은 32비트 단말기를 더이상 지원하지 않고 64비트만 사용하는 정책으로 바뀌게 될 것 같습니다. 64 비트를 지원한다는 것은 64 비트 단말기의 고급 컴퓨팅 기능을 활용해 인공 지능, 기계 학습과 같은 기술을 적용할 수 있다는 것이고 향후 64 비트 코드만 지원하는 생태계를 준비하는 것과 마찬가지기 때문입니다.


이러한 권고사항이 나왔으니 어떤 앱을 운영중 이거나, 새로운 앱을 등록하기 전에 몇가지를 확인해야 합니다.



첫번째,  

1. 네이티브 코드( so 파일)을 사용하지 않고, 자바와 코틀린으로만 개발된 앱은 이미 64비트를 지원하는 앱이므로 별다른 조치를 안해도 됩니다.

2. Unity 5.6이상을 사용하고 있던 기존의 게임 앱은 2021년 8월까지 32비트만 사용해도 문제가 없습니다.

3. 현재 64비트를 지원하지 않는 Wear OS, Android TV으로 생성된 프로젝트는 64비트를 지원할 필요가 없습니다.


두번째,  

자체적으로 C / C++ 네이티브 코드를 사용하거나,  써드 파티 so 파일을 사용하는 경우 아래의 파일들이 있는지 확인하면 됩니다. 

프로젝트의 jniLibs 폴더에 각 ABI 타입마다 폴더가 들어있습니다. 그 안에 32, 64비트 so 파일을 추가하고 APK를 만들어서 스토어에 등록/업데이트를 진행하면 됩니다.


Platform32-bit libraries folder64-bit libraries folder
ARMlib/armeabi-v7alib/arm64-v8a
x86lib/x86lib/x86_64



이미 스토어에 올라가있는 APK가 64비트를 포함하고 있는지 확인할 수 있습니다.





arm64-v8a or x86_64 이 없다면 추가해서 스토어에 업데이트를 해야 합니다.




NDK를 직접 사용하는 경우에는 64비트 so 파일을 만들 수 있게 환경을 구축해야 합니다.

저는 NDK_BUILD를 사용하므로 여기에 기준을 맞춰서 설명하겠습니다. ( CMake 쓰는 분은 검색..)


Application.mk 파일에 아래 코드를 작성해주고 빌드를 하면 끝입니다.

APP_ABI := armeabi-v7a arm64-v8a x86 x86_64



[참고]

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

https://android-developers.googleblog.com/2019/01/get-your-apps-ready-for-64-bit.html






안드로이드 단말 32비트인지 64비트인지 확인 방법
(How to know the android device is 32bit or 64bit)


ADB (Android Debug Bridge)

Terminal에서 다음 커맨드 수행.

adb shell getprop ro.product.cpu.abi
adb shell getprop ro.product.cpu.abi2

다음 결과의 x86에서 테스트 단말은 32비트 환경임을 확인할 수 있다.

ro.product.cpu.abi : x86
ro.product.cpu.abi2 : armeabi-v7a

참고로, Android Studio 1.0을 기본 설치하였다면, adb경로는
C:\Users\{사용자이름}\AppData\Local\Android\sdk\platform-tools

App (Using Code)

Build.CPU_ABIBuild.CPU_ABI2는 API level 21(5.0 Lollipop)에서 Deprecated.
5.0 Lollipop에서는 SUPPORTED_ABISSUPPORTED_32_BIT_ABISSUPPORTED_64_BIT_ABIS를 사용하는데 이전과 달리 Array String 으로 리턴된다.

import android.os.Build;
Log.i(TAG, "CPU_ABI : " + Build.CPU_ABI);
Log.i(TAG, "CPU_ABI2 : " + Build.CPU_ABI2);
Log.i(TAG, "OS.ARCH : " + System.getProperty("os.arch"));
Log.i(TAG, "SUPPORTED_ABIS : " + Arrays.toString(Build.SUPPORTED_ABIS));
Log.i(TAG, "SUPPORTED_32_BIT_ABIS : " + Arrays.toString(Build.SUPPORTED_32_BIT_ABIS));
Log.i(TAG, "SUPPORTED_64_BIT_ABIS : " + Arrays.toString(Build.SUPPORTED_64_BIT_ABIS));





Android 64비트 대응하기 - ARM , X86, MIPS



안드로이드를 64비트를 대응을 해야한다는 소식을 보면서 어떻게 대응을 하여야하는 것인지를 찾아보던 중 64비트를 지원해줘야하는 cpu에는 ARM, X86, MIPS 3가지가 있었고 이것들 차이는 무엇일까... 찾아보게 되었다.

이것들은 무엇이고 내가 지원하는 기기들은 무엇일지...

 

처음에는 X86에 대해서는 Intel cpu라 하여 윈도우 폰들이다. 그래서 지원을 할 필요가 없는건가? 라는 생각도 하였다. 그래도 앱을 서비스하는데 리스크를 안고서 이건 지원안해 라고 할 수 없어서.. 조심스럽게 여러 블로그들을 찾아보게 되었다.

 

우선 안드로이드 디바이스는 제소사의 사정에 따라서 원하는 CPU를 골라 쓸수 있다. 가장 대표적인 ARM을 비롯하여 X86, MIPS를 지원한다.

 

1990년 초부터 X86/MIPS 등과 같은 고성능을 지향했던 업체들과 다르게 일찌감치 저전력/고효율을 목표 한 기술 시장에 뛰어들어 현재 ARM사의 CPU가 저전력 고효율의 대명사가 되어 2010년 이후로는 임베디드 시장과 모바일 시장의 주류가 되었다.

 

ARM 32비트  - 아이폰3, 아이폰4 , 아이폰5, 갤럭시4,등등 

ARM 64비트 - 아이폰5, 아이폰6, 갤럭시S6, 갤럭시S7 등등

 

아이폰과 갤럭시 시리즈 모두 ARM 칩셋을 사용하고 있는걸 보면 ARM이 모바일시장을 장악하고 있는걸 알 수 있다. 많이들 듣고있는 엑시노스, 스냅드래곤 모두 ARM기반의 CPU이다.

 

ARM이 대부분의 시장을 장악하고있지만 X86, MIPS 역시 지속적으로 X86, MIPS의 CPU를 탑재한 스마트폰이 나오고 있어 이들 폰들 역시 지원해주어야 할 것이다.

 

 

 

 

Android 플랫폼 ABI 지원

 

안드로이드 시스템은 런타임에 어떤 ABI를 지원하는지 알게된다.

 

1순위. 사용기기에 대한 Primary ABI

2순위. 다른 ABI에 해당되는 Secondary ABI

 

시스템이 설치 시 패키지로부터 최상의 기계어 코드를 추출하도록 한다.

 

최상의 성능을 위해서는 Primary ABI에 대해 직접 컴파일해야한다. 예를들어 전형적인 ARMv5TE 기반의 기기는 Primary ABI인 armeabi만 정의한다. 반면에 전형적인 ARMv7 기반의 기기는 Primary ABI를 armeabi-v7a로, Secondary ABI를 armeabi로 정의한다. 이들 각각에 대해 생성되는 애플리케이션 네이티브 바이너리를 실행할 수 있기 때문이다.

 

64비트 기기는 32비트 버전도 지원한다. arm64-v8a기기를 예로 들면, 이 기기는 armeabi와 armeabi-v7a 코드도 실행할 수 있다. 다만 앱이 arm64-v8a를 대상으로 하는 경우  32비트의 기기보다 64비트 기기에서 더욱 잘 수행된다.

 

많은 X86 기반 기기는 armeabi-v7a 및 armeabi NDK 바이너리도 실행할 수 있습니다. 이런 기기의 경우 Primary ABI가 X86, Secondary ABI는 armeabi-v7a가 된다.

 

 

 

 

설치 시 네이티브 코드의 자동 압축 풀기

 

앱 설치시, 패키지 매니저 서비스는 APK를 스캔하여, shared lib를 찾는다 처음에는 primary ABI를 대입하여 찾는다.

lib/<primary-abi>/lib<name>.so

그리고 primary ABI를 찾지못하면 secondary ABI를 대입해서 찾는다.

lib/<primary-abi>/lib<name>.so

위 양식의 라이브러리가 발견되면 패키지 관리자는 data디텍토리(data/data/<package_name>/lib/)에 있는 /lib/lib<name>.so로 복사한다. 공유객체가 파일이 하나도 없는 경우 애플리케이션이 빌드되고 설치되지만 런타임에 다운됩니다.

 

 

 

 

 

 

참고 

https://developer.android.com/ndk/guides/abis.html

 

ABI 관리  |  Android NDK  |  Android Developers

다양한 Android 핸드셋은 각기 다른 CPU를 사용하므로, 서로 다른 명령 집합을 지원합니다. CPU와 명령 집합의 조합별로 나름의 애플리케이션 바이너리 인터페이스(ABI)가 있습니다. ABI는 애플리케이션의 기계어 코드가 런타임에 시스템과 상호작용하는 방식을 매우 정밀하게 정의합니다. 여러분의 앱이 사용할 각 CPU 아키텍처에 대해 ABI를 지정해야 합니다. 전형적인 ABI는 다음과 같은 정보를 포함합니다. 기계어 코드가 사용해야 하는 CPU 명령

developer.android.com