본문 바로가기

글로벌 네트워크

안드로이드 4.4 킷캣 에뮬레이터에서 한글 출력하기

서른여섯 번째 이야기: 안드로이드 4.4 킷캣 에뮬레이터에서 한글 출력하기

작성일: 2013년 11월 12일

작성자: 배장열


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

1부 시작하는 말


우선, 안드로이드 에뮬레이터 즉, avd에 관해 말씀드리겠습니다. avd가 실행될 때 화면에 표시되는 글꼴은 다음과 같이 몇 가지로 나누어 생각할 수 있습니다.


  • DroidSans.ttf - 기본 영문 글꼴
  • DroidSans-Bold.ttf - 영문 볼드용 글꼴
  • DroidSansFallback.ttf - 영문으로 표시하지 못하는 나머지 언어용 글꼴


여기서 주목해야 할 글꼴이 DroidSansFallback.ttf입니다. 이 글꼴은 안드로이드가 기본적인 영문 글꼴로 표현되지 못할 때 대신 사용됩니다. 한글은 바로 DroidSansFallback.ttf에 내장되어 있는데, 안드로이드 4.2.2부터 이 글꼴에 버그가 있는 것 같습니다. 그 결과 ,안드로이드 4.2.2와 4.3, 그리고 4.4에서는 한글을 표현해야 할 때 DroidSansFallback.ttf가 올바로 로드되지 않아 한글 표현에 문제가 있는 것으로 보입니다.


그러니까 안드로이드 4.2.2부터 에뮬레이터에서 DroidSansFallback.ttf를 로드할 때 어떤 버그로 인해 한글 글꼴이 올바로 로드되지 않은 것입니다. 웃긴 것은 물리적인 단말기를 이클립스에 직접 연결하면 단말기에서 한글이 올바로 표현된다는 점입니다.


어찌 됐든 알 수 없는 버그 때문에 중국어나 일본어는 올바로 표현되는데, 공교롭게도 한글만 찬밥 신세가 되었습니다. 안드로이드에 한글 글꼴이 없어서 지금과 같은 문제가 생긴 것으로 생각하기도 하는데, 안드로이드 에뮬레이터 이미지 파일에서 DroidSansFallback.ttf를 버전별로 추출하여 일일이 확인해 본 결과 한글 글꼴이 없는 것은 아니었습니다.


자, 그럼 해결 방법을 알아볼까요? 두 가지 방법으로 우리의 아름다운 한글을 에뮬레이터에서 제대로 표현할 수 있습니다.


* 첫 번째: DroidSansFallback.ttf를 올바로 동작했던 이전 버전(안드로이드 4.1.2)의 DroidSansFallback.ttf로 교체하는 방법

* 두 번째: 적당한 한글 글꼴을 지접 추가하는 방법


첫 번째 방법을 사용하면 안드로이드 4.1.2의 한글 글꼴을 사용해야 하는 단점(?)이 있습니다. 안드로이드 4.2.2부터 한글 글꼴이 나눔고딕으로 바뀌었기 때문입니다.


에뮬레이터에서 필요한 글꼴이 없을 때 마지막으로 사용되는 글꼴이 DroidSansFallback.ttf이므로 두 번째 방법에서는 적당한 한글 글꼴을 추가하면 굳이 버그가 있는 DroidSansFallback.ttf를 사용하지 않아도 됩니다. 다만, 안드로이드 4.2.2부터 기본 한글 글꼴이 네이버의 나눔고딕체로 변경되었고, 에뮬레이터에는 글꼴을 선택할 수 있는 기능이 지원되지 않기 때문에 추가하려는 한글 글꼴의 이름을 NanumGothic.ttf와 NanumGothic_Bold.ttf로 변경해야 합니다.


그런 이유로 여기서는 네이버의 나눔바른고딕체가 훨씬 보기 좋아 나눔바른고딕의 이름을 나눔고딕으로 바꿔 에뮬레이터에 추가하겠습니다.


이제 작업 환경에 관해 소개하겠습니다. 가장 편하게 작업할 수 있는 환경은 리눅스입니다. 작업 완료 시간이 20여 분도 채 걸리지 않습니다. 리눅스 환경에서 안드로이드 앱을 개발하는 프로그래머라면 대단히 간편하게 전체 과정을 진행할 수 있습니다. 필요한 것도 에뮬레이터의 시스템 이미지(sdk/system-images/android-19/armeabi-v7a/system.img) 뿐입니다. 리눅스 환경에서 진행하는 과정은 이 글 말미에 말씀드리겠습니다.


리눅스를 사용하지 않는 사용자, 즉 OS X이나 Windows를 사용하는 경우에는 시간이 많이 걸립니다. 에뮬레이터의 시스템 이미지도 필요하지만 이클립스의 DDMS도 사용해야 합니다. 그리고 OS X에서는 터미널, Windows에서는 명령 프롬프트를 사용해야 합니다. 이 글에서는 Windows 환경부터 먼저 말씀드리고, 뒤이어 OS X 환경을 다루겠습니다.


필요한 것들

* adt 최신 버전(안드로이드 sdk 4.4 킷캣) 32비트 또는 64비트(http://developer.android.com/sdk/index.html)

* 나눔바른고딕체(http://hangeul.naver.com)

* 인내심과 약간은 세심한 주의력


이제 본격적으로 시작해 볼까요?


2부 첫 번째 _ Windows에서


0. 우선, 에뮬레이터의 시스템 이미지(sdk\system-images\android-19\armeabi-v7a\system.img)를 적당한 곳으로 복사합니다. 바탕 화면에 복사하면 작업하기 편합니다. 복사된 이미지 파일의 이름을 system-ori.img로 변경합니다.


1. 이클립스에서 안드로이드 킷캣용으로 에뮬레이터를 새로 만듭니다. 이때, SD Card의 용량을 2048MB 또는 1536MB로 지정합니다(그림 36-1).


그림 36-1


2. 에뮬레이터의 부팅이 완료되면, 이클립스에서 DDMS를 실행합니다(그림 36-2).

그림 36-2


DDMS에서 그림 36-3처럼 File Explorer를 클릭하고, storage의 sdcard를 클릭합니다.


그림 36-3


그림 36-4


그림 36-4처럼 Push a file onto the device 아이콘을 클릭하여 system-ori.img를 에뮬레이터의 storage/sdcard에 복사합니다. 여기까지 진행한 화면이 그림 36-5입니다.


그림 36-5


여기서 잠깐! 

복사가 완료되기 까지 오랜 시간이 걸립니다. 저는 OS X에서 패러렐즈로 Windows 7 가상 머신을 사용하기 때문에 시간이 더 걸리는 듯합니다. 이미지 파일이 복사되려면 1시간은 족히 걸립니다. 그리고 안드로이드는 리눅스의 일종입니다. 그리고 Windows에서 디렉터리를 구별하는 데는 \ 문자를 사용하지만, 리눅스나 맥에서는 /를 사용합니다. 이 점 주의하셔야 합니다.


3. 이미지 파일의 복사가 완료되면 Windows에서 명령 프롬프트를 실행합니다. 디렉터리를 그림 36-6처럼 변경합니다. 저는 adt를 C:\에 설치했습니다. 각 상황에 맞게 올바른 디렉터리로 이동하셔야 합니다.


그림 36-6


우리가 사용할 유틸리티는 그림에 나타나 있듯이 adb.exe입니다.


4. adb를 다음처럼 입력하여 실행합니다. 이제부터는 Windows가 아니라 리눅스입니다. 잊지 마세요.

   adb shell


5. adb의 쉘로 들어오면 프롬프트의 모양이 달라집니다. 여기서 SD Card로 이동해야 합니다. 다음처럼 입력합니다(그림 36-7).


   cd storage/sdcard


그림 36-7


6. 이제 디렉터리를 하나 새로 만들고 여기에 system-ori.img를 마운트합니다(그림 36-8).


   mkdir qqq

   mount -t ext4 -o loop system-ori.img qqq/


그림 36-8


7. 이제 DDMS로 돌아가 결과를 확인하고 한글 글꼴을 올바른 위치에 복사합니다(그림 36-9). storage/sdcard 아래에 qqq 디렉터리가 만들어졌고, 이 qqq에 system-ori.img가 올바로 마운트되었습니다. 그림 36-9처럼 fonts 디렉터리를 선택한 뒤, Push a file onto the device 아이콘을 클릭하여 한글 글꼴을 복사합니다.


그림 36-9


여기서 잠깐!

앞에서도 말씀드린 것처럼 미리 나눔바른고딕체의 이름을 각각 NanumGothic.ttf와 NanumGothic_Bold.ttf로 변경했습니다. 안드로이드 4.2.2부터 기본 한글 글꼴이 나눔고딕으로 변경된 데다, 안드로이드 에뮬레이터에서는 글꼴을 변경하는 기능이 지원되지 않기 때문에 추가할 글꼴의 이름은 NanumGothic.ttf와 NanumGothic_Bold.ttf이어야 합니다. 그리고 에뮬레이터에 파일을 추가할 때는 한 번에 하나만 복사할 수 있습니다.


8. 여기까지 진행된 화면이 그림 36-10입니다. 그런데 가만히 들여다보니 추가된 글꼴들의 권한이 좀 이상하죠?


그림 36-10


다른 글꼴과 같은 권한으로 변경하겠습니다. 우선, 명령 프롬프트에서 해당 디렉터리로 이동합니다.


   cd qqq/fonts

   chmod 644 NanumGothic.ttf

   chmod 644 NanumGothic_Bold.ttf


9. 결과 화면은 그림 36-11입니다. 변경된 권한을 확인할 수 있죠?


그림 36-11


10. 자, 이제 막바지에 다다랐습니다. 원하는 글꼴을 추가했으니 마운트했던 system-ori.img를 언마운트할 차례입니다. 명령 프롬프트에서 상위 디렉터리로 이동한 뒤, system-ori.img를 언마운트합니다(그림 36-12).


   cd ../..

   umount qqq/


그림 36-12


11. 그림 36-12를 보면 system-ori.img의 시간이 바뀐 것을 알 수 있습니다. 이 파일을 다시 Windows로 추출하겠습니다. 일단, 명령 프롬프트에서 exit를 입력하여 adb 쉘을 종료합니다(그림 36-13). 명령 프롬프트도 닫습니다.


그림 36-13


DDMS에서 Pull a file from the device 아이콘을 클릭하여 system-ori.img 파일을 Windows로 복사합니다(그림 36-14).


그림 36-14


여기서 잠깐!

에뮬레이터에 파일을 넣을 때처럼 빼내올 때도 많은 시간이 걸립니다. 느긋하게 차 한 잔을 즐기시는 것도 좋을 듯...


12. 이제 마무리 정리 시간입니다. 에뮬레이터를 종료합니다. DDMS에서 Windows로 복사된 system-ori.img 파일의 이름을 system.img로 변경한 뒤, 원래 있던 자리인 sdk\system-images\android-19\armeabi-v7a에 복사합니다. 이클립스에서 에뮬레이터를 새로 하나 만듭니다. 기존 에뮬레이터는 나중을 위해 잠시 그대로 둡니다(그림 36-15). SD Card의 용량을 적당하게 지정합니다.


그림 36-15


13. 제가 미리 준비해 둔 안드로이드 앱을 실행하여 한글이 올바로 표시되는지 확인하겠습니다. 언어 설정이 영어일 때는 "Hello world!"를, 한국어일 때는 "안녕하세요? 제가 보이시나요? 한글은 참 아름답죠?"를 출력하는 앱입니다. 우선, 언어 설정이 영어일 때 화면을 볼까요? 그림 36-16입니다.


그림 36-16


이제 언어 설정 옵션으로 이동합니다. 그림 36-17처럼 "한국어"가 보입니다. 참 반갑죠?


그림 36-17


다시 앱을 실행하면 한글이 올바로 출력됩니다(그림 36-18).


그림 36-18


이제 아까 만들었던 에뮬레이터(qq-sample)는 필요 없겠네요. 과감히 삭제~


부연 설명, 하나

DroidSansFallback.ttf 파일 기억하시죠? 나눔 글꼴을 추가하지 않고 DroidSansFallback.ttf 파일을 교체해도 한글은 올바로 표현됩니다. 다만, 안드로이드 4.1.2에 내장된 DroidSansFallback.ttf가 올바로 동작하는 파일이니 먼저 해당 파일을 구하셔야 합니다. 이클립스에서 안드로이드 SDK 4.1.2를 다운로드하고, 4.1.2용 에뮬레이터를 만든 뒤, DDMS에서 DroidSansFallback.ttf를 Windows로 복사하면 됩니다. 앞서 설명드린 과정대로 하되 상황에 맞게 약간씩 수정하여 진행하면 아무런 문제가 없을 것입니다.


부연 설명, 둘

안드로이드 4.1.2에 내장된 DroidSansFallback.ttf의 크기는 약 4.5MB이고 4.2.2부터 제공되는 DroidSansFallback.ttf의 크기는 약 5.4MB입니다. 내장된 한글 글꼴이 바뀌었다고 앞에서 말씀드렸죠?


부연 설명, 셋

항상 원본은 백업하시고 진행하세요. 어떤 이유로든 문제가 발생하면 되돌리기가 한결 편해집니다.


부연 설명, 넷

안드로이드 4.3이나 4.2.2에서는 어떻게 해야 할까요? 제이펍 블로그에 올렸던 "안드로이드 젤리 빈 4.3 에뮬레이터에서 한글 출력하기"를 참고하시면 될 듯합니다. 다만, 나중을 위해서라도 한 가지 말씀드릴 것이 있습니다. 킷캣의 ARM 에뮬레이터에 사용되는 이미지 파일인 system.img에는 ext4라는 파일시스템이 적용되었습니다. 젤리빈까지는 yaffs2라는 파일시스템이 적용되었고요. 그런데 이전 글 본문에서 언급한 Windows용 yaffey 유틸리티는 ext4를 지원하지 않습니다. 아래 그림 36-19를 한번 볼까요? 아래 그림은 4.4 킷캣용 에뮬레이터를 시작한 뒤, adb shell을 실행하여 에뮬레이터 안으로 들어와


그림 36-19


마운트된 장치를 출력한 결과입니다. /system은 ext4로 마운트되었음을 알 수 있습니다. 4.3 젤리빈에서는 어떤 결과가 나올까요? 아래 그림 36-20을 확인해 보겠습니다.


그림 36-20


그림에서 알 수 있듯, 적용된 파일시스템은 yaffs2입니다. Windows용 yaffey 유틸리티가 이 파일시스템을 지원하기 때문에 지난번처럼 작업할 수 있었습니다. 그럼 이번 글에서처럼 작업할 수는 없을까요? 할 수 있습니다. 전체 과정을 그대로 따라 하되, adb 쉘에서 마운트하는 명령만 다음과 같이 수정하면 됩니다.


   mount -t yaffs2 -o loop system-ori.img qqq/


이제 두 번째 환경인 OS X을 살펴보겠습니다.



2부 두 번째 _ OS X에서


0. 전체 과정은 Windows에서와 같습니다. 다만, OS X의 디렉터리 구조가 Windows와 다르니, 이 점만 주의하면 됩니다. OS X에서는 명령 프롬프트 대신 터미널을 사용해야 하므로, 이와 관련된 부분만 언급하겠습니다.


1. adb 쉘 실행 방법. 터미널에서는 dab shell 대신 ./adb shell을 입력해야 합니다. 또한, 리눅스에서와 마찬가지로 디렉터리 구분 기호는 \가 아니라 /입니다.


2. 나머지는 Windows에서와 동일한 과정대로 진행하면 됩니다.


마지막으로 세 번째 환경인 리눅스입니다.



2부 세 번째 _ 리눅스에서


0. 리눅스에서는 이클립스나 DDMS를 사용할 까닭이 없습니다. 단지 system.img 파일을 어떤 디렉터리에 마운트한 뒤 한글 글꼴을 추가하고, system.img를 언마운트하면 됩니다.


1. 저는 홈 디렉터리 아래의 Downloads에서 작업할 것입니다. 우선 이곳에 필요한 파일들을 복사합니다. NanumGothic.ttf와 NanumGothic_Bold.ttf, 그리고 system-ori.img 파일이 필요합니다.


2. ~/Downloads에서 다음을 진행합니다.


   ~$ cd Downloads

   ~/Downloads$ mkdir qqq

   ~/Downloads$ sudo mount -t ext4 -o loop system-ori.img qqq/

   ~/Downloads$ cd qqq/fonts

   ~/Downloads/qqq/fonts$ sudo cp ../../NanumGothic.ttf .

   ~/Downloads/qqq/fonts$ sudo cp ../../NanumGothic_Bold.ttf .

   ~/Downloads/qqq/fonts$ sudo chmod 644 NanumGothic.ttf

   ~/Downloads/qqq/fonts$ sudo chmod 644 NanumGothic_Bold.ttf

   ~/Downloads/qqq/fonts$ cd ../..

   ~/Downloads$ sudo umount qqq/


3. 이제 system-ori.img 파일의 이름을 system.img로 변경한 뒤, 원래 있던 자리인 sdk/system-images/android-19/armeabi-v7a에 복사해 넣습니다.


4. 에뮬레이터를 새로 하나 만들어 한글이 올바로 표현되는지 확인합니다.


부연 설명, 하나

리눅스에서는 대단히 쉽게 작업할 수 있습니다. 리눅스가 사용하는 파일시스템이 바로 ext4이기 때문입니다. 안드로이드의 ARM 에뮬레이터 또한 리눅스이기 때문에, 에뮬레이터를 생성할 때 SD Card의 용량을 늘려 그 안에서 작업한 것입니다.



끝내는 말

어찌 보면 쉬운 길을 멀리 돌아왔는지도 모르겠습니다. 아무쪼록 여러분에게 조금이라도 도움이 되었으면 하는 마음입니다. 긴 글 읽어 주셔서 정말 고맙습니다.

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