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

... 91  92  93  94  95  96  97  98  99  100  101  [102]  103  104  105  ...
NoWriterDateCnt.TitleFile(s)
11383정성태12/4/201723361디버깅 기술: 110. 비동기 코드 실행 중 예외로 인한 ASP.NET 프로세스 비정상 종료 현상 [1]
11382정성태12/4/201721909오류 유형: 436. System.Data.SqlClient.SqlException (0x80131904): Connection Timeout Expired 예외 발생 시 "[Pre-Login] initialization=48; handshake=1944;" 값의 의미
11381정성태11/30/201718364.NET Framework: 702. 한글이 포함된 바이트 배열을 나눈 경우 한글이 깨지지 않도록 다시 조합하는 방법(두 번째 이야기)파일 다운로드1
11380정성태11/30/201718418디버깅 기술: 109. windbg - (x64에서의 인자 값 추적을 이용한) Thread.Abort 시 대상이 되는 스레드를 식별하는 방법
11379정성태11/30/201719125오류 유형: 435. System.Web.HttpException - Session state has created a session id, but cannot save it because the response was already flushed by the application.
11378정성태11/29/201720575.NET Framework: 701. 한글이 포함된 바이트 배열을 나눈 경우 한글이 깨지지 않도록 다시 조합하는 방법 [1]파일 다운로드1
11377정성태11/29/201719858.NET Framework: 700. CommonOpenFileDialog 사용 시 사용자가 선택한 파일 목록을 구하는 방법 [3]파일 다운로드1
11376정성태11/28/201724246VS.NET IDE: 123. Visual Studio 편집기의 \r\n (crlf) 개행을 \n으로 폴더 단위로 설정하는 방법
11375정성태11/28/201719018오류 유형: 434. Visual Studio로 ASP.NET 디버깅 중 System.Web.HttpException - Could not load type 오류
11374정성태11/27/201724123사물인터넷: 14. 라즈베리 파이 - (윈도우의 NT 서비스처럼) 부팅 시 시작하는 프로그램 설정 [1]
11373정성태11/27/201723111오류 유형: 433. Raspberry Pi/Windows 다중 플랫폼 지원 컴파일 관련 오류 기록
11372정성태11/25/201726128사물인터넷: 13. 윈도우즈 사용자를 위한 라즈베리 파이 제로 W 모델을 설정하는 방법 [4]
11371정성태11/25/201719763오류 유형: 432. Hyper-V 가상 스위치 생성 시 Failed to connect Ethernet switch port 0x80070002 오류 발생
11370정성태11/25/201719759오류 유형: 431. Hyper-V의 Virtual Switch 생성 시 "External network" 목록에 특정 네트워크 어댑터 항목이 없는 경우
11369정성태11/25/201721752사물인터넷: 12. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 키보드 및 마우스로 쓰는 방법 (절대 좌표, 상대 좌표, 휠) [1]
11368정성태11/25/201727362.NET Framework: 699. UDP 브로드캐스트 주소 255.255.255.255와 192.168.0.255의 차이점과 이를 고려한 C# UDP 서버/클라이언트 예제 [2]파일 다운로드1
11367정성태11/25/201727462개발 환경 구성: 337. 윈도우 운영체제의 route 명령어 사용법
11366정성태11/25/201719121오류 유형: 430. 이벤트 로그 - Cryptographic Services failed while processing the OnIdentity() call in the System Writer Object.
11365정성태11/25/201721366오류 유형: 429. 이벤트 로그 - User Policy could not be updated successfully
11364정성태11/24/201723308사물인터넷: 11. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스로 쓰는 방법 (절대 좌표) [2]
11363정성태11/23/201723253사물인터넷: 10. Raspberry Pi Zero(OTG)를 다른 컴퓨터에 연결해 가상 마우스 + 키보드로 쓰는 방법 (두 번째 이야기)
11362정성태11/22/201719728오류 유형: 428. 윈도우 업데이트 KB4048953 - 0x800705b4 [2]
11361정성태11/22/201722491오류 유형: 427. 이벤트 로그 - Filter Manager failed to attach to volume '\Device\HarddiskVolume??' 0xC03A001C
11360정성태11/22/201722363오류 유형: 426. 이벤트 로그 - The kernel power manager has initiated a shutdown transition.
11359정성태11/16/201721824오류 유형: 425. 윈도우 10 Version 1709 (OS Build 16299.64) 업그레이드 시 발생한 문제 2가지
11358정성태11/15/201726632사물인터넷: 9. Visual Studio 2017에서 Raspberry Pi C++ 응용 프로그램 제작 [1]
... 91  92  93  94  95  96  97  98  99  100  101  [102]  103  104  105  ...