TANGLE

[번역] 인텔 아키텍처에서 C++ 안드로이드 앱 빠르게 만들기


원문: https://www.linkedin.com/pulse/boost-c-android-apps-nexus-player-other-intel-cottier-jean-claude





나는 비디오 게임 산업 전문가 진 클로드 코티어(Jean-Claude Cottier)이다. 이 분야에서 18년 동안 일해왔고, 2008년에는 1인 게임 스튜디오 오보게임(Ovogame)을 설립했다. 내가 만든 게임들은 안드로이드(http://bit.ly/1i8aA1D)에서 플레이할 수 있다. 게임들은 인텔 아키텍처에 최적화하는 작업을 거쳤는데, 이 작업은 생각보다 아주 쉽다. 문제에 대해 간단하게 살펴보고 해결하는 방법을 알아보자.


안드로이드에서 구동하고자 하는 C++ 코드는 NDK에 의해, 자바 프로젝트로 통합될 수 있는 라이브러리로 컴파일된다. (JNI 인터페이스에 감사하자.) 내 엔진의 경우 자바 코드로 최소한의 뼈대(대부분 시스템과의 통신)를 구축해는다. 이 자바 코드는 절대 변경시키지 않는다. 지금은 자바 없이 오직 C++로 안드로이드 앱을 만들어낼 수는 있지만 나는 추천하지 않는다. 그리되면 써드파티 자바 API(광고 등)를 사용할 수 없기 때문이다.


요즘은 안드로이드 기기들의 CPU가 서로 다를 수 있다. 이는 자바에겐 문제가 되지 않는다. 자바는 인터프리터 언어이기 때문이다. 하지만 C++로 개발한다면 특정 아키텍처에 맞게 컴파일을 해야 한다. 안드로이드 기기에서 주를 차지하는 것은 ARM칩이다. 나는 대부분 C++ 개발자처럼 ARM 아키텍처(armv5, armv7)에만 타겟을 두어 개발했다. armv5를 사용하는 오래된 안드로이드 기기, armv7을 사용하는 신형 기기에 각각 대응하도록 NDK로 컴파일한다. 사용자가 앱을 실행하면 APK에 포함된 두 가지 버전 중 적절한 코드를 시스템이 자동으로 판별한다. 그러나 x86 아키텍처를 가진 기기는 ARM 코드를 실행시킬 수 없다. 다른 아키텍처이기 때문이다. 사실 이런 기기들은 이진 번역기(houdini)로 ARM코드를 번역(interpret)해서 실행시킨다. x86 기기가 번역된 ARM 코드를 원활히 잘 돌려내긴 하지만 x86의 최대 가용성에는 못미치는 것도 사실이다. x86에 적합하게 컴파일하면 그 기기에서는 더 빨리 돌아가고, 배터리도 절약될 것이다. 그렇게 하려면 컴파일 타켓에 x86을 추가하면 된다. 안드로이드 프로젝트에서 jni/Application.mk 파일을 열고 APP_ABI 변수를 수정해보자. (APP_ABI 변수는 타겟들을 정의한다.) 내가 이전에 했던 것처럼 armv5와 armv7만 지원하도록 설정했다면, 다음과 같다.


APP_ABI := armeabi armeabi-v7a


인텔 아키텍처를 지원하려면 x86을 뒤에 써주면 된다.


APP_ABI := armeabi armeabi-v7a x86


이제 앱을 컴파일할 때마다 x86 아키텍처와 호환되는 라이브러리가 부가적으로 APK 파일에 추가될 것이다. 이제 인텔 기반 기기에 이 앱을 설치하면 이제 적합한 x86용 코드가 실행된다. 내 게임은 이런 식으로 모두 x86 기기에 최적화시켰다. 나처럼 NDK를 이용해 C++ 앱을 개발하고 있다면 x86 아키텍처에도 맞춰줄 필요가 있는데, 그런 면에서 개이득!


개인적으로 나는 표준 C++만을 사용하고 있어서 새로이 x86을 지원했을 때 기술적으로 아무 문제도 나타나지 않았다. 사실 나는 하루만에 모든 게임을 다시 컴파일하고 갱신했다.


x86을 지원하면 APK파일은 다소 용량이 많아진다. 구글 플레이 50MB 제한에 간당간당하다면 당황할 수도 있겠다.


ARM용으로만 컴파일된 써드파티 API를 사용하고 있었다면 이제는 더이상 사용할 수 없다. 그래서 나는 소스코드가 제공되는 외부 라이브러리만 사용하려고 노력한다. 이게 더 크로스플랫폼에 유리하다.


makefile에서 x86에 의존적인 무언가를 변경해야 한다면 Android.mk 파일에 조건을 추가할 수 있다:



ifeq ($(TARGET_ARCH_ABI), x86)


'이 코드는 x86용으로 컴파일될 때만 접근가능.'


endif



안드로이드 앱을 x86용으로 포팅하는 데 더 깊은 지식이 필요하다면 인텔 웹사이트를 방문해보라: http://intel.ly/1jnDfAd


나처럼 NDK를 이용하는 개발자들에게 대부분(자기가 만든 엔진을 쓰든 Cocos2D를 쓰든)의 경우 인텔 기반 기기 지원은 APP_ABI 변수에 x86이라는 단어 하나 추가하는 걸로 충분하다고 본다. 이거 하는 데 몇 분 안걸릴 거란 건 누구나 동의할 것이다. 꼭 해보라.