Microsoft MVP성태의 닷넷 이야기
Java: 14. 안드로이드 - Hello World 실습 [링크 복사], [링크+제목 복사],
조회: 31701
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 
(연관된 글이 1개 있습니다.)

안드로이드 - Hello World 실습

이기종 환경을 이해하기 위해 ^^ iPhone/Mac에 이어 안드로이드까지 해봤습니다.

Objective-C의 대안 - Xamarin의 Mono를 이용한 C# iOS 개발 환경
; https://www.sysnet.pe.kr/2/0/1363

안드로이드는 사실 자바 문법을 약간 알고 있다보니 초기 거부감이 iOS에 비해서는 덜했습니다. 그런데 후반부 거부감이 무시 못 할 수준이군요. ^^;

암튼, 우선 개발 환경 먼저 구성해 보았습니다.

안드로이드애플리케이션개발환경구축하기1 
; http://sharepoint.egloos.com/2962243

안드로이드애플리케이션개발환경구축하기2 
; http://sharepoint.egloos.com/2962245

위의 글을 읽고 잘 따라해 보았습니다.

우선 JDK 설치 먼저! JDK 1.7 x64 버전으로 다음의 폴더에 설치했습니다. (이상하군요. JDK 안에 JRE가 포함되어 있는데도 JDK와 JRE 2곳의 설치 경로를 묻습니다.)

Windows x64 90.03 MB    jdk-7u9-windows-x64.exe  (1.7.0.9 버전)

JDK 설치: D:\android\jdk7u9
JRE 설치: D:\android\jre7u9

그다음 이클립스 설치입니다. 역시 x64 버전으로 했고 "Eclipse IDE for Java EE Developers, Windows 64 Bit" 항목을 다운로드해 설치했습니다. Visual Studio와는 달리 이클립스는 eclipse.exe가 사용될 JRE VM 경로를 지정할 수 있습니다. "-vm" 옵션으로 지정하면 되는데 매번 명령행에서 입력할 수 없으니 탐색기에서 eclipse.exe에 대한 "단축 아이콘"을 만들어서 명령행에 지정해 주면 됩니다.

D:\android\eclipse\juno64\eclipse.exe -vm "D:\android\jdk7u9\jre\bin\javaw.exe"

또한, Visual Studio의 Solution 개념에 해당하는 것으로 "workspace"라는 것이 있는데요. 자바 개발은 대부분 workspace를 한번 정하면 잘 안 바꾸기 때문에 아예 이클립스 시작부터 workspace를 지정해서 쓰는 경우가 많습니다. 이를 위해 "-data" 옵션을 지정하면 되는데, 따라서 제 단축 아이콘 하나는 다음과 같이 정해져 있습니다.

D:\android\eclipse\juno64\eclipse.exe -data "D:\android\workspace" -vm "D:\android\jdk7u9\jre\bin\javaw.exe"

이제 ADT(Android Developer Tools)를 다운로드하는데요. 이클립스의 "Help" / "Install New Software..." 메뉴를 선택하고 "Add" 버튼을 누른 후 다음의 배포 경로를 추가시킵니다.

Name: AndroidDev
Location: https://dl-ssl.google.com/android/eclipse/

확인하면, 목록에 "Developer Tools"와 "NDK Plugins"가 나오는데 전부 선택하고 진행, 중간에 서명되지 않은 소프트웨어 설치에 대한 경고가 나오지만 무시하고 OK 버튼을 눌러 넘어갑니다. 완료 후 이클립스를 재실행하면 경고창 하나가 다시 발생하는 데, Android SDK 경로를 지정해야 한다고 합니다. 경고창은 무시하고 "Welcome to Android Development" 창에서 "Target Location"에 SDK 경로를 지정해 주면 된다. 제 경우에는 D:\android\sdk로 지정했는데 설치가 완료되면 약 500MB의 공간이 점유됩니다.

잘 설치되었는지 확인하기 위해 이클립스의 "Window" 메뉴에 "Android SDK Manager"와 "Android Virtual Device Manager" 메뉴가 있는지 봅니다. 만약 없다면 이클립스의 "Help" / "Check for updates..." 메뉴를 선택해서 업데이트를 해보면 나올 수도 있습니다. (제 경우에 IDE 항목이 하나 있었는데, 업데이트 후 그제서야 Android 메뉴가 나왔습니다.)

일단 제가 참고한 블로그 글에서는 여기까지만 알 수 있고 그다음이 없군요. ^^ 아니... 하다 못해 Hello World 예제라도 나와야 하는 거 아닌가요? ^^




그래서, 그다음부터는 다음의 글을 참고해서 간단한 앱을 만들어 보았습니다.

안드로이드 튜토리얼 1 - Hello World
; http://devsw.tistory.com/44

위의 글을 보니, 우선 AVD(Android Virtual Machine)을 만들어야 하는군요. 이클립스의 "Window" / "Android Virtual Device Manager" 메뉴를 선택하면 되는데, 여기서부터 안드로이드의 파편화가 느껴지기 시작합니다. 저는 일단 "Galaxy Nexus (4.65", 720 * 1280: xhdpi)"를 기본값으로 두고 하나 만들었습니다.

이제 이클립스에서 "File" / "New" / "Android Application Project"를 선택하고 "TestApp" 프로젝트를 기본 설정만으로 생성했는데, 오... ^^ 이렇게 프로젝트가 만들어졌습니다.

android_hello_world_1.png

휴~~~ 일단 모든 폴더와 파일을 이해하는 것은 나중으로 미뤄야겠군요. ^^

어쨌든, 그냥 생성한 프로젝트가 "Hello World" 예제이니 Run을 해보았습니다. 그런데, 다음과 같은 오류가 Console 창에 떨어지는군요.

[2012-11-20 19:25:16 - TestApp] Error in an XML file: aborting build.

이클립스 창의 activity_main.out.xml 파일에도 "No XML content. Please add a root view or layout to your document."라는 오류가 보입니다. 보니까, /res/layout 폴더에 이상한 일이 벌어졌습니다. 처음에는 activity_main.xml 파일 하나만 있었는데, "Run"을 할 때마다 activity_main.out.xml, activity_main.out.out.xml, activity_main.out.out.xml 이런 식으로 파일이 늘어갑니다. 그리고 그렇게 생성된 파일의 내용이 비어 있어서 저런 오류가 발생했던 것입니다. 모두 삭제하고 다시 빌드해서 Run을 해보았습니다. 다행히 이번에는 XML 오류는 발생하지 않는데, 금방 다음과 같은 오류가 나왔습니다.

[[시간 생략] - TestApp] Automatic Target Mode: launching new emulator with compatible AVD 'AVD_for_Galaxy_Nexus_by_Google'
[[시간 생략] - TestApp] Launching a new emulator with Virtual Device 'AVD_for_Galaxy_Nexus_by_Google'
[[시간 생략] - Emulator] PANIC: Could not open: C:\Users\TestKevin\.android/avd/AVD_for_Galaxy_Nexus_by_Google.ini

제 경우에 사용자 계정의 루트를 D 드라이브로 옮겨 놓았는데요. "Android Virtual Device Manager" 메뉴에서 생성한 가상 디바이스는 변경한 루트 경로를 반영해서 생성되었던 반면 이클립스의 실행 환경은 원래의 사용자 계정 루트에서 가상 디바이스 환경을 검색하고 있는 것입니다. 음... 어쨌든, 이 정도는 제가 고급 사용자이다 보니 쉽게 맞춰줄 수 있습니다. ^^

junction "C:\Users\TestKevin\.android"  "D:\Work\.android"

자... 이제 되었겠죠. ^^ 다시 한번 실행을 했는데, 이번에는 다음과 같은 오류가 발생했습니다.

[[시간 생략] - Emulator] emulator: WARNING: Requested RAM size of 1024MB is too large for your environment, and is reduced to 768MB.
[[시간 생략] - Emulator] Failed to allocate memory: 8
[[시간 생략] - Emulator] 
[[시간 생략] - Emulator] This application has requested the Runtime to terminate it in an unusual way.
[[시간 생략] - Emulator] Please contact the application's support team for more information.

처음엔 이클립스 실행 화면의 폭이 작아서 위의 메모리 오류가 보이지 않아 도대체 이유를 알 수 없었습니다. 할 수 없이 자바를 잘 아는 동료한테 물어봤는데 잠시 후에 메모리를 낮춰야 한다는 대답을 해주더군요. ^^; 아니, 8GB 메모리에 1GB 메모리를 못 잡아서 저런 오류가 발생하는군요. 음... 그래요. 그럴 수도 있습니다. 잦은 메모리 할당으로 파편화가 생기면 연속된 1GB 메모리를 할당할 수 없으니... (그렇다면 애당초 512MB 정도로 낮게 잡아야 하지 않았을까요? 8GB 개발 환경도 많다고 볼 수는 없을 텐데!) 그래서 "Android Virtual Device Manager"에서 해당 가상 디바이스의 메모리를 512MB로 낮춰 주었습니다.

이렇게 해주고 나서야 비로소 "Hello World" 실행에 성공을 했습니다. ^^ 그런데... 가상 디바이스의 실행 속도가,,, 휴,,, 한 세월이군요. 그렇게 느릴 수가 없습니다. ^^; 윈도우 폰 개발자들은 정말이지, 이에 비하면 축복받은 환경이라고 생각하면 됩니다.




그런데, 문제가 있습니다. activity_main.xml의 파일이 activity_main.out....xml으로 늘어나는 현상은 여전했습니다. 게다가 이클립스 툴바의 특정 아이콘 영역이 비정상적으로 심하게 깜박거리는 데 뭔가 CPU 작업이 심란하게 발생하는 것 같았습니다. 도저히 이 상태로는 개발할 수가 없을 것 같다는 생각이 들었는데요.

듣자하니, 이클립스 Juno가 무척 느리다고 하는군요. 그래서 제 컴퓨터에 설치된 이클립스 Indigo 버전에 ADT를 다시 설치하고 -vm 옵션과 -data 옵션을 사용해서 Juno가 구성했던 기존 환경을 그대로 이어받았습니다. "Hello World" 프로젝트가 잘 올라왔고 툴바의 아이콘은 안정적이었으나, activity_main.xml 파일의 문제는 여전했습니다.

모르겠습니다. 이차저차해서 Run을 하니 이번에는 다음과 같은 오류가 발생합니다.

[2012-11-22 19:24:10 - Unexpected error while launching logcat. Try reselecting the device.] device not found
com.android.ddmlib.AdbCommandRejectedException: device not found
    at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:752)
    at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:373)
    at com.android.ddmlib.Device.executeShellCommand(Device.java:462)
    at com.android.ddmuilib.logcat.LogCatReceiver$1.run(LogCatReceiver.java:110)
    at java.lang.Thread.run(Thread.java:722)

장치를 발견할 수 없다라니... 이클립스의 "Android Virtual Device Manager"에서는 Juno의 환경 설정을 이어받아 Indigo에도 동일하게 보였습니다. 어쩔 수 없군요. 혹시나 싶어서 일단 지우고 Indigo 이클립스를 통해서 다시 생성했습니다. 이제서야 실행하니 정상적으로 나옵니다. 아... 맞다. 한참 후에~~~! 그동안 emulator-arm.exe는 CPU 100%를 치고 (i7이라서 12%), 뜨거워진 노트북을 식히기 위해 팬은 돌고... 그나마 실행된 에뮬레이터의 반응 속도는 답답할 정도로 느립니다.

불쌍한 안드로이드 개발자들... 이렇게 열악한 환경속에서 그동안 프로그래밍을 하고 있었다니...

솔직히, 오늘 실습을 하기 전까지는 카카오톡 윈폰 버전이 급하게 다른 버전을 포팅하다 보니 안정성이 떨어진 것이 아닐까 이해해 주려고 했지만, 그건 아무래도 아닌 것 같습니다. 이런 개발 환경을 비교해 보았을 때, 왠지 카톡 윈폰 버전의 개발자에게 문제가 있어 보인다는.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 7/5/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2012-11-22 11시37분
[jacking] 이미 알고 계시겠지만 안드로이드도 Mono로 하는게 좋을 것 같습니다. 개발 환경도 잘 되어 있고 언어도 익숙한 것을 사용할 수 있고요^^
[guest]
2012-11-22 12시23분
Mono로 접근한다고 해도 역시 ^^ 원본을 아는 것이 중요할 것 같아서 개발환경 구축을 해보았습니다.
정성태
2012-11-22 02시58분
[Lyn] 그래서 안드로이드는 실기개발이 기본입니다 ^^; 에뮬레이터 상태가 안좋아서요
[guest]
2012-11-22 11시09분
아... 그렇군요. 제가 안드로이드 폰이 없어서, 그걸 확인 못해봤군요. ^^
정성태
2012-11-23 12시13분
[짜두] 헬로월드가 없었던건 그 이후에도 계속 블로깅을 올릴 계획이었기 때문이라는..ㅎㄷㄷ 암튼 케빈님의 파워블로깅에 링크가 걸리다니 영광입니다~ㅋ
[guest]
2012-11-23 03시38분
짜두님... 그래서 그다음 어떤 앱이 만들어졌어요? ^^ 궁금합니다.
정성태
2012-11-23 05시04분
[짜두] 블로그 TODO 카테고리에 제목만 잔뜩 올려놓고 못쓰고 있어요 ㅠㅠ 웹앱도 있고, 네이티브도 있고 머 오픈소스 머시기 머 이런 아이템들 몇게 있습니다. 제목만...ㅋ
[guest]

... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
11862정성태4/7/201920186개발 환경 구성: 437. .NET EXE의 ASLR 기능을 끄는 방법
11861정성태4/6/201919630디버깅 기술: 126. windbg - .NET x86 CLR2/CLR4 EXE의 EntryPoint
11860정성태4/5/201923507오류 유형: 527. Visual C++ 컴파일 오류 - error C2220: warning treated as error - no 'object' file generated
11859정성태4/4/201920733디버깅 기술: 125. WinDbg로 EXE의 EntryPoint에서 BP 거는 방법
11858정성태3/27/201921634VC++: 129. EXE를 LoadLibrary로 로딩해 PE 헤더에 있는 EntryPoint를 직접 호출하는 방법파일 다운로드1
11857정성태3/26/201919532VC++: 128. strncpy 사용 시 주의 사항(Linux / Windows)
11856정성태3/25/201919778VS.NET IDE: 134. 마이크로소프트의 CoreCLR 프로파일러 리눅스 예제를 Visual Studio F5 원격 디버깅하는 방법 [1]파일 다운로드1
11855정성태3/25/201921954개발 환경 구성: 436. 페이스북 HTTPS 인증을 localhost에서 테스트하는 방법
11854정성태3/25/201917611VS.NET IDE: 133. IIS Express로 호스팅하는 사이트를 https로 접근하는 방법
11853정성태3/24/201920408개발 환경 구성: 435. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면? - 두 번째 이야기 [1]
11852정성태3/20/201919623개발 환경 구성: 434. 존재하지 않는 IP 주소에 대한 Dns.GetHostByAddress/gethostbyaddr/GetNameInfoW 실행이 느리다면?파일 다운로드1
11851정성태3/19/201923374Linux: 8. C# - 리눅스 환경에서 DllImport 대신 라이브러리 동적 로드 처리 [2]
11850정성태3/18/201922434.NET Framework: 813. C# async 메서드에서 out/ref/in 유형의 인자를 사용하지 못하는 이유
11849정성태3/18/201921777.NET Framework: 812. pscp.exe 기능을 C#으로 제어하는 방법파일 다운로드1
11848정성태3/17/201918521스크립트: 14. 윈도우 CMD - 파일이 변경된 경우 파일명을 변경해 복사하고 싶다면?
11847정성태3/17/201922994Linux: 7. 리눅스 C/C++ - 공유 라이브러리 동적 로딩 후 export 함수 사용 방법파일 다운로드1
11846정성태3/15/201921644Linux: 6. getenv, setenv가 언어/운영체제마다 호환이 안 되는 문제
11845정성태3/15/201921770Linux: 5. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) [3]
11844정성태3/14/201923101개발 환경 구성: 434. Visual Studio 2019 - 리눅스 프로젝트를 이용한 공유/실행(so/out) 프로그램 개발 환경 설정 [1]파일 다운로드1
11843정성태3/14/201918039기타: 75. MSDN 웹 사이트를 기본으로 영문 페이지로 열고 싶다면?
11842정성태3/13/201916397개발 환경 구성: 433. 마이크로소프트의 CoreCLR 프로파일러 예제를 Visual Studio CMake로 빌드하는 방법 [1]파일 다운로드1
11841정성태3/13/201916698VS.NET IDE: 132. Visual Studio 2019 - CMake의 컴파일러를 기본 g++에서 clang++로 변경
11840정성태3/13/201918321오류 유형: 526. 윈도우 10 Ubuntu App 환경에서는 USB 외장 하드 접근 불가
11839정성태3/12/201922278디버깅 기술: 124. .NET Core 웹 앱을 호스팅하는 Azure App Services의 프로세스 메모리 덤프 및 windbg 분석 개요 [3]
11838정성태3/7/201925893.NET Framework: 811. (번역글) .NET Internals Cookbook Part 1 - Exceptions, filters and corrupted processes [1]파일 다운로드1
11837정성태3/6/201939822기타: 74. 도서: 시작하세요! C# 7.3 프로그래밍 [10]
... 76  77  78  79  80  81  82  [83]  84  85  86  87  88  89  90  ...