Android 프로그래밍을 하다 C코드를 Java코드와 연동해야하는 일이 생겼습니다.
Android NDK를 이용해 빌드하다보니 ant를 사용하여 안드로이드 프로그램을 빌드하였습니다.
Linux에서 빌드할때와 Mac OSX에서 빌드할때 미묘한 차이가 생기더군요.
Java로 된 안드로이드 소스코드는 UTF-8로 분명히 저장되어 있는데, Ant가 Linux에서 돌릴때엔 ascii로 인식해서 컴파일을 하더군요. 결국엔 안드로이드 어플에 한글이 깨져 나오는 문제가 있습니다.
Mac에서는 아무런 문제없이 빌드되고 안드로이더 어플에 한글이 깨져나오는 일이 없습니다. 참 미묘하기도 하지요?
참고로 CentOS5에 설치한 Ant 버전은 아래와 같습니다.
[studioego@localhost ~]$ ant -version
Apache Ant version 1.7.1 compiled on June 27 2008
[studioego@localhost ~]$
그리고 Mac OSX 10.6에 설치된 Ant버전은 아래와 같다.
Dae-Hyun-Sung-ui-MacBook-Pro:~ studioego$ ant -version
Apache Ant version 1.8.1 compiled on September 21 2010
Dae-Hyun-Sung-ui-MacBook-Pro:~ studioego$
CentOS5 에서 Ant를 실행했을때
$ ant debug
Buildfile: build.xml
[setup] Android SDK Tools Revision 8
[setup] Project Target: Android 2.2
[setup] API level: 8
[setup]
[setup] ------------------
[setup] Resolving library dependencies:
[setup] No library dependencies.
[setup]
[setup] ------------------
[setup]
[setup]
[setup] Importing rules file: tools/ant/main_rules.xml
-debug-obfuscation-check:
-set-debug-mode:
-compile-tested-if-test:
-dirs:
[echo] Creating output directories if needed...
[mkdir] Created dir: /******/bin/classes
-pre-build:
-resource-src:
[echo] Generating R.java / Manifest.java from the resources...
[null] /home/studioego/android/platform-tools/aapt: /usr/lib/libz.so.1: no version information available (required by /home/studioego/android/platform-tools/aapt)
-aidl:
[echo] Compiling aidl files into Java classes...
-pre-compile:
compile:
[javac] Compiling 5 source files to /******/bin/classes
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
[javac] /******/src/org/ccl/mobile/student/AnnoLine.java:4: warning: unmappable character for encoding ascii
[javac] // 시작점 좌표
[javac] ^
(생략)
[javac] 100 warnings
(생략)
이후 소스코드는 UTF-8로 분명히 저장했는데도 안드로이드 어플에서 글씨가 깨져 나옵니다.
Mac OSX 10.6 Snow Leopard 에 탑재된 Ant를 실행했을때
$ ant debug
Buildfile: /******/build.xml
[setup] Android SDK Tools Revision 10
[setup] Project Target: Android 2.2
[setup] API level: 8
[setup]
[setup] ------------------
[setup] Resolving library dependencies:
[setup] No library dependencies.
[setup]
[setup] ------------------
[setup]
[setup]
[setup] Importing rules file: tools/ant/main_rules.xml
-debug-obfuscation-check:
-set-debug-mode:
-compile-tested-if-test:
-pre-build:
-dirs:
[echo] Creating output directories if needed...
-aidl:
[echo] Compiling aidl files into Java classes...
-renderscript:
[echo] Compiling RenderScript files into Java classes and RenderScript bytecode...
-resource-src:
[echo] Generating R.java / Manifest.java from the resources...
-pre-compile:
...
(생략)
BUILD SUCCESSFUL
Total time: 10 seconds
$
소스코드도 UTF-8로 저장되었고 안드로이드 어플에서 한글이 깨지는 일이 없이 문제 없이 돌아갑니다.
ant의 버전 차이때문에 그런건가요?
이 문제 때문에 Linux용 최신 ant binary 버전을 다운 받아서 사용했어도 똑같은 일이 발생하더군요.
버전문제는 아는 것 같고.. Linux용 ant를 직접 빌드해서 사용해야 문제가 해결될까요?
한글이 깨지는 문제때문에 구글링 한 결과 android-sdk폴더안의 파일을 수정해야되더군요
android-sdk디렉토리 안에 있는 tools/ant/main_rules.xml 을 열고 나서
<property name="java.encoding" value="ascii" /> 부분을 찾습니다.
120 <!-- compilation options -->
121 <property name="java.encoding" value="ascii" />
122 <property name="java.target" value="1.5" />
123 <property name="java.source" value="1.5" />
이후 ascii를 UTF-8로 수정후 저장합니다.
<property name="java.encoding" value="UTF-8" />
이후에 다시 ant로 안드로이드 어플 컴파일 하면 한글이 깨지는 문제가 사라집니다.
참조: android: getting rid of “warning: unmappable character for encoding ascii”
(역시 구글링하면 모든 문제가 대부분 해결 되더군요 ㅎㅎ)
참고로 Mac OSX에선 기본적으로 UTF-8로 설정되어서 위와 같이 한글이 깨지는 문제가 없더군요.
아래는 맥의 ant 설정파일의 내용입니다.
/Users/studioego/android-sdk-mac_86/tools/ant/main_rules.xml
124 <!-- compilation options -->
125 <property name="java.encoding" value="UTF-8" />
126 <property name="java.target" value="1.5" />
127 <property name="java.source" value="1.5" />