따뜻한 대한민국 겨울만들기

※ 개발 환경

- Flash Builder 4.6

- AIR SDK 3.3 Beta 3 (3.3.0.3560)

- Mac OS 10.6.8 (Snow Leopard)

- XCode 4.2 For Snow Leopard

- iOS SDK 5.1

- Test Device iPhone 3GS (iOS 5.1.0)


원문http://blogs.adobe.com/rajorshi/2011/11/18/debugging-native-extensions-for-air-ios/


AIR 애플리케이션 개발 프로젝트가 거의 끝날 무렵,

iOS Native Extension 디버깅이 불가능하다고만 알고 있었는데 위의 문서를 알게 되었습니다.

Native Extension을 iOS 에서 디버깅 하는 방법을 다룬 문서 - -;


이 짧막한 문서는 사실 꽤 많은 것들을 알고 있어야 실제로 따라 해보기가 가능합니다.


우선,

ADT(AIR Developer Tool) 을 어느정도 알고 있어야 하고,

XCode의 기본 사용법과,

Apple 개발자 프로그램에 등록이 되어 있어야 합니다. (디바이스로 직접 돌려야 하기 때문에...)


문서를 따라 하면서, 제가 헷갈렸던 것들이나 삽질했던 점들을 정리해 보겠습니다.


0. 사전 준비


우선 AIR Mobile Project에서 NativeExtension 을 사용하는 부분은 생략하고, 

NETest.ane 를 사용하고 컴파일에 문제 없는 AIR 모바일 프로젝트가 있으면 준비는 완료.



1. 디버깅 타겟 추가


(아래 이미지는 원문에서 가져 온 것입니다.)


디버깅할 NativeExtension의 Project (Cocoa Touch Static Library) 에서, Target을 추가 합니다. 

그림에서는 Add Target -> Empty Application 을 추가 하였습니다. (XCode 4.2이전 버전은 Windowd Application을 추가)

Target Application 의 이름은 아무거나 상관 없습니다.



2. 디버깅 타겟 설정


(아래 이미지는 원문에서 가져 온 것입니다.)


Target 에 Application을 추가한 다음,

Build Settings 에서 Product Name 에 실제 AIR 프로젝트의 이름을 입력해야 합니다.

Native Extension을 사용하고 있는 AIR 프로젝트 이름이 HelloWorld 이면 Product Name 에도 Hello World 로 입력.

만약, iOS 4.x 에서 디버깅을 한다면 Build Setting 의 iOS Deployment Target 을 알맞게 설정하면 됩니다.

(iOS Deployment Target 의 버전이 iPhone 의 iOS 버전 보다 높으면 기기에 인스톨이 안된다고 하네요.)


※ 그리고 혹시, 빌드 후 실행했을때 'no debug symbols in executable' 라는 경고가 뜬다면,

Build Setting 의 Generate Debug Symbols 를 Yes 로 하시면 경고가 없어집니다.



3. Run Script 추가


(아래 이미지는 원문에서 가져 온 것입니다.)


Build Setting 을 완료 하였다면,

그림에서와 같이 Build Phases -> Add Run Script 를 클릭해서 실행 스크립트(Run Script)를 추가합니다.



4. Run Script 예시



그림을 보시면 중간 부분의 /* 표시부터 주석으로 처리되는 것 같이 보입니다만, 실행은 잘 됩니다.

그럼 실행 스크립트를 자세히 한번 보겠습니다.



5. Run Script 분석

# pushd : 현재 디렉토리를 저장하고 새로운 디렉토리로 이동
# 여기서는 AIR 프로젝트에 있는 build 라는 디렉토리 지정
pushd /Users/AirProject/build

# ADT로 .ipa 컴파일 (자세한 설명은 아래에)
# 아래는 보기 쉽게 줄바꿈을 했지만, 원래는 한줄로 적어야 정상 작동 함
/Applications/Adobe\ Flash\ Builder\ 4.6/sdks/4.6.0_AIR3.3_Beta_p3/bin/adt 
-package -target ipa-debug-interpreter 
-provisioning-profile /Users/FlowerGirl/My_Provisioning_Profile_.mobileprovision 
-storetype pkcs12 
-keystore /Users/FlowerGirl/my_certification.p12 
-storepass xxxx 
AirProject.ipa 
AirProject-app.xml 
AirProject.swf 
-extdir ~/FlowerProject/AirProject/lib 
-platformsdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ 
assets 
Default.png

# .ipa 파일 압축 해제
cp AirProject.ipa AirProject.ipa.zip
unzip -o AirProject.ipa.zip
rm AirProject.ipa.zip

# 압축 해제 후 나오는 파일들을 Xcode 의 위치로 복사
cp -r Payload/AirProject.app/*       "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/"
cp -r AirProject.app.dSYM "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/"

# 앱 설치중 서명 에러를 피하기 위해 아래의 파일 및 폴더들을 삭제
rm "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/_CodeSignature/CodeResources"
rmdir "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/_CodeSignature"
rm "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/CodeResources"
rm "${CONFIGURATION_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/PkgInfo"
                           
# popd : 스택의 제일 위에 있는 디렉토리를 꺼내서 버리고 그 밑에 있는 디렉토리로 이동
# 위 pushd에 지정된 경로(~/build) 제거 후 원래 경로로 돌아감
popd

위 실행 스크립트에 간단한 주석을 달아 설명해 놓았구요.


전체 스크립트 과정을 간단히 요약하면,


디버깅할 AIR프로젝트로 이동 

→ ADT로 IPA 파일 컴파일 

→ IPA 파일 압축해제 후 

→ .app 패이로드 파일과 dsym 파일을 XCode 네이티브 익스텐션 프로젝트 실행 경로로 복사

→ 앱 설치중 서명 에러를 피하기 위해 관련 파일들 정리 → 경로 복구


ADT 컴파일 파라미터 설명

● /Applications/Adobe\Flash\Builder\4.6/sdks/4.6.0_AIR3.3_Beta_p3/bin/adt : ADT 경로

● -package -target ipa-debug-interpreter : 패키지 방법
● -provisioning-profile PROVISIONING.mobileprovision : 프로비져닝 파일(경로 포함)
● -storetype pkcs12 : 인증서 타입 
● -keystore CERTIFICATION.p12 : 인증서 파일(경로 포함)
● -storepass CERT_PASSWORD : 인증서 비번
● AirProject.ipa : output 되는 ipa 파일 이름
● AirProject-app.xml : input 시 사용되는 -app.xml 파일 (bin-debug)
● AirProject.swf : input 시 사용되는 swf 파일 (bin-debug)
● -extdir ~/AirProject/lib : Native Extension 파일이 있는 경로
● -platformsdk /Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.1.sdk/ : iOS SDK 경로

● assets : 아이콘 이미지 등이 있는 경로

● Default.png : 스플래쉬 이미지 경로


※ ADT 관련 더 자세한 정보를 알고 싶으시면 아래의 문서를 참고 바랍니다.

ADT 가이드 : http://help.adobe.com/ko_KR/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7fd9.html


dSYM 란?

디버그 심볼 파일로 프로그램의 디버그 환경이 없어도 되도록, 실행 파일에 대한 최소 크기의 디버깅 정보를 포하하고 있는 파일이다.

(참고 : AIR 프로젝트에 Native Extension 파일이 포함되어 있지 않은 채 컴파일 하면 이 dSYM 파일이 생성되지 않는다.)



6. 디버깅 실행 과정


위 단계까지 완료 후, 

 XCode 에서(Native Extension Project) Build & Run 

 AIR Mobile Project 있는 경로(/build) 가서 (실행 스크립트의 내용)

 ADT 컴파일해서 .ipa 파일을 얻고 (실행 스크립트의 내용)

  .ipa 파일을 압축 해제  (실행 스크립트의 내용)

 압축해제 파일들을 XCode NativeExtension 실행 경로에 복사 (실행 스크립트의 내용)

 iOS Device 실행

 기기에  설치 실행

 NSLog 관련 로그들이 XCode Output창에 찍히는 것을 있다.


위와 같은 순서로 진행을 하시면, 문제 없이 AIR 프로젝트의 Native Extension (iOS) 로그를 찍으실 수 있을 것 입니다.



7. 참고 사항


AIR Mobile Project 가 있는 경로(/build) 란?

저 같은 경우는 AIR Project에 build 라는 폴더를 따로 만들어 그 안에 ADT 빌드 관련 파일들을 다 모아 두었습니다. 

예를 들어, bin-debug 폴더에 있는 AirProject-app.xml, AirProject.swf, asset 폴더, Default.png 과 같은 것들... 

그러면 위의 ADT 스크립트가 실행 되면 build 파일에 AirProject.ipa 파일이 컴파일 되어 생기게 되는거죠. 

bin-debug 폴더에서 위와 같은 작업들을 하면 bin-debug 폴더가 지저분 해져서 이렇게 하였습니다. 

참고 하시구요.

- iOS Device 에서 돌려야 정상적으로 디버깅 가능

Simulator에서는 앱 실행되자마자 종료되더라구요.


Reference


- Debugging Native Extension for iOS

http://blogs.adobe.com/rajorshi/2011/11/18/debugging-native-extensions-for-air-ios/

- Building Native Extension iOS Code

http://www.digitalprimates.net/author/nweber/2012/04/10/building-a-native-extension-part-3/

- ADT 가이드

http://help.adobe.com/ko_KR/air/build/WS5b3ccc516d4fbf351e63e3d118666ade46-7fd9.html

- ADT iOS 패키지

http://help.adobe.com/ko_KR/air/build/WS901d38e593cd1bac35eb7b4e12cddc5fbbb-8000.html

- ADT 환경변수

http://help.adobe.com/ko_KR/air/build/WSfffb011ac560372f-71994050128cca87097-8000.html