Microsoft MVP성태의 닷넷 이야기
Java: 14. 안드로이드 - Hello World 실습 [링크 복사], [링크+제목 복사],
조회: 32902
글쓴 사람
정성태 (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]

... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...
NoWriterDateCnt.TitleFile(s)
12120정성태1/19/202020403.NET Framework: 878. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 - 네 번째 이야기(IL 코드로 직접 구현)파일 다운로드1
12119정성태1/17/202020644디버깅 기술: 160. Windbg 확장 DLL 만들기 (3) - C#으로 만드는 방법
12118정성태1/17/202021751개발 환경 구성: 466. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 - 세 번째 이야기 [1]
12117정성태1/15/202020356디버깅 기술: 159. C# - 디버깅 중인 프로세스를 강제로 다른 디버거에서 연결하는 방법파일 다운로드1
12116정성태1/15/202021075디버깅 기술: 158. Visual Studio로 디버깅 시 sos.dll 확장 명령어를 (비롯한 windbg의 다양한 기능을) 수행하는 방법
12115정성태1/14/202021314디버깅 기술: 157. C# - PEB.ProcessHeap을 이용해 디버깅 중인지 확인하는 방법파일 다운로드1
12114정성태1/13/202022714디버깅 기술: 156. C# - PDB 파일로부터 심벌(Symbol) 및 타입(Type) 정보 열거 [1]파일 다운로드3
12113정성태1/12/202023007오류 유형: 590. Visual C++ 빌드 오류 - fatal error LNK1104: cannot open file 'atls.lib' [1]
12112정성태1/12/202017689오류 유형: 589. PowerShell - 원격 Invoke-Command 실행 시 "WinRM cannot complete the operation" 오류 발생
12111정성태1/12/202021550디버깅 기술: 155. C# - KernelMemoryIO 드라이버를 이용해 실행 프로그램을 숨기는 방법(DKOM: Direct Kernel Object Modification) [16]파일 다운로드1
12110정성태1/11/202021645디버깅 기술: 154. Patch Guard로 인해 블루 스크린(BSOD)가 발생하는 사례 [5]파일 다운로드1
12109정성태1/10/202017818오류 유형: 588. Driver 프로젝트 빌드 오류 - Inf2Cat error -2: "Inf2Cat, signability test failed."
12108정성태1/10/202018794오류 유형: 587. Kernel Driver 시작 시 127(The specified procedure could not be found.) 오류 메시지 발생
12107정성태1/10/202020227.NET Framework: 877. C# - 프로세스의 모든 핸들을 열람 - 두 번째 이야기
12106정성태1/8/202020503VC++: 136. C++ - OSR Driver Loader와 같은 Legacy 커널 드라이버 설치 프로그램 제작 [1]
12105정성태1/8/202019041디버깅 기술: 153. C# - PEB를 조작해 로드된 DLL을 숨기는 방법
12104정성태1/7/202021068DDK: 9. 커널 메모리를 읽고 쓰는 NT Legacy driver와 C# 클라이언트 프로그램 [4]
12103정성태1/7/202024181DDK: 8. Visual Studio 2019 + WDK Legacy Driver 제작- Hello World 예제 [1]파일 다운로드2
12102정성태1/6/202019725디버깅 기술: 152. User 권한(Ring 3)의 프로그램에서 _ETHREAD 주소(및 커널 메모리를 읽을 수 있다면 _EPROCESS 주소) 구하는 방법
12101정성태1/5/202020884.NET Framework: 876. C# - PEB(Process Environment Block)를 통해 로드된 모듈 목록 열람
12100정성태1/3/202018167.NET Framework: 875. .NET 3.5 이하에서 IntPtr.Add 사용
12099정성태1/3/202021062디버깅 기술: 151. Windows 10 - Process Explorer로 확인한 Handle 정보를 windbg에서 조회 [1]
12098정성태1/2/202020851.NET Framework: 874. C# - 커널 구조체의 Offset 값을 하드 코딩하지 않고 사용하는 방법 [3]
12097정성태1/2/202018793디버깅 기술: 150. windbg - Wow64, x86, x64에서의 커널 구조체(예: TEB) 구조체 확인
12096정성태12/30/201920851디버깅 기술: 149. C# - DbgEng.dll을 이용한 간단한 디버거 제작 [1]
12095정성태12/27/201923235VC++: 135. C++ - string_view의 동작 방식
... 61  62  63  64  65  66  67  68  69  70  71  72  73  [74]  75  ...