WebOS 개발자가이드에 따르면 WebOS에서 작동하는 어플리케이션 개발은 크게 두가지 방법이 있다. Enyo 프레임워크를 사용한 Javascript 개발과, Qt/QML 개발이다. 여기에서는 우선 Qt에 집중한다.


지난번 글인 WebOS 용 Qt Application 개발 - 1에서 QT Program을 크로스 컴파일 한 후 Nexus 7에서 작동하는 WebOS Ports에 이식하였다. 작동은 잘 되긴하지만 문제는 그 과정이 너무 복잡하다는 것이었다. Mac이나 VM의 Ubuntu Linux상에서 작업을 하면 바이너리 파일이 Intel Arch에 따라 작성되는데, Nexus 7은  ARM이다. 이걸 크로스 컴파일 하려면 arm-linux-gnueabi-gcc 등과 같은 크로스 컴파일 기법을 활용해야 한다. 그런데 이게 정말 ARM걸릴 것만 같았다.


한가지 아이디어가 떠오른 것이, ARM으로 된 디바이스에서 개발을 하면 어차피 ARM용 바이너리가 생성될 것이 아닌가? 하여 구석에 쳐박아두었던 Raspberry Pi 2를 꺼내들었다. 다행히 이미 라즈베리 파이는 유명한 하드웨어여서, qt 개발사에서도 이미 전적으로 지원하고 있는 상황. 이와 관련해서는 라즈베리 파이2에 Qt 개발환경 구축 포스팅을 참조할 것. Qt 는 현시점에서 2017년 1월에 출시된 5.8  버전이 최신이고, WebOS Ports에서 5.7과 5.8을 지원한다고 명시하고 있기는하나, 본인이 직접 삽질 노가다를 뛰어본 결과 라이브러리 연동이 불안정하고 깨진 곳이 더러 있었다. 족히 수십번의 재설치 끝에 내린 결론은 당장은 그냥 5.3.2 버전을 사용하는 것이다. 업데이트와 관련해서는 향후로 남겨두고 우선은 급히 앱을 만들어야하므로;;

현재 아래와 같이 Qt 5.3.2 버전이 깔려있고, arm-linux-gnueabihf 컴파일러에 연결되어 있다. 별다른 작업 없이도 그냥 GUI 상의 QtCreator IDE로 개발을 수행하고 빌드할 수 있는 최적의 상황. (다만, Raspberry Pi 2 는 좀 느리다;)

앱 개발은 스스로 해야하는 것이지만 설명을 위해 공식 예제를 사용해보도록 한다. Mac이나 Linux, Windows 용 QTCreator를 설치하면 기본적으로 여러 Tutorials과 Examples 가 함께 설치된다. 라즈베리 파이에서는 설치가 따로 안되어있을 수 있는데 Mac에서 해당 디렉토리 압축해서 가져와도 그대로 잘 작동이 된다. 아래는 고전게임의 대명사인 테트릭스 Qt 예제이다. 클릭하면 자동으로 Qt Widgets Documents 가 팝업되어 출력된다.

Example이 저장되어 있는 경로는 저마다 다를 수 있는데 필자의 경우

/Users/CPUU/Qt5.8.0/Examples/Qt-5.8/widgets/widgets/tetrix 이었으니 참고바람. 해당 디렉토리를 압축한 후 라즈베리 파이로 옮겨서 컴파일을 해보자. 라즈베리 파이의 QtCreator를 열고 File -> Open File or Project 를 선택한 후 Tetrix 를 찾아서 연다. tetrix.pro 파일을 선택하면 프로젝트 전체를 식별해서 열어준다.

이렇게 자동으로 코드를 컴파일 할 수 있는 스크립트가 생성되어 있다.

빌드 후 실행했더니 잘 된다.

이제 이것을 WebOS 에 넣어서 구동해보자. 일반적인 QtCreator 설정에 따르면, IDE에서 빌드한 결과물과 실행파일은 해당 프로젝트의 상위에 디버그 디렉토리 형식으로 생성되어 저장되어 있다. 이 경우

~/Examples/Qt-5.8/widgets/widgets/build-tetrix-Desktop-Debug이고 아래와 같이 tetrix 바이너리가 생성되어 있다.

저 tetrix 파일을 webOS Ports로 옮기자. 필자는 Nexus 7 (2012)을 사용하고 있다.

SCP 프로토콜로 Nexus 에서 Pi에 있는 파일을 땡겨온다.

저장이 되었으면 지금부터는 Nexus 7 (a.k.a. grouper)에서 작업을 한다.


WebOS Ports 의 애플리케이션들은 모두 /usr/palm/applications 에 위치한다. 앱 작동을 관장하는 LunaAppManager가 이 디렉토리를 계속 스캔하는 듯 하다. 


여기에 테트릭스를 위한 디렉토리를 생성하자.

다음으로 생성할 것은 app의 설정정보를 담고 있는 appinfo.json 파일이다. LG 등의 WebOS 사용업체는 모두 아래의 형식을 권장하고 있으며, 대부분 IDE에서 자동으로 생성해준다. 하지만 모든 항목이 필수인 것은 아니다.

이를 참조하여 대략 아래와 같이 꾸민다.

여기에서 가장 중요한 것이, "id" 항목이다. 이 부분이 디렉토리 이름과 일치하지 않으면 앱이 인식되지 않는다. 그러므로 꼭 여기의 디렉토리명과 같도록 cpuu.tetrix으로 설정한다. 다음은 "main" 항목이다. 저기에 명시된 tetrix 바이너리 파일을 호출하게 된다. 같은 디렉토리에 아까 복사해온 tetrix를 옮겨오자.

대충 아이콘도 하나 마련하자. (출처 : SoftIcons)

출처 : http://www.softicons.com/android-icons/cold-fusion-hd-icons-by-chris-banks/tetris-icon
출처 : http://www.softicons.com/android-icons/cold-fusion-hd-icons-by-chris-banks/tetris-icon

wget으로 바로 긁어온 다음에 파일명만 icon.png로 바꿔주자.

여기까지 했으면 사실상 앱 설치는 끝난 상태. 하지만 아직 앱이 보이지는 않는다.

보통 이럴때는 재부팅을 하면 당연히 해결이 되지만.. 더 편리한 방법이 있다. App의 실행을 관장하는 LuanaAppManager만 재기동해주면 된다. kill -9 로 죽이고나서 다시 살리는 방법인데, 사실 systemd가 지속적으로 데몬의 상태를 점검하고 죽었을 경우 되살리기 때문에 굳이 다시 실행할 필요는 없이 kill 만 해주면 된다. ps -ef 로 pid 를 찾아서 죽이거나 아니면 다음과같이 이름으로 바로 종료시킬 수 있다. 아래 내용을 보면, pkill -9 를 하기 전후로 LunaAppManager의 PID 가 변경되어 있다. 사실은 데몬이 종료되자마자 거의 즉시 재기동된 것이다.

LunaAppManager가 재기동될때 디바이스를 잘 관찰해보면, 화면이 한번 깜빡~ 하면서 새로고침된다. 그래도 혹시 뭔가 적용이 잘안된다면 luna-next 데몬을 킬해보도록. 그나마도 안되면 역시나 재부팅이 답

테트리스 앱이 잘 설치되어 있다. 실행해볼까? 

잘작동한다.... 아.. 아뿔싸.. 근데 Nexus 7에서 플레이하려면 키보드가 있어야되는데 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ방향키 기능을 대신 터치패드로 구현해야 써먹을 수 있겠다. ㅋㅋㅋㅋㅋㅋㅋㅋ 뭔가 예제를 잘못 설정한 것 같지만, 무튼 이런식으로 QtCreator 에서 응용프로그램 개발한 후 WebOS 내부에서 작동시키는 것을 보여주는 것에는 성공한 것 같다. 수고~


다음엔 qml과 enyojs 프레임웍으로 앱을 만드는 것을 해봐야 한다.

CPUU님의 창작활동을 응원하고 싶으세요?