ANE 살펴보기

연재순서

  1. ANE 살펴보기
  2. iOS용 ANE 라이브러리 만들기
  3. Android용 ANE 라이브러리 만들기
  4. 연결 SWC 만들기
  5. ANE 빌드와 테스트 하기

ANE 란 AIR Native Extensions 의 약자로 이름 그대로 AIR 에서 네이티브 코드를 사용 할 수 있게 해주는 AIR 확장 툴입니다. 저는 앞으로 5회에 걸쳐 ANE 에 대해서 알아보고 어떻게 만들고 사용 할 수 있는지 알아 보려고 합니다. 오늘은 그 첫시간으로 ANE 에 대해서 간략 하게 알아 보도록 하겠습니다.

ANE 란?

ANE는 Adobe AIR 와 운영체제의 네이티브 라이브러리를 서로 연결 해 주는 연결점(context) 라고 생각하시면 이해하기 편합니다.주로 AIR가 네이티브 라이브러리의 함수를 호출하고 데이터를 주고 받는 형태로 이루어져 있습니다. 흔히들 AIR3.0 에서 모바일을 지원하며 대대적으로 알려졌지만 실제로는 AIR2.5 for TV에서 처음 등장하였습니다.

ANE는 다음의 두 가지 방법 중 하나로 작동 할 수 있습니다.
애플리케이션 번들링 애플리케이션 번들링이 앞으로 저희가 주로 알아볼 방식으로 제작된 AIR 애플리케이션에 네이티브코드가 포함되어 실행되는 방식을 말합니다. ANE에 따라서 멀티플렛폼을 지원하도록 만들 수도 있고 경우에 따라서는 네이티브코드를 지원하지 않는 경우를 위해 액션스크립트만 포함 할 수도 있습니다.

디바이스 번들링 디바이스 번들링은 네이티브 코드가 디바이스에 포함되는 경우로 AIR2.5 for TV 의 ANE가 대표적입니다. 주로 네이티브코드를 TV제작업체에서 제공합니다.

아래의 표는 애플리케이션 번들링과 디바이스 번들링이 지원하는 디바이스를 보여 줍니다.

ANE 로 할 수 있는 것들

특화된 기능

ANE 는 시스템에 특화된 기능들을 사용 할 수 있게 해줍니다. 예를 들어 핸드폰에 있는 진동이라던가 안드로이드의 알람과 같이 기본 AIR API에 없는 기능을 사용 할 수 있습니다. 이러한 시스템 특화된 기능을 Adobe 에서 지원해 주기를 기대하는 것은 어렵습니다. Adobe는 당연하겠지만 범용으로 사용 할 수 있는 API  업데이트에 중점을 두고 있으니까요. 그래서 ANE라는 중간역활을 두어 개발자들에게 필요한 것들을 개발 할 수 있는 문을 열어 주었습니다. 어떻게 보면 인터넷 생태계가 급속도록 모바일로 이동하면서 Adobe가 내놓은 궁여지책 일 수도 있습니다. 하지만 실제로 ANE가 AIR2.5 for TV  부터 지원했다는 사실을 보면 내부적으로 이러한 상황을 염두하고 있었던 것 같습니다.

좀더 현실적으로 보면 이로서 시스템의 자원을 AIR에서 바로 사용할 수 있게 된것입니다. 예를 들어 기존에는 특정 드라이버를 이용해야 하는 경우 AIR에서 직접 접근 할 방법이 없으므로 중간에 프록시서버등을 통해서 소켓으로 통신하곤 하였습니다. 하지만 이제 더 이상 그럴 필요 없이 ANE 를 통해 바로 연결 할 수 있습니다.

키넥트에 연결하기 위해 더 이상 소켓서버가 필요없다.

훌륭한 코드들

전통적인 C, C++ 그리고 Java와 같은 언어를 사용 할 수 있게 됨으로서 기존의 검증된 훌륭한 코드들을 빠르고 쉽게 사용 할 수 있습니다. ANE를 통해 이러한 코드를 랩핑하여 앞으로 ActionScript 통해 만들 어플리케이션에서도 이러한 코드를 사용 할 수 있게 되었습니다.

성능

ANE 는 가장 높은 수준의 최적화를 구현 할 수 있습니다. ANE를 사용함으로서 기대 할 수 있는 성능 향상은 첫째 컴파일된 C 코드를 통한 최고의 퍼포먼스, 두번째로 병렬 알고리즘으로 큰 효과를 볼 수 있는 멀티코어의 사용, 마지막으로 GPU 가속을 통한 성능 향상을 기대 할 수 있습니다. 제가 만든 앱을 통해서 테스트 해 본 결과 암호화와 같은 특정상황에서는 엄청난 성능의 차이를 체감 할 수 있었습니다.

ANE 단점

시스템 종속성

ANE의 시스템에 특화된 기능을 사용 할 수 있는 특징은 결국 시스템에 종속적으로 만들어 버립니다. ANE를 도입하는 순간 플래시의 큰장점인 원소스 멀티플렛폼을 포기해야 하는 상황이 발생합니다. 물론 ANE를 도입해야 하는 시점에서 이미 어느정도 멀티플랫폼을 포기해야 할 컨테츠라는 점이 조금은 다행이긴 합니다만 예를 들어 무료컨텐츠에 광고 솔루션을 붙힌 어플리케이션의 경우 보통 ANE로 작성된 광고 솔루션을 사용하게 되는데 AdMob을 붙힌 어플리케이션은  iOS에 사용 할 수 없게되는 상황이 발생 하게 된다는 점입니다. 심지어 iOS용으로 만든 라이브러리의 경우 ARM용으로 빌드한 것은 x86으로 돌아가는 아이폰 시뮬레이션에서는 작동 하지 않습니다.

불편한 디버그

뒤에 좀 더 자세히 알아보겠지만 ANE 가 최종적으로 실행 되는 모습을 보기 위해서는 다음의 세 레이어층이 필요합니다. 1.네이티브 코드 2.연결 SWC 3.어플리케이션 입니다. 실제로 우리가 ANE 라고 부르는 영역은 1번과 2번 까지 입니다. 하지만 실제로 ANE 를 만들고 테스트 하기 위해서는 디바이스에서 돌아가는 3번 어플리케이션 까지 작성해야 합니다. 그리고 ANE와 어플리케이션이 전혀 다른 루트로 디버그툴을 제공하므로 디버그가 상당히 불편한 편입니다. 가장 좋은 솔루션은 네이티브코드를 작성할때 테스트 케이스를 만들어 네이티브코드에 대한 무결성을 보장하는 겁니다.

ANE 구조

이제 ANE 파일의 실제구조를 알아보겠습니다. ANE는 단순히 네이티브코드와 연결SWC의 libaray.swf 그리고 이들의 관계를 정의한 extension.xml 의 압축파일입니다. 파일트리는 다음 과 같습니다.

<br />
mimetype<br />
META-INF/ANE/extension.xml<br />
catalog.xml<br />
library.swf<br />
META-INF/ANE/Android-ARM/library.swf<br />
META-INF/ANE/Android-ARM/ScreenWakeUp.jar<br />
META-INF/ANE/iPhone-ARM/library.swf<br />
META-INF/ANE/iPhone-ARM/libScreenWakeUp.a<br />

앞으로 연제를 하며 만들어 볼 ScreenWakeUp의 ANE 트리구조 입니다. AIR는 시스템을 확인 후 extension.xml을 토대로 context를 생성 하게 됩니다. extension.xml을 한번 보겠습니다.

<br />
&lt;extension xmlns=&quot;http://ns.adobe.com/air/extension/3.1&quot;&gt;<br />
    &lt;id&gt;it.ane.ScreenWakeUp&lt;/id&gt;<br />
    &lt;versionNumber&gt;1.1&lt;/versionNumber&gt;<br />
    &lt;platforms&gt;<br />
        &lt;platform name=&quot;iPhone-ARM&quot;&gt;<br />
            &lt;applicationDeployment&gt;<br />
                &lt;nativeLibrary&gt;libScreenWakeUp.a&lt;/nativeLibrary&gt;<br />
                &lt;initializer&gt;ExtInitializer&lt;/initializer&gt;<br />
                &lt;finalizer&gt;ExtFinalizer&lt;/finalizer&gt;<br />
            &lt;/applicationDeployment&gt;<br />
   	    &lt;/platform&gt;</p>
<p>        ...</p>
<p>    &lt;/platforms&gt;<br />
&lt;/extension&gt;<br />

여기서 주의깊게 봐야 할 부분은 <id> 와 <initializer> 입니다. 다음 ANE만들기에서 다시 자세히 살펴보겠지만 간단히 살펴보면 <id>는 연결SWC 에서 다음의 코드로 context를 만들때 사용하는 아이디 입니다.

<br />
private static const EXTENSION_ID:String = &quot;it.ane.ScreenWakeUp&quot;;<br />
ExtensionContext.createExtensionContext(EXTENSION_ID, null);<br />

그리고 <initializer> 의 값은 네이티브코드에 정의된 함수로 FlashRuntimeExtensions.h 에 의해 전달된 context에 함수를 등록하는 함수입니다. 이렇게 함으로서 연결SWC 와 네이티브코드가 context를 통해 연결되게 됩니다.

정리

Adobe가 ANE를 처음(?)소개 했을 때 많은 플래시 개발자들이 열광했습니다. 저도 그들 중 한명이었구요. 모바일시대에 들어서면 플래시의 입지가 줄어들대로 줄어든 상황에서 ANE는 마치 한줄기 구원의 빛과 같았습니다. 하지만 ANE는 장점만큼이나 신경써야할게 많은 기술입니다. 특히 ANE의 핵심인 네이티브코드 부분은 일반 플래시개발자에게는 너무나 생소한 영역입니다. 그러다 보니 많은 분들이 ANE 에 관심은 있지만 실제로 쉽게 접근하기 힘든게 사실입니다. 하지만 차근차근 살펴보면 생각보다 어렵지 않습니다. 가능한 쉽게 설명하려 했으나 조금 뜬구름 잡는 느낌이 있는데 이후 연제에서 실제로 샘플을 만들어 보면 더 쉽게 이해 할 수 있으리라 생각 됩니다.

다음 시간 부터는 ScreenWakeUp 이라는 이름의 ANE를 실제로 만들어 보도록 하겠습니다. 이 ANE는 스마트폰의 화면을 켬 상태로 잠궈주는 기능을 합니다. 만약 AIR를 이용해 비디오 플레이어 같은 어플을 만들경우 유용하게 사용 할 수 있을 겁니다.

– 참고 –
http://www.adobe.com/devnet/air/articles/extending-air.html
http://help.adobe.com/en_US/air/extensions/air_extensions.pdf

Comments (5)

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.