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

1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...
NoWriterDateCnt.TitleFile(s)
13244정성태2/5/20233975VS.NET IDE: 179. Visual Studio - External Tools에 Shell 내장 명령어 등록
13243정성태2/5/20234843디버깅 기술: 190. windbg - Win32 API 호출 시점에 BP 거는 방법 [1]
13242정성태2/4/20234280디버깅 기술: 189. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.UnauthorizedAccessException
13241정성태2/3/20233815디버깅 기술: 188. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.IO.FileNotFoundException
13240정성태2/1/20233980디버깅 기술: 187. ASP.NET Web Application (.NET Framework) 프로젝트의 숨겨진 예외 - System.Web.HttpException
13239정성태2/1/20233623디버깅 기술: 186. C# - CacheDependency의 숨겨진 예외 - System.Web.HttpException
13238정성태1/31/20235617.NET Framework: 2092. IIS 웹 사이트를 TLS 1.2 또는 TLS 1.3 프로토콜로만 운영하는 방법
13237정성태1/30/20235282.NET Framework: 2091. C# - 웹 사이트가 어떤 버전의 TLS/SSL을 지원하는지 확인하는 방법
13236정성태1/29/20234951개발 환경 구성: 663. openssl을 이용해 인트라넷 IIS 사이트의 SSL 인증서 생성
13235정성태1/29/20234479개발 환경 구성: 662. openssl - 윈도우 환경의 명령행에서 SAN 적용하는 방법
13234정성태1/28/20235520개발 환경 구성: 661. dnSpy를 이용해 소스 코드가 없는 .NET 어셈블리의 코드를 변경하는 방법 [1]
13233정성태1/28/20236870오류 유형: 840. C# - WebClient로 https 호출 시 "The request was aborted: Could not create SSL/TLS secure channel" 예외 발생
13232정성태1/27/20234690스크립트: 43. uwsgi의 --processes와 --threads 옵션
13231정성태1/27/20233604오류 유형: 839. python - TypeError: '...' object is not callable
13230정성태1/26/20234018개발 환경 구성: 660. WSL 2 내부로부터 호스트 측의 네트워크로 UDP 데이터가 1개의 패킷으로만 제한되는 문제
13229정성태1/25/20234961.NET Framework: 2090. C# - UDP Datagram의 최대 크기
13228정성태1/24/20235102.NET Framework: 2089. C# - WMI 논리 디스크가 속한 물리 디스크의 정보를 얻는 방법 [2]파일 다운로드1
13227정성태1/23/20234810개발 환경 구성: 659. Windows - IP MTU 값을 바꿀 수 있을까요? [1]
13226정성태1/23/20234466.NET Framework: 2088. .NET 5부터 지원하는 GetRawSocketOption 사용 시 주의할 점
13225정성태1/21/20233738개발 환경 구성: 658. Windows에서 실행 중인 소켓 서버를 다른 PC 또는 WSL에서 접속할 수 없는 경우
13224정성태1/21/20234073Windows: 221. Windows - Private/Public/Domain이 아닌 네트워크 어댑터 단위로 방화벽을 on/off하는 방법
13223정성태1/20/20234268오류 유형: 838. RDP 연결 오류 - The two computers couldn't connect in the amount of time allotted
13222정성태1/20/20233928개발 환경 구성: 657. WSL - DockerDesktop.vhdx 파일 위치를 옮기는 방법
13221정성태1/19/20234138Linux: 57. C# - 리눅스 프로세스 메모리 정보파일 다운로드1
13220정성태1/19/20234280오류 유형: 837. NETSDK1045 The current .NET SDK does not support targeting .NET ...
13219정성태1/18/20233855Windows: 220. 네트워크의 인터넷 접속 가능 여부에 대한 판단 기준
1  2  3  4  5  6  7  8  9  10  11  12  13  14  [15]  ...