빠른 Titanium Android 개발을 위해서 x86 에뮬레이터를 이용하라 (2) - FastDev
FastDev란 titanium에서 android 앱 개발시 코드 변경사항을 빠르게 확인 및 테스트 할 수 있는 도구를 말합니다.
간단히 설명하자면 emulator에서 앱이 실행될 때 설치되는 앱 패키지(apk) 파일 안의 js를 사용하는 것이 아니라 FastDev서버를 통해 필요할때 마다 파일을 받는 방식입니다. 따라서 코드를 변경한 후 앱만 재실행 하면 바로 변경되거나 추가된 내용을 에뮬레이터에서 실행/확인 가능합니다. FastDev서버는 해당 프로젝트의 Resource폴더의 파일을 에뮬레이터에게 network를 통해 전달하는 방식입니다. 네트워크로 전달하지만 전부 local에 존재하기 때문에 느리거나 하지 않습니다.
현재버전 3.1.x.GA를 기준으로 프로젝트를 생성하고 android emulator로 구동하면 기본적으로 fastdev가 활성화 되어 있습니다. 따라서 titanium studio에서 emulator로 실행을 합니다. 이때 console에 찍히는 로그를 보면 [INFO] Fastdev server running, deploying in Fastdev mode라고 적혀있을 겁니다. 정상 작동한다는 얘기입니다. 간단하죠? 이제 코드를 변경하고 프로젝트 빌드나 에뮬레이터 재시작 없이 앱만 재실행하면 바로 변화된 내용을 살펴볼수 있습니다. 앱을 재실행하는 방법은
주의사항 1) Alloy프로젝트라면 변경된 코드를 확인하기 위해 앱을 재실행 하기에 앞서 Alloy compile을 해야합니다.1
주의사항 2) 아래서 설명하는 재시작이 정상적으로 동작하려면 처음 열리는 윈도우가 Heavywindow(Activity)가 되어야 합니다.2
ADB 명령어를 이용하는 방법 실행중인 appid를 알아야 합니다. 그리고 시작하는 Activity를 알아야 합니다. 따로 manifest쪽을 수정하지 않았다면 /.ProjectnameActivity입니다. (Activity이름은 project이름의 대소문자 원래 어떤지는 상관없이 첫글짜만 대문자로 변경됩니다.)
adb shell am force-stop com.xyz.package; adb shell am start -n com.xyz.package/.ProjectnameActivity
수동으로 Emulator의 Backbutton을 눌러 앱을 종료시키고 앱 아이콘을 눌러 시작한다.^^
Titanium.py(fastdev.py)를 이용하는 방법 Node기반의 Titanium CLI이전에 있던 titanium.py3를 이용하면 아래와 같습니다.
titanium.py fastdev restart-app
그런데 restart-app은 정상적으로 동작하지 않습니다. 그래서 해결해보려고 하다가 fastdev kill-app을 이용해보니 마치 재시작 처럼 됩니다. 이것도 버그지만 오히려 득이되네요. :) FastDev명령어를 이용하는 방법의 장점은 현재 fastdev로 실행중인 앱의 패키지 id나 activity이름을 몰라도 된다는 점입니다.
앱 재시작을 Titanium Studio 단축키로 설정하기
Titanium Studio를 이용할 경우 명령어를 External Tool을 통해 실행시키고 이를 단축키로 설정해 놓으면 편리합니다. (예정) 단축키를 통해 node.js를 실행하여 ios-sim과 fastdev를 손쉽게 할 수 있는 방법은 조만간 다른 포스트를 통해 공개하겠습니다.
fastdev는 간혹 연결이 끊어지거나 분명 fastdev서버가 켜져있는데도 찾을 수 없다고 일반 모드로 실행 될때가 있습니다. 이건 알려진 문제로 Appcelerator Doc에도 나와 있습니다. 이때는 emulator를 재시작하면 되고 그래도 안되면 재부팅하면 되긴하더군요. 어떤상황에 잘 끊긴다 이런건 아직 찾지 못했어요. 혹시 이부분에 대해 아시는 분 있으면 알려주세요.
처음 fastdev가 나왔을때 써보고 정말 좋다고 생각했었습니다. 그런데 문제는 emulator 자체가 너무 느렸죠. 그러나 요즘은 x86 이미지를 이용하면 빠르다보니 fastdev의 장점을 살릴 수 있는것 같습니다. 원래 appcelerator의 계획은 fastdev를 device상에서도 가능하게 한다고 했는데 소식이 없네요. fastdev는 아직도 몇가지 문제가 있지만 워낙 편리하다보니 fastdev를 사용 안할 수가 없네요. 특히 ui를 만들어가면서 하나씩 수정할 땐 정말 빠르게 확인 가능해서 좋습니다. fastdev, tishadow, ios-sim은 상황과 목적에 맞게 잘 활용한다면 개발자의 소중한 시간을 아껴주는데 큰 도움이 되는 도구들 입니다.^^
빠른 Titanium Android 개발을 위해서 x86 에뮬레이터를 이용하라 (1) : http://codejong.net/post/55735837946/titanium-android-x86-1
fastdev : http://docs.appcelerator.com/titanium/3.0/#!/guide/Fastdev_Reference_for_Android
tishadow : http://tishadow.yydigital.com
tishadow 활용방법 : http://codejong.net/post/51276937188/tishadow
app 재시작시 restart 한다는 alert가 나오는 경우 <property name="ti.android.bug2373.finishfalseroot" type="bool">true</property>를 tiappl.xml에 추가하면 해결됩니다. https://jira.appcelerator.org/browse/TIMOB-9285
Alloy일 경우 아래와 같이 한 줄 명령어로 fastdev까지 실행하면 편합니다.
alloy compile -c platform=android && titanium.py fastdev kill-app
Window 생성시 fullscreen, navBarHidden, modal, windowSoftInputMode를 명시적으로 지정하면 Heavyweight window가 됩니다. 자세한 사항은 Appcelerator Doc의 Android Heavyweight and Lightweight Windows를 참고하세요. ↩︎
titanium.py를 이용하기 위해선 ~/.bash_profile에 alias 설정이 되어 있어야 합니다.
alias titanium.py="$HOME/Library/Application\ Support/Titanium/mobilesdk/osx/3.1.1.GA/titanium.py"