WonHada.com으로 이전

[윤훈남]윈도우상에서 ANE를 간단히 시험삼아 생성해봤습니다. 본문

Adobe AIR

[윤훈남]윈도우상에서 ANE를 간단히 시험삼아 생성해봤습니다.

반주부 2012. 6. 13. 20:46
반응형

윤훈남님의 글..


윈도우상에서 ANE를 간단히 시험삼아 생성해봤습니다. 만들면서 알게된 ANE의 구조를 잠시 언급하겠습니다. ANE 파일을 최종적으로 zip 파일 형태이며 확장자만 ane이라고 정의내렸습니다.


확장자를 zip으로 바꾸고 알집에서 오픈할수 있습니다. 당연히..


내부 구조를 보면 META-INF\ANE 폴더내에 플랫폼별 폴더가 생성됩니다. 윈도우의 경우에는 Windows-x86이라는 폴더입니다. ANE 파일에 다양한 플랫폼 라이브러리를 함께 묶어줄수 있어서 하나의 ANE로 다중 플랫폼에서 운영 가능한 라이브러리를 개발할수 있습니다. 물론 그만큼 개발자 입장에서는 여러 플랫폼을 넓게 알아야겠지만.


어찌되었던 그 내부에는 dll 파일과 library.swf로 구성됩니다. dll 파일은 최소 두개의 함수를 외부로 익스포트해야 합니다. 익스포트된 파일 정보는 상위 xml 파일에 기록되어 있습니다. library.swf 파일은 dll 파일을 사용해서 클래스 레벨로 래핑한 as 파일을 acompc 라는 툴로 swc를 생성하면 함께 내부에 생성된 swf 파일인데, 간단히 as 파일 정도라고 생각하면 됩니다. 결국 ANE는 가장 밑단은 Native Call 형태로 구성하고, 외부에 노출하는 as 파일을 생성하고, 함께 묶어서 ANE를 생성합니다.


따라서 ANE를 사용하는 레벨에서는 레필된 as 파일과 동일하게 인식됩니다. 자세한 부분은 원강민님의 CS6에서 ANE를 사용하는 부분을 보시면 이해가 될겁니다.


개발자 입장에서는 C나 C++로 Native Call 가능한 라이브러리 파일을 생성하고, 일부를 익스포트한 후 xml로 익스포트 정보를 구성하고, 래핑할 as 파일을 생성해서 adt라는 툴로 묶어주면 됩니다.


=================================================


http://www.muticd.com/ANE.zip 


윈도우 기반으로 ANE 샘플을 대충 만들어 보왔습니다. 전체적인 개념을 익히는 목적으로 만들어본 샘플이라. 조금 시간이 걸렸습니다. COMPORT 통신을 할수 있도록 만든 ANE 샘플입니다.


내부에 쓰레드를 하나 더 돌려서 시리얼로부터 받아온 데이터를 큐에 쌓아두고 받아오는 구조입니다. 일단 기본적인 기능은 대부분 존재합니다. 윈도우 98이상에서 잘 돌아가도록 구성해봤습니다. 가능하면 의존적인 DLL이 없도록.. Libiconv 오픈 소스를 조금 조정해서 utf-8를 다른 텍스트로 엔코딩하도록 구성했습니다. Libiconv 라이브러리 역시 내부에 내장해서 외부 DLL를 사용하지 않도록 구성해봤습니다.


대충 전체적인 개념을 잡는 목적으로 사용하시면 될듯합니다. 제가 주로 사용하는 디렉터로 만든 플러그인과 속도면에서 거의 차이가 없습니다.


해당 파일에는 msvc6로 만든 모든 소스와 라이브러리 및 기본 샘플도 급하게나마 포함했습니다.


=================================================


ANE는 기본적으로 DLL를 사용하도록 해주는 구조입니다. 문제는 AIR의 배포 정책과 맞물려서 미묘한 문제가 생길 수 있습니다.


일반적으로 exe 파일과 exe와 동일한 폴더에 있는 DLL는 자동적으로 로딩이 필요하면 로딩이 됩니다. 즉 하나의 exe 모듈이 로드되는 경로에 의존적이죠.


문제는 air로 만든 결과물이 air 런타입 방식으로 실행되면 경로를 air 개발자가 독립적으로 제어할 수 없게 됩니다. 


또 다른 문제는 dll이 압축된 상태로 배포하는데, 실제 실행 단계에서는 어딘가에 압축을 풀게 됩니다. 문제는 압축이 풀리는 경로를 명확하게 air 개발자가 알기가 힘들며, 압축되어 있는 모든 dll를 동일한 경로에 풀어주는지도 알아봐야할 문제입니다.


또 다른 문제는 ANE 개발자가 ANE를 만드는 과정에서 디버깅이 힘들어집니다. 개발툴에서는 DLL의 경로와 exe 경로를 알고 있다면 개발툴 레벨에서 정확하게 디버깅이 가능합니다. C++이나 C로 작성하는 과정에서 흔하게 발생할 디버깅 방법에 대한 묘안이 없습니다.


결국 ANE가 조금 더 활성화될려면 DLL 참조에 대한 유연성을 확보해야 합니다. 이런 문제를 가장 효율적으로 하는 방법은 air 런타입 기반이 아니라 air+런타입이 통합된 exe 형태 배포 방식으로 발전해야 합니다.


=================================================


기본 ComportANE에 성능을 개선했습니다. 데이터 수신 속도를 개선, 이벤트를 적용하도록 수정했습니다. t.addEventListener(ComportEvent.RECVDATA,fn);와 같은 방식으로 컴포트로 들어온 데이터가 알람됩니다. 한개의 ByteArray 버퍼를 재사용하도록 개선.


=================================================


기본 ComportANE 에 성능 개선 사항.


- 데이터 수신 속도 개선

- 이벤트 모델 적용 addEventListener 사용 가능해짐.

- 한개의 ByteArray 버퍼를 재사용하도록 개선.

- 전체 포트 리스트 및 비 사용중인 포트 리스트 얻어내기


=================================================


갑자기 딴 생각하다가 AIR 프로젝트 설치후 과정이 궁금해서 추적하다보니 이런 사실을 알게 되는군요.


AIR 프로젝트를 생성하는 과정에서 dll를 추가하니 설치하면 exe와 동일한 폴더에 dll이 그대로 복사되는 군요.


그리고 동적으로 압축을 푼다고 생각했던 부분이 지금보니 제가 잘못 생각했던 거군요.


따라서 ANE에서 참조하는 DLL를 프로젝트 생성 과정에서 추가해주면 DLL 의존성 문제는 어느 정도 해결 가능하군요. 


또한 C++/C 개발자가 ANE를 개발하는 과정에서 디버깅도 가능합니다. 이쪽을 해본 분은 무슨 말인지 이해되실듯.


이제 다음 문제는 AIR 런타임 문제인데, 이 부분도 임베드 형식과 dll를 직접 추가하는 방식으로 해결할 수 있다면 좋을듯하군요.


생성된 exe를 조사해보니 OLE32.dll를 참고하지 않고 LoadLibrary를 참고하는 것을 보니 런타임 DLL를 찾아서 넣어도 런타임 문제는 해결될지도 모르겠다는 생각도 들군요. 


AIR 런타임 DLL에 대한 정보를 조금 더 찾아보고 발견되면 추가 게시글을 올릴께요.


반응형