Enabling Qualcomm diagnostic mode on Jolla

Since Jolla uses Qualcomm MSM8930AA, it is possible to use Qualcomm diagnostic tools in theory. They are not available by default and the way to enable this functionality is not yet discovered. I poked various options of usb-moded but diagnostic mode did not came out. I ended up editing some files and finally managed to get the diagnostic mode on my Jolla.

DISCLAIMER: you may void your warranty, especially poking with various Qualcomm-related tools. You have been warned.

usb-moded files are located under /etc/usb-moded and there are several ini files defining modes. USB mode selection UI gives options for PC Suite, Developer mode, Charging only. Those two modes are defined in /etc/usb-moded/dyn-modes/developer_mode-android.ini and pc_suite-android.ini. The file contains USB gadget settings like vendor and product ID, and most importantly, USB mode.

What is exposed via USB interface is determined by /sys/class/android_usb/android0/functions file. Directly modifying sysfs values seems not to work, only via editing usb-moded configuration files. usb-moded changes these values accordingly to the INI file. This is setting for developer mode.

$ cat /etc/usb-moded/dyn-modes/developer_mode-android.ini 
[mode]
name = developer_mode
module = none
network = 1
network_interface = rndis0

[options]
sysfs_path = /sys/class/android_usb/android0/functions
sysfs_value = rndis
sysfs_reset_value = none
softconnect_path = /sys/class/android_usb/android0/enable
softconnect = 1
softconnec_disconnect = 0
idProduct = 0A02

To enable diagnostic mode, you can append diag into sysfs_value and extra lines like this (you must be root to edit INI files):

$ cat /etc/usb-moded/dyn-modes/developer_mode-android.ini 
[mode]
name = developer_mode
module = none
network = 1
network_interface = rndis0

[options]
sysfs_path = /sys/class/android_usb/android0/functions
sysfs_value = rndis,diag
sysfs_reset_value = none
softconnect_path = /sys/class/android_usb/android0/enable
softconnect = 1
softconnec_disconnect = 0
idProduct = 0A02
android_extra_sysfs_path = /sys/class/android_usb/android0/f_diag/clients
android_extra_sysfs_value = diag

You need to restart phone or “systemctl restart usb-moded.service” to take the effect. When the file is modified, selecting developer mode on USB connection also activates diagnostics interface on USB. On Windows system there is no driver available for newly added diagnostics port. You can use driver from other Qualcomm-based devices, but the device name should include “diagnostics port”. I used driver from LTE USB stick.

If device is normally detected, you can now use Qualcomm tools to poke Jolla’s radio. Be careful not to brick this part! They are independent from OS!

When there are problems in USB usage, restore the values to original. Back up your system before potentially dangerous operations!

Extracting official firmware image of Casio G’zOne LTE (C811)

Most stock rom of Casio G’zOne 4G LTE (C811) is extracted from stock devices after uploading corresponding firmware. Verizon also supports firmware restoration tool from PC. There were some efforts to extract real stock firmware from that image but that never happened. I analyzed the Verizon firmware restoration tool and how to extract (not flash) firmware images uploaded on NEC Casio server.

There are some INI files bundled with Verizon tool (TL-Bootstrap). It specifies base address where all required tools are uploaded. When executed, the program checks all required tools’ version from http://baseaddress/ToolVersion.txt, downloads newer version when available. Real upgrade processes are hidden in the tool downloaded by bootstrap. Latest version of firmware is checked via /files.txt which contains version, size and some other information. Downloading firmware itself is straightforward by using filename from the text file, but only latest version is available from official server. All previous versions were deleted.

The firmware consists of single ZIP file, which then contains single MBN file for flashing. Despite same extension as Qualcomm tools, it uses proprietary format to encode and encrypt the image. Metadata is located at the last 2KB of MBN file. It starts with header, something like version and number of partitions. Each partition record basic information of partition and “flags”. EXT4 partition images are stored in standard sparce format which could be restored using simg2img. Other images stored with trailing zero bytes stripped, with separate original size information. All binary data except header is XOR encrypted, which differs among partition and even among firmware version.

I deduced XOR keys by comparing “extracted” file system images with encrypted images, which share same header bytes. XOR key of EXT4 sparce partition is also easily deducible since they use standard Android magic numbers. Attached source code calculates XOR key and extracts file system image. Probably works on Linux and OS X.

eut_extract.c code is here: https://gist.github.com/peremen/71330cbb4a6556358b938e0e353255a6

Using the attached source code, you can obtain “pure” stock ROM which is not altered by flashing and dumping.

Jolla/Sailfish OS용 한글 입력기, 돛단배

Jolla를 사자마자 준비 땅! 하고 한 일은 한글 입력기 제작이긴 했지만, 만들어 놓고 테스팅하느라 공개를 미룬 덕분에 다른 누군가가 한글 입력기를 먼저 공개하는 불상사가 터졌다. 먼저 공개된 입력기의 소스를 분석해 보니 뭐 그렇게 나쁜 것 같지는 않지만, 바퀴를 다시 발명할 필요는 없지 않은가. 그래서 한글 두벌식 입력 쪽은 바퀴를 다시 발명하는 대신 온라인 한글 입력기의 소스를 사용하였다. 돛단배 입력기는 두벌식 및 나랏글을 지원하는 Sailfish OS용 입력기이며, 개발 관련 이야기를 읽지 않고 싶다면 End 키를 누른 다음 맨 아래에 있는 다운로드 링크를 보면 된다.

Sailfish OS의 키보드 레이아웃은 QML로 작성되며, 여기에 사용자 정의 InputHandler를 붙이는 방식으로 단어를 입력하기 전에 조합하는 것과 같은 처리를 할 수 있다. 공식적인 InputHandler를 추가할 수 있는 API가 따로 없기 때문에 Sailfish OS용 일본어 입력기는 Hack에 가까운 방법으로 InputHandler를 전환하고 있었다. 먼저 공개된 일본어 입력기의 경우 Anthy 라이브러리를 QML 플러그인으로 만들어서 붙인 방식을 취하고 있었기 때문에 libhangul을 같은 방식으로 붙일까 생각했으나, 네이티브 코드를 쓰지 않는 것이 덜 번거로울 것이라고 판단하여 온라인 한글 입력기 기반으로 소스 코드를 전환하였다. InputHandler를 붙이는 것은 입력기 소스 코드의 ko_2set.qml, ko_naratgeul.qml 파일을 참고하면 된다.

아무튼 공개 시간을 놓쳐 버린 사태가 일어나고 나서, 바퀴를 다시 발명하는 것이 안타깝기도 하고 많은 ‘한국에서 개발되고 사용된’ 한글 입력기의 구현체와는 거리가 있기 때문에 내 소스 코드를 그냥 묻어 버릴 수는 없다고 판단하여 기능을 하나 더 추가하여 공개하기로 결심하였다. 눈에 들어온 것은 10키 방식 키보드였다. 서드파티 키보드 API를 사용할 수 있는 OS 중 안드로이드로는 키보드 제작이 활발하지만, 다른 모바일 OS의 경우에는 두벌식 키보드 하나 구현해 놓고 끝내는 일이 많아서 10키 키보드 제작에 신호탄을 쏘는 게 좋지 않을까 하는 생각이 들었다. 게다가 Sailfish OS용 키보드 레이아웃을 만드는 사람들도 10키 레이아웃에는 그다지 관심이 없는 것 같아서 내가 직접 레이아웃을 구현하는 게 더 빠를 것 같았다.

현재 국내 표준으로 지정된 모바일 입력기는 크게 천지인, 나랏글, SKY 한글이다. 이 중 나랏글을 먼저 구현한 데에는 감정적 및 기술적인 이유가 있다. 2004년부터 지금까지 휴대폰을 써 오면서 QWERTY 키보드가 없는 환경에서 가장 오랫동안 사용한 키보드 레이아웃이 나랏글이기 때문에 지금도 나랏글 자판에서는 손이 쭉쭉 나가고, 천지인은 그렇게 오랜 기간을 사용하지 않아서 그런지 아직까지 그렇게 익숙하지 않다. 또한 나랏글의 경우 자음을 입력하는 데 같은 키를 여러 번 누르는 것이 아니라 자음+획추가 방식을 사용하기 때문에 자음을 입력한 후 잠시 기다리거나 방향 키를 누를 필요가 없다. (모음은 아쉽게도 제외되지만 완전히 조합된 한글을 입력할 때 모음을 연속으로 입력하는 경우는 없다) 컴퓨터로 이것을 구현하려면 타이머 이벤트를 붙여서 조합 중 상태를 해제시켜 주어야 하는데 이것이 지원되는 지 여부를 확신할 수 없었다. 천지인의 경우 자음 충돌 문제 때문에 이 기능이 필수적이고 SKY 한글의 경우에는 ‘ㅢ’를 입력하는 경우에 모음 충돌이 발생할 수도 있지만 2번 키를 3회 연타하는 식으로 ㅢ를 입력하는 경우도 있다. 그래서 키보드 입력과 조합된 글자를 1:1 대응시키기 가장 쉬운 나랏글부터 먼저 구현하기로 했다.

표준으로 지정된 모바일 입력기 소스 코드를 구하려면 TTA에 연락하면 된다고는 하지만, 거기에서 제공하는 소스에 어떤 NDA가 걸려 있을지도 모르고 F/OSS 호환성도 확신할 수 없기 때문에 바닥에서부터 새로 구현하기로 결심했다. 모바일 입력기 중 천지인 입력기는 F/OSS로 구현한 게 몇 개 있는 것 같지만, 나랏글의 경우에는 자유 소프트웨어로 구현한 게 없는 것 같았다. 그래서 맨땅에 헤딩했다. 하나의 글자를 길이가 6인 배열로 자소별로 나누었고, 키를 입력하면 이 임시 배열에 자소별로 채워진 다음 최종적으로 음절로 변환하는 단계를 거쳐서 preedit 문자열이 생긴다.

한 글자를 입력하고 바로 커밋하는 방식을 취하기보다는 긴 preedit 문자열을 사용하여 단어 단위로 입력하게 만든 것은 나랏글 입력기의 특성 때문이다. (소스 코드의 inputQ 부분에 해당한다.) 예를 들어서 ‘안’이라는 글자를 입력한 다음 ‘ㄴ녕’을 입력하게 되면 ‘안ㄴ녕’이 나오게 되는데, 이 글자들을 입력하는 중간 과정에서 preedit 문자열에 최대 2개의 독립된 자음이 들어가게 된다. 받침이 있는 글자를 입력한 다음 또 다른 자음을 입력하면 그 자음이 이전에 입력한 글자와 결합되어 겹받침이 될 수도 있고, 다른 글자로 분리될 수도 있기 때문이다. 가령 ‘삭신’을 입력한다고 했을 때 중간 상태로는 ‘삯’이 존재하는데 이 경우 입력기는 사용자가 앞으로 여기에 자음을 입력할지 모음을 입력할지 모르기 때문에 최소 하나의 자음 정보는 더 달고 있어야 한다. 겹받침만 따로 상태를 관리할 수도 있겠냐고 생각할 수도 있지만, ‘앉다’와 같이 ㄵ 받침을 입력하는 경우에는 중간에 ㄴㅅ 상태를 거쳐야 하지만 이것은 올바른 겹받침이 아니기 때문이다. 따라서 종성 부분을 길이 2인 배열로 관리하며 이 배열에는 임의의 두 자음이 올 수 있도록 설계하였지만, 글자를 조합하는 과정에서 올바른 겹받침이 아닌 경우 다음 글자의 초성으로 표시되도록 설계하였고 이렇게 올바른 겹받침이 오지 않은 상태에서 또 다른 자음을 입력하면 중간에 있었던 자음을 별도의 한 글자로 배당한 다음 두 번째 글자의 초성으로 입력한 자음을 배당시켜야 하기 때문에 preedit 문자열의 길이를 충분히 확보해 두어야 한다. 모음 결합 부분은 의외로 구현이 간단하다.

입력 큐에 쌓여 있는 자모를 중간 결합하는 부분에서 첫가끝 대신 한글 호환성 자모를 사용한 것은 글꼴 문제보다는 이 면이 논리적으로 더 맞기 때문이다. 첫가끝 자모는 초성인지 종성인지에 대한 정보를 포함하고 있지만 호환성 자모는 초중종성 정보를 따로 포함하고 있지 않기 때문이다. 기타 commit/preeedit 스트링을 관리하는 부분은 libhangul API의 의미론을 최대한 반영하려고 하였다. 단어 단위로 입력 큐를 들고 있으면 차후에 자동 완성을 구현하는 것이 더 쉬워지는데, 이미 커밋된 글자를 따로 들고 있을 필요 없이 preedit 문자열을 그대로 검색하게 만들면 된다. 아쉽게도 F/OSS로 구현된 한글 단어 완성 라이브러리 및 데이터가 없는 것 같지만, 필요한 경우 나중에 추가하는 것도 가능하다.

나랏글 한글 입력기의 코어 로직은 src/ko_common/naratgeul_handler.js 파일에 포함되어 있다. process 함수에 1~12까지의 숫자를 전달하면(*: 10, 0: 11, #: 12) 이들을 숫자 입력으로 간주하여 해당하는 나랏글 자판에서의 키를 누른 것으로 간주한다. merge_q 함수는 현재 입력 큐에 들어 있는 글자를 보여줄 때 사용할 수 있으며, 입력 큐 길이는 8글자로 되어 있지만 부족하다면 늘일 수 있다. 조합 중 상태에서의 백스페이스 구현은 마지막으로 입력된 자모를 없애고 preedit 문자열을 업데이트하는 것 정도로 충분하다.

입력기의 원본 코드는 GNU General Public License 버전 2 이상으로 공개한다. 다른 오픈소스 입력기에서 이 코드를 사용하고 문제점을 지적하고 Pull Request를 보내는 것은 얼마든지 환영하지만, 소스 코드를 공개하지 않는 무료 및 유료 입력기에 이 코드를 무단 도용하는 것은 컴퓨터 프로그램 보호법에 의하여 대처하겠다. GPL 라이선스는 이 라이선스 하에 배포된 코드를 사용하는 파생 저작물 전체의 소스 코드를 공개할 것을 강제하고 있다. Xvid 코덱을 사용한 PS2 게임 ICO가 이 사실이 발각된 이후 게임 전체의 소스 코드가 공개된 것을 생각해 보면 된다.

돛단배 입력기의 소스 코드는 GitHub에 공개되어 있으며, OpenRepos에도 업로드되어 있어서 다운로드할 수 있다. 나랏글 입력기의 구현체를 다른 GPL 기반 한글 입력기에서 사용하는 것은 얼마든지 환영하며, 입력기 코드를 최초로 작성하는 만큼 소스 코드를 최적화한 Pull Request는 환영한다.

돛단배 입력기를 설치하면 Sailfish OS에서 선택할 수 있는 키보드에 한글(두벌식)과 한글(나랏글)이 추가되며, 다른 언어 키보드처럼 선택하면 된다. 단 한글(두벌식)에서 한글(나랏글)로 바로 가는 것은 API의 한계로 인하여 바로 지원되지 않으며 다른 언어를 경유하면 된다. 나랏글 키보드가 가로 화면에서 일그러지는 것 역시 알고 있는 문제이며 이는 차후 버전에서 개선할 예정이다. SKY 한글 및 천지인 입력기는 차후 버전에서 구현할 예정이다.

아래는 Jolla 휴대폰에서 구동시킨 돛단배 입력기의 스크린샷이며 각각 두벌식과 나랏글 모드이다.

두벌식 입력기

두벌식 입력기

나랏글 입력기

나랏글 입력기

블랙베리 Z10으로 LG U+ LTE 네트워크 사용

펌웨어 장난을 치다가 수리 보낸 Z10이 드디어 돌아왔다. 갈 때는 3G 전용 모델인 STL100-1이 갔으나 돌아올 때에는 북미용 LTE 모델인 STL100-3이 돌아왔다. Z10은 LTE 밴드에 따른 모델이 총 3개가 있는데 이 중 STL100-2는 800/900/1800/2600, STL100-3은 700/850/1700/1900을 지원하며 나머지 하나의 모델은 Verizon 전용이라서 우리와는 인연이 없다. 내 주 회선이 KT라서 STL100-2가 아니면 3G로만 써야 하는 게 좀 아쉽긴 하지만, SKT LTE 네트워크는 정상적으로 붙는 것을 보았고 LG U+도 가능할까 하는 생각이 들었다.

우선 LTE 라우터를 꺼낸 다음 mini SIM을 micro SIM으로 잘랐다. 내 커터가 좀 안 좋아서 그런지 아니면 원래 그런지 모르겠지만 자르고 나서 모서리를 좀 다듬어 주어야 다시 원래 형태로 결합할 수 있었다. 다시 LTE 라우터에 결합했을 때 4G 네트워크를 정상적으로 잡는 것을 확인한 다음 Z10에 물렸다. 그런데 생각대로 LTE 네트워크를 잘 잡지 못했다.

블랙베리 10 OS의 설정 – 네트워크에서 선택 가능한 조합은 STL100-1의 경우 2G, 3G, 3+2G 세 종류였고 STL100-3의 경우 4+3+2G, 4+3G, 3+2G, 3G, 2G가 선택 가능했다. 문제는 4+3G 및 4+3+2G 조합을 선택했을 때 바로 4G부터 연결하는 것이 아니라 3G를 먼저 찾은 다음 4G로 연결하는 것 같았다. 그래서 기본 설정인 4+3+2/4+3을 선택했다 하더라도 LG U+ 네트워크에는 연결하지 못하는 것이다. 이 문제를 해결하려면 우선 APN을 편집하여 “internet.lguplus.co.kr”을 추가한 다음 escreen을 불러와야 한다. escreen을 부르는 방법은 검색 몇 번으로 찾을 수 있어서 생략한다. escreen을 불러온 다음 맨 아래쪽의 General Radio 섹션에서 Enabled RAT에서 LTE_ONLY를 선택한 다음 재부팅해야 LG U+ LTE 네트워크를 인식하였다.

escreen 편집

escreen 편집

한 번 LG U+ LTE 네트워크를 잡으면 네트워크 우선 순위 설정을 건드리지 않으면 계속 연결되어 있다. 하지만 네트워크 우선 순위 설정을 조금이라도 건드리면 LTE 네트워크와 연결이 끊겨 버린다. 위 설정 이후 재부팅하면 네트워크 우선 순위는 4/3/2G처럼 보이지만 이것을 수정하면 인터넷 연결이 끊긴다.

네트워크 우선 순위 관리

네트워크 우선 순위 관리

VoLTE를 어떻게든 뚫어 보려고 음성 통화를 PS Only로 변경도 해 보았지만 114에 연결은 안 되는 것 같았고, SMS나 MMS도 안 된다는 말이 있었다. 어쩌면 이건 라우터 USIM이라서 걸리는 제약인 것 같다. 아래 스크린샷에서도 보는 것처럼 BBM 연결은 4G 망에서 안 되는 것 같다. (어차피 BBM 친구가 얼마 없긴 하지만)

LG U+ LTE

LG U+ LTE

급할 때에는 LTE 라우터 대신 이걸 쓸 수 있다는 것 정도에만 만족해야겠다. 어차피 LTE가 되는 태블릿이 없어서. Q10이나 Q5 같은 다른 블랙베리 10 모델은 가지고 있는 게 없어서 확신하기는 어렵지만, SKT LTE 850MHz에 연결할 수 있다면 LG U+에서 데이터 전용으로 시도해 볼 수는 있을 것이다.

Jolla 1개월 사용기

핀란드에서 한국까지 비행기를 타고 들어온 Jolla(욜라)도 이제 내 손에서 1개월 가까이 놀고 있다. Jolla를 사게 된 계기는 어쩌면 마음 속의 빚 때문이다. Akademy에 2008년부터 참석하면서 N810, N9, 블랙베리 Z10(이 쪽은 배다른 자식이긴 하지만)이라는 마에모 혈통의 장비를 세 대나 지원받았다. 하지만 정작 이들 장비를 가지고 한 일은 많이 없는 것 같았다. N810 때에는 Qt가 네이티브 지원이 아니어서 그랬다 쳐도, N9 때는 앱을 조금 만들어 보긴 했지만 공개하기는 조금 어려운 것들이었다. 하나는 옵티머스 Q 지식사전 데이터 파일을 가지고 놀면서 만든 사전 앱이었고 (원본 APK 파일에서 따 온 코드는 없음) 다른 하나는 T알리미의 동작을 흉내내는 앱이었다. 마음 같아서는 소스까지 공개하고 싶고 실제 전자의 앱은 소스를 공개는 했지만, 법적 문제의 가능성이 있어서 적극적으로 홍보하는 것은 미루고 있었다. Z10을 사고 나서는 그 당시 짰던 앱들을 Z10으로 포팅도 해 보았고, 블랙베리 10 SDK에 감탄도 했다.

하지만 내심 마음 한 쪽에는 이것도 빚이라는 생각을 하고 있었고, Jolla는 지원받든 받지 않든 내 돈으로 사야겠다는 생각을 했다. 저 세 대의 휴대폰을 얻었을 때와는 달리 지금은 미약하지만 수입원이 생겼고, 과연 내가 3대의 폰 값만큼 베풀었는지 의심스러웠기 때문이다. Jolla 예약 판매 때부터 지켜보고 있었지만, 2013년 5~6월 당시 자금 사정이 심각하게 안 좋아져서 예판을 손 빨고 지켜볼 수 밖에 없었다. 2013년 11월 드디어 핀란드를 시작으로 유럽 연합 내에 정식 발매가 시작되면서, 사태를 지켜 보니 유럽 연합 밖으로는 단시일 내에 팔리기는 어렵다는 생각이 들었고 구매 대행으로라도 사야겠다는 마음을 굳혔다. talk.maemo.org 사이트에도 EU 이외 국가에서 예판을 산 사람들의 불만글이 올라오는 걸 보고 안심할 수 밖에 없었다. 그러다가 핀란드로 가는 인편을 통해서 Jolla를 하나 구해 왔다. 출고가 399유로를 다 주고 산 거긴 하지만 그 동안 받은 공짜폰들을 생각해 보면 납득할 수 있었다.

Jolla 폰 박스 디자인은 강렬하다. 폰 내부 구성 요소의 QML 코드로 박스가 장식되어 있고, 옆면에는 시리얼 번호와 IMEI가 적혀 있는 스티커가 붙어 있다. 지원하는 주파수 대역은 2G GSM 850/900/1800/1900, 3G 900/2100, 4G 800/1800/2600, Wi-Fi 2.4GHz이다. LTE 지원은 아직까지도 활성화되어 있지 않고, Wi-Fi 5GHz가 없다는 것은 조금 아쉬웠다. 비공식적으로 LTE 지원을 활성화해서 쓸 수 있는 방법은 있으나, CSFB가 아직까지 지원되지 않기 때문에 전화 및 문자를 받을 수 없다. VoLTE가 지원되었다면 이 앞에 썼을 것이다. 국내 LTE 네트워크는 SKT 멀티캐리어/KT에서 사용 가능하며, LG U+의 경우 2.6GHz 대역이 상용화되면 데이터 전용으로는 사용 가능할 것이다. 현재 최신 펌웨어 기준 터미널에서 직접 무선 접속 우선 순위를 조작하면 LTE 네트워크에는 붙일 수 있다. 앱이 있으니 다운로드받아서 설치하면 된다. LTE 네트워크를 이렇게 뚫어서 쓰는 것은 가능하다.

억지로 활성화한 LTE

억지로 활성화한 LTE

박스를 열어 보면 휴대폰, 사용 설명서와 Jolla 스티커, 충전기와 USB 케이블이 들어 있다. 아쉽지만 이어폰은 없다. Sailfish OS UI가 제스처에 많은 기반을 두고 있는 만큼 사용 설명서에는 기본적인 제스처 사용법에 대해서 설명하고 있으며 1.0.5.0 펌웨어에는 튜토리얼 앱이 포함되어 있지만 이후 펌웨어에서는 모종의 이유로 삭제되었다.

Jolla 박스 전면

Jolla 박스 전면

Jolla 박스 후면

Jolla 박스 후면

배터리는 2100mAh 교체 가능하며, microSD, microSIM 슬롯이 있다. 카메라는 전면 200만, 후면 800만 AF 지원 모듈이 장착되어 있다. 위쪽으로는 3.5파이 이어폰 잭(아이폰식 4극), 보조 마이크, microUSB 포트가 있으며 오른쪽에는 전원 및 음량 키가 있다. 아래쪽에는 마이크와 스피커 구멍이 나 있으며 왼쪽에는 아무것도 없다. 배터리 커버로 볼 수 있는 건 The Other Half이다. Jolla의 티저 동영상을 통해서도 알려진 The Other Half는, 단순히 배터리 커버의 역할뿐만 아니라 NFC 태그를 내장하고 있다. 일반판에 기본적으로 포함되어 있는 흰색 The Other Half를 장착하면 NFC 태그가 인식되어서 휴대폰의 배경 화면을 포함한 프로필 설정이 자동으로 변경된다. Ambience로 불리는 이 기능에 대해서는 추후 설명할 것이다. 하드웨어적으로는 NFC 태그 이외에도 I2C 버스, 전원 공급 및 충전을 지원하여 다른 개발자들이 액세서리를 만들 수 있는 길을 열어 두었다.

Jolla 구성품

Jolla 구성품

Jolla 배터리 커버 내부

Jolla 배터리 커버 내부

폰 초기 설정 과정은 요즘 나오는 스마트폰과 다를 바가 없다. 설정이 끝나고 나면 휑한 홈 화면에 놀라면 된다. 공장 출하 상태에서의 기본 앱은 단 8개 뿐이다. 전화, 메시지, 인터넷, 카메라, 피플, 스토어, 갤러리, 설정, (튜토리얼). 때로는 너무 휑할 수도 있어서 기본 앱들이 덕지덕지 딸려 나오는 대부분 스마트폰들과는 극명한 대조를 이룬다.

기본 앱들은 제 역할을 충실하게 하고 있다. 내장 웹 브라우저는 Gecko 기반이며, User Agent는 파이어폭스 26.0으로 보고된다. 마에모는 쭉 모바일 Gecko에 개근을 해 왔다가 N9에 와서 잠시 웹킷으로 외도(?)를 한 다음 다시 원래의 Gecko로 돌아갔다. 국내의 어지간한 모바일 페이지는 플래시를 쓰지 않은 곳이라면 잘 볼 수 있다. 피플 앱은 페이스북과 같은 온라인 계정을 등록하면 바로 대화를 하거나 메시지를 보낼 수 있다. 페이스북 통합이 조금 재미있는 것은 알림 부분에서 설명할 것이다. 기본으로 내장된 동영상은 The Other Half 광고와 “고맙습니다”를 여러 나라 말로 말한 동영상이 포함되어 있다. Ambience는 휴대폰의 분위기를 한번에 변경할 수 있는 것으로, 특정한 사진을 선택하면 그 사진의 주요 색상에 맞게 휴대폰의 주 UI 및 글자 색상을 결정할 수 있고 알림음 및 음량을 사용자 정의할 수 있다. 앞서 이야기한 The Other Half에 장착되어 있는 NFC 태그를 통하여 그 반쪽과 어울리는 Ambience를 자동으로 다운로드 및 설치할 수 있으며, 바꿔 끼울 때마다 휴대폰의 분위기를 변경할 수 있는 특징이 있다. 아직까지는 흰색과 한정판밖에 공식 출시된 반쪽이 없지만, 차후 다른 반쪽이 출시되면 이 기능의 활용을 기대해 볼 수 있다. 전화 앱이 조금 특이한데, 스팸 전화가 걸려 올 때에는 02xxxxxxx*070xxxxxxxx와 같은 식으로 발신자 번호를 변경하였을 때 원래 번호까지 같이 표시된다. ’02 전화는 다 안 받아’라는 heuristic이 더 잘 통하게 만들어 주는 장치이다. 이 기능이 SMS에는 통하지 않아서 좀 아쉽긴 하다.

설정 화면으로 들어가면 맨 위에 비행기 모드/Wi-Fi/데이터/블루투스 토글이 있으며 음량과 밝기를 바로 조정할 수 있다. 이 항목들을 길게 누르면 삭제 가능하며 원하는 설정으로 추후 변경이 가능하다. 설정 화면은 뭐 필요한 것들은 다 들어 있고, 정보 메뉴에서 IMEI/Wi-Fi MAC 주소 등을 볼 수 있다. 공장 출하 시 첫 OS 버전은 1.0.0.5 Kaajanlampi이다. Jolla는 적어도 베타 기간 중 1개월 1회 업데이트를 약속하였고 지금은 1.0.3.8 Naamankajärvi까지 올라갔다. Jolla의 OS 릴리즈 코드명은 핀란드의 호수 이름에서 따 오고 있으며, 18만여개의 호수를 자랑하는 핀란드 특성 상 코드명이 바닥날 일은 Sailfish가 망하기 전엔 없을 것이다. 첫 OS 버전이 K로 시작하는 건 어쩌면 마에모와 미고의 후계자라는 뜻일지도 모른다. 과거에 썼던 글에서도 언급했듯 마에모와 미고의 코드명은 알파벳 A부터 시작해서 순차적으로 올라갔고, 새 릴리즈를 앞두고 알파벳을 하나씩 건너뛰었다. 마지막으로 나온 미고의 버전이 Harmattan, 작업 중이었던 미고의 차기 버전은 Ilmatar이다. J를 건너뛴다고 치면 K부터 시작하는 게 어쩌면 자연스럽게 연결되는 것이라고 볼 수 있다.

기본 앱이 너무 없어서 당황했으면 스토어로 들어간 다음 기본 앱 모음으로 들어가서 필요한 것들을 설치하면 된다. 안드로이드 지원, MS Exchange 지원, 계산기, 시계, 메모장, 메일, 문서, 미디어, 지도, 달력이 전부 개별 설치 및 삭제가 가능하다. 기본 지도 앱은 노키아의 Here 지도를 사용하기 때문에 한국에서는 무용지물이라서 설치하지 않았고, Exchange 지원도 내가 쓸 일이 없어서 설치하지 않았다. 안드로이드 지원을 설치하면 Myriad의 Alien Dalvik이 설치되고 안드로이드 앱을 받아서 쓰라고 Yandex 앱 스토어가 설치된다. APK 파일 설치는 가능하지만 구글 플레이 서비스 및 스토어는 내장되어 있지 않기 때문에 별개로 설치해 주어야 한다.

기본 앱 설치

기본 앱 설치

홈 화면 UI는 세로 방향 제스처를 중심으로 구성되어 있다. 폰을 켰을 때 보이는 잠금 화면을 아래로 밀어 내리면 메뉴가 표시되어 진동 모드, 설정, 카메라 진입이 가능하다. 위로 밀어 올리면 홈 화면이 표시된다. 열려 있는 앱이 축소되어서 표시되고 그 아래에는 4개의 런처 아이콘이 보인다. 이 화면을 밀어 올리면 설치된 모든 프로그램을 볼 수 있고 누르면 실행된다. 각각 앱 화면에서 화면 위쪽 가장자리에서 밀어 내리면 앱이 종료되고, 왼쪽이나 오른쪽 가장자리에서 빼꼼 하는 느낌으로 가운데로 밀어 넣으면 현재 시간, 배터리 및 연결 상태를 볼 수 있으며 이 상태에서 완전히 밀어 넣으면 홈 화면으로 앱이 축소된다. 축소된 앱은 여전히 실행 중인 상태이며, 일부 앱은 축소된 상태에서도 정보를 표시하는 등 위젯으로 활동하거나 축소된 화면을 왼쪽이나 오른쪽으로 미는 식으로 제어할 수 있다. 가령 음악 앱의 경우 축소된 상태에서 음악 앱 커버를 오른쪽으로 밀면 일시 정지, 왼쪽으로 밀면 다음 곡 재생을 수행할 수 있다. 앱마다 축소된 상태에서의 기능이 다르고, 지원하지 않는 앱도 있다.

모든 알림을 보려면 대기 상태에서 아래에서 위로 밀어 올리면 되며, 그 아래에는 페이스북 및 트위터 이벤트 피드가 있다. 그런데 이게 또 웃긴 게, 페이스북의 경우 알림 수신 및 페이스북 메신저를 메시징 앱에서 사용할 수는 있지만 정작 페이스북 뉴스 피드를 볼 수 있는 네이티브 앱이 없다. 글을 보려고 하면 페이스북 모바일 페이지로 연결시킨다. 트위터도 상황이 크게 차이가 나지 않는 게, 최근 10개까지의 트윗은 네이티브 앱으로 볼 수 있지만 더 많은 글을 보려면 모바일 트위터 페이지로 가야 한다. 막상 이 상황이 되었을 때 가장 불편한 건 컨텍스트의 실종이다. 가령 한 글에 달린 댓글을 보다가 원래 글로 돌아가려고 하면 페이지 맨 위로 가 있어서 원래 읽던 글이 어디에 있는지를 놓쳐 버리게 되는데, 네이티브 앱은 이 점에서 더 자유롭지만 모바일 웹은 컨텍스트 관리가 제대로 되지 않는다. 특히 타임라인 속도가 더 빠르다면 치명적인 문제가 될 수도 있다.

Jolla 알림 화면

Jolla 알림 화면

스토어에는 앱이 정말 없다. 아직까지 Sailfish OS 자체도 베타 상태이기 때문에 이 점은 감수하고 구입해야 한다. 내가 가장 자주 사용하는 Google 2단계 인증 앱과 팟캐스트 앱은 어쨌든 네이티브로 ‘돌아는 간다’. Google OTP 앱은 쓸만한 상태이며, 팟캐스트 앱 gPodder는 아직 알파 상태라서 들을 수 있는 것 이상을 바라기는 미안한 상태이다. 손전등이나 날씨 앱 정도는 뭐 있는 게 다행이라고 해야 하나. 한국에서 고자인 노키아 Here 지도를 대체할 지도 앱도 있긴 있다. 이런 걸 제외한 앱들은 게임 포함 현재 손에 꼽을 수 있을 정도로 안습한 상태라서, 그 대체재로 일단 안드로이드 앱을 쓰고 있어야 한다.

Jolla에 깔아 둔 앱

Jolla에 깔아 둔 앱

안드로이드 앱은 Alien Dalvik 기반으로 구동되며, N9에서 Sailfish를 구동시킨 사람들의 경험담에 의하면 N9에 Alien Dalvik을 단순히 복사한다고 해서 이식할 수 있는 것이 아니다. Jolla를 이루고 있는 커널 자체가 이미 안드로이드의 기능을 일부분 포함하고 있으며, lsmod 결과 mysatroker라는 모듈이 Alien Dalvik 구동에 필요했다. N9에서 도는 Sailfish는 커널에 안드로이드용 추가 기능이 없기 때문에 Alien Dalvik이 제대로 구동되지 않는다. 직접 받아서 설치한 APK는 카카오톡, 앵그리 버드, 코레일톡(메신저도 아닌 주제에 톡이라는 이름을 붙이는 코레일은 각성하라) 정도가 있다. 뒤에도 말할 MMS 수신 불가 문제를 olleh 메시지통이나 joyn으로 극복해 보려고 하였으나 USIM 정보를 읽을 수 없다는 말과 함께 종료되었다. 쩝. 안드로이드 앱의 실행 과정은 “가상 안드로이드 앱” 안에 안드로이드 소프트 키가 표시되고 그 안에서 앱이 전환되는 형태이다. 그래서 하나 이상의 안드로이드 앱을 실행시켰다고 해도 실제로는 1개의 앱만이 실행된 것처럼 보인다. 구글 플레이 서비스가 없다는 점과 안드로이드 앱이 네이티브가 아니라는 점 때문에 애플리케이션의 일부 기능이 정상적으로 작동하지 않을 수도 있다. 특히 카톡의 경우 아이템을 구매하려고 하면 지원하지 않는 장치라는 오류를 낸다.

마에모의 전통인 쉬운 루팅은 세일피시까지 내려온다. 설정에서 개발자 모드를 켜 주면 루트 계정이 활성화된다. 끝. 이와 함께 터미널도 같이 설치되어서 욕구 불만을 충족시켜 준다. 터미널에는 입력기가 붙지 않기 때문에 터미널만으로 한글을 입력하려면 주의해야 한다. 컴퓨터에 연결하면 충전 전용, 개발자 모드, MTP 모드 중 선택할 수 있다. 기본적으로 파일 전송은 MTP를 사용하며 (아직 외장 메모리에는 접근 불가능) 개발자 모드를 선택하면 Jolla가 가상 네트워크 장치로 인식된다. 이 작업이 끝나고 Sailfish OS SDK를 설치해 주면 Jolla를 개발 장비로 인식해서 사용할 수 있다. Sailfish OS SDK는 Qt Creator를 기반으로 하며, 크로스 컴파일을 위한 빌드 엔진은 VirtualBox 기반 가상 머신 하에서 작동한다. 과거의 마에모 SDK는 호스트 PC에 직접 scratchbox와 환경을 설치하였지만, Sailfish OS는 SDK 버전 관리의 용이성 때문에 이러한 가상 머신 기반의 빌드 엔진을 채택하였다. Sailfish OS 에뮬레이터 역시 VirtualBox 위에서 돌아간다. 새 장치를 추가할 때 개발자 모드에서 생성해 준 암호만 지정해 주면 ssh 키가 생성 및 복사되어 앱을 설치할 때마다 암호를 입력하지 않아도 되게 해 준다. Qt Creator와 QML의 조합으로 앱을 빠르게 개발할 수 있으며, 기존 마에모와는 다르게 RPM 패키지 관리자를 사용한다. 따라서 deb 파일로 앱을 설치했던 과거와는 다르게 이제는 rpm 파일로 앱을 설치하여야 하고, 빌드 엔진 역시 rpm 파일을 생성한다. Qt Creator를 사용해서 rpm 파일을 만들거나, 가상 머신 하의 빌드 엔진에 연결하여 rpm 파일을 생성할 수 있다.

한국에 당분간 출시될 가능성이 없는 장치다 보니 한국어 UI 번역 및 한글 입력은 지원되지 않는다. 기본적으로 한글을 볼 수는 있지만, 입력기는 내가 직접 짰다. GitHub에 소스까지 올려 두었으니 가져가면 된다. 이 입력기를 업로드해 놓고 공개를 하지 않고 있던 동안 또 다른 사람이 한글 입력기를 개발 및 OpenRepos에 업로드해 버리는 바람에 원래 짜고 있었던 한글 입력기에 기능을 좀 더 보강한 후 업로드하기로 결정하였다. 공식적으로 Sailfish OS에 서드파티 입력기를 추가할 수 있는 API가 공개되지 않았기 때문에 입력기를 사용하다가 좀 삐그덕댈 수도 있다. 한글 글꼴은 Droid Sans Fallback에 들어 있는 멋 없는 글꼴이다. 이게 좀 엉뚱한 곳에서 문제가 되는 게, 펌웨어 1.0.3.8 업데이트 이후 한글 연락처가 주소록에서 초성 기준으로 정렬되기 시작했다. 인덱스 부분이 첫가끝 코드 글자로 되어 있는데 이들 글꼴에는 첫가끝 한글 낱자가 포함되어 있지 않아서 피플이나 전화 앱에서 한글 초성 부분이 깨지는 사태가 발생한다. 해결책은 나눔 고딕을 비롯한 나눔 글꼴을 집어넣어 주는 게 지금 시점에서는 최선이라고 보고 있고, 이 문제를 일단 제기는 해 둔 상태이다. Sailfish에도 나눔 고딕이 진출하기를 바라며.

이런저런 작업을 마치고 그럭저럭 매일 쓰는 휴대폰으로 쓸 수는 있게 되었지만, 아직까지 Sailfish OS는 베타 딱지를 떼지 못했기 때문에 아직도 삐그덕대는 부분이 많이 존재하는 편이다. 가장 치명적인 문제로 MMS를 받지 못한다. N9는 MMS를 네이티브로 지원하지만 Jolla는 이 면에 있어서는 퇴보했다. 아직까지 언제 지원할 지 알 수 없기 때문에 MMS 지원이 꼭 필요하다면 잠시 유보하는 것도 좋다. 그리고 Wi-Fi가 상당히 불안정하다. N9 및 다른 휴대폰에서도 멀쩡히 붙어 있는 Wi-Fi가 가출하는 경우가 하루에 한 번은 발생한다. WPA-엔터프라이즈 무선 네트워크를 UI 상에서는 연결할 수 없지만 직접 설정 파일을 만들어서 연결할 수는 있다. EAP-SIM도 아직 지원되지 않아서 통신사 Wi-Fi를 직접 사용할 수는 없다. 어떤 조건에서 문제가 되는지는 모르겠지만, WPA-Personal 네트워크에 때때로 연결을 거부하기도 한다. 랩 무선 공유기와 LG U+ LTE 라우터에서 하필 이 문제가 터져 버려서, 직접 설정 파일을 만들어서 암호 키를 수동으로 입력해 주니 연결하는 것을 확인할 수 있었다. 적어도 이 두 가지는 안정화에 상당한 시간이 걸릴 것 같으므로, 바로 이 점 때문에 Jolla 구입을 선뜻 추천해 주기는 망설여진다. 적어도 Wi-Fi가 좀 안정화된 후에 사는 것을 추천한다.

OS의 삐그덕대는 면 때문에 매일 쓰다 보면서도 새로운 발견을 하게 해 주지만, Jolla는 여전히 멋진 폰이라는 사실은 변함이 없다. 단, Sailfish OS가 베타 딱지 떼기 전 까지만. 지금 발생하고 있는 문제점들이 베타를 거치면서 해결되기를 바라고, 베타 딱지를 뗄 때 쯤에는 LTE 지원도 편법 없이 정상적으로 되고 소프트웨어도 전체적으로 안정적으로 구동되어야 기대를 충족시켜 줄 것이다. 만약 베타를 벗어난 후에도 계속 폰이 삐그덕댄다면 그 때는 Jolla에 대한 지지를 다시 생각해 보아야 할 것 같다.