디지털 양피지/Android2010. 6. 28. 10:06

안드로이드 Application 개발 기본 과정에 입과 했다. (일주일 과정이며 하루 7시간, 5일 교육으로 진행된다.)
C/C++을 주로 사용하는 나로서는 JAVA를 기반으로 한 이번 교육이 좀 벅찬 될 듯 하다. 

* 본 내용을 포함한 5일차 까지의 블로그는 "강의 노트"로 과정 중 작성한 내용입니다.




교재: Professional Application Development

프로페셔널안드로이드애플리케이션개발
카테고리 컴퓨터/IT > 네트워크/보안 > 모바일프로그래밍
지은이 리토 마이어 (제이펍, 2009년)
상세보기


강사: 강성윤 전임 교수 (멀티캠퍼스 wjs임)
        - 10년 이상의 JAVA 경험을 가지고 계시며 여러 권의 저서도 가지고 계신다.
        - 스스로를 JAVA 빠라 할만큼 JAVA에 대한 큰 애착을 가지고 계신듯 하다.
        - 저서로는 대표적으로 아래와 같은 책들이 있으면 많은 책을 쓰신듯 한다.

자바모바일프로그래밍(CD-ROM1장포함)
카테고리 컴퓨터/IT > 프로그래밍/언어 > JAVA > JAVA
지은이 강성윤 외 (대림, 2002년)
상세보기

JAVAWEBPROGRAMMING(S/W포함) 상세보기

삼성 SDS 멀티캠퍼스에서는 안드로이드, 아이폰, 바다 Application에 대한 교육을 들을수 있다. 모바일 아카데미 로드 맵과  자세한 교육 내용은 아래 사이트에서 확인할 수 있습니다.


< 멀티 캠퍼스 모바일 아카데미 로드 맵>
- 안드로이드 App 개발 기본 과정의 선행
과정으로
과정으로 안드로이드 개발자를 위한 JAVA 선행 과정이 있다.
- 최근 스마트 폰의 열풍(광풍이라 할만 하다)으로 아이폰과 안드로이폰 교육은 꽉꽉 차고 있다고...


# 과정 소개

본 과정은 앞서 소개한 교재로 진행하며 7장을 제외하고 8장까지 진행 된다.

1장: 헬로, 안드로이드
2장: 시작하기
3장: 애플리케이션과 액티비티 만들기(중요)
4장: 사용자 인터페이스 만들기
5장: 인텐트, 브로드케스트 수신자, 어댑터 그리고 인터넷
6장: 데이터 저장, 검색, 그리고 공유
7장: 생략
8장: 백그라운드 작업하기
......

( 그리고, 자기소개가 이어졌다. 현대차, 카톨릭회, SDS, 취업준비생, 기획자...등 다양한 개발자들과 기획자들이 스마트 폰의 열풍을 실감하게 했다. 특히, 일반 개발자들 보다는 기획 하시는 분들과 스마트 폰의 현황을 파악하기 위해 참석한 분들이 많았다.)

스마트 폰과 안드로이드

1. 스마트 폰의 현 위치
     한 설문 조사 기관에서 네트즌들을 통해 미래의 스마트 폰 스택(또는 OS)의 점유율을 물어본 결과 대부분의 응답자들은 안드로이드를 첫째로 뽑았다고 한다. 하지만 응답자 중 많은 수가 아이폰을 사용하고 있으며 앞으로도 아이폰을 사용할 것이라는 결과도 나왔다. 참 아이러니 한 결과지만 애플 유저들의 충성도(?)를 보여주는 단적인 예가 아닌가 싶다. 현재 다양한 안드로이드 폰이 나오고 있으며 앞으로도 많은 종류의 스마트 폰이 나올 것으로 예상된다. 작은 부분이지만 하드웨어 종속적인 문제들은 개발자들에게 피곤한 일이 되지 않을까 싶다.

2. 아이폰 VS. 안드로이드
   오픈 플랫폼 정책을 사용하는 안드로이드와 Apple 고유의 OS와 개발 툴을 사용하고 있는 아이폰은 트레이드 오프적인 성격의 장/단점을 가지고 있다. 아직 까지는 아이폰의 우세로 보이지만 스마트 폰 전쟁은 이제 시작인 듯 싶다.

아이폰 
    개발자의 입장에서 아이폰 앱을 개발하기 위해서는 맥북, 개발자 등록, 앱스토어 등록 등  진입 장벽이 존해 한다. 특히 앱 스토어에 자신이 만든 앱을 등록하기 위해서는 애플에서 정해놓은 많은 절차와 문서를 등록해야 하며 심사의 기준 또한 알 수 없다. 리젝의 이유는 오직 애플에서 관리하고 통제한다고 한다. 하지만 이러한 완전 관리(?) 정책은 사용자의 앱을 통제할 수 있을 뿐만 아니라 상업적이고 사행적인 앱으로 부터 소비자들과 미성년인 사용자를 보호 해줄 수 도 있다. 얼마전 스티브 잡스는 안드로이드 폰의 오픈 정책을 비꼬아 아이들에게 포르노를 보여주고 싶으면 안드로이드폰을 사주라며 선전 포고(?)를 하기도 했다. 
[ 개발 환경: 맥, 개발 SDK: 애플 SDK, 언어: Object C ]

안드로이드
    안드로이드 앱 역시 개발자 등록을 해야 하지만 개발과 마켓에 대한 통제가 거의 없다. 이러한 오픈 정책은 통제하는 사람이 없어 사용자는 사행성, 성인용. 바이러스 등 나쁜 어플리케이션에 직접 노출될 수 있다. 하지만 구글의 입장은 오직 시장의 논리에 따라야 하며 오픈소스의 원칙을 지킨다는 것이다. 이런한 개방성은 집단지성을 이용해 더 좋은 많은 앱을 개발할 수 있고, 많은 사용자에게 이익을 줄 수 있다고 얘기하고 있다. 하지만 이것은 정제 되기전 독이 될 수도 있다.
[ 개발 환경: 윈도우, 리눅스, 맥 모두 가능, 개발 SDK: 안드로이드 SDK, 언어: Java ]

3. 안드로이 코드네임과 프로요
  안드로이드는 그동안 SDK를 버전 업하면서 디저트의 이름을 별칭으로 붙여왔다. 현재 2.2 프로요까지 공개 되었다.

컵케익(Cup Cake): 1.5
도넛(Donut): 1.6
에클레어(Eclair):2.0/2.1
프로요(Froyo) 2.X

구글은 현재까지 안드로이드 코드네임에 C, D, E, F 를 순차적으로 붙여왔으며 차기 버전은 생강 빵을 의미하는 Ginger bread로 전해진다.

* 프로요 특징
- 2.1에 비해 최고 속도 3배 증가
- 테더링 지원
- 어도브 기술 지원
- 어플을 외장 메모리 설치 지원
- 어플의 자동 업데이트 지원

프로요 기능 정리: http://www.bloter.net/archives/31534

4. 가볍게 살펴보는 배경 지식

심비안(Symbialn)
    장치 하드웨어에 대한 접근 몇가지를 제공하지만 복잡한 C/C++ 코드 작성과 사용하기 어렵기로 악명 높은 전용 API의 사용을 과도하게 요구 한다.

< JAVA의 개발 환경 >

자바를 사용한 미들릿(MIDlets)
   - 미들릿은 자바 가상머신 위에서 실행되며, 하부에 있는 하드웨어를 추상화  하고 , 개발자로 하여금 자바 런타임을 지원하는 다양한 하드웨어 위에서 동작하는 어플리케이션을 만들수있도록 해준다.
   - 이러한 편의성은 장치 하드웨어로의 제한된 접근을 대가로 얻어진다.

안드로이드
   - 안드로이드는 모바일 플랫폼 회사인 안드로이드 와 그래픽 회사인 스키아(Skia)사 를 구글이 인수하면서 시작 되었다. 프로젝트 명은 회사명을 그대로 사용하여 안드로이드로 진행되었다.(2005년)
   - 공식 SDK가 처음으로 출시 되었다.(2007년)
   - 공식 폰 출시: G1(제조사: HTC) (2008년) 

   - 안드로이드는 스마트 폰과 관련된 모든 것.
       안드로이드는 OS를 포함한 프레임웍, App를 포함한 스마트 폰에 관한 모든것 이다.
< 안드로이드는 OS를 포함한 스마트 폰의 모든 것이다. >

- 안드로이드 기반하에서 모든 앱은 평등한다.
  구글에서 만들어놓은 모든것과 동일한 App다. 
- 하지만 이런 안드로이드는 오픈소스여서 디바이스 업체나 이통사들의 요구에 따라 라이브러리를 추가 수정해서 배포할 수 있다. 개발자들은 이러한 다양한 폼을 맞춰야 하고, 사용자는 필요한 앱의 호환이 안되는 문제점들이 생길 수 있다.

안드로이드에 대한 오해
  - 안드로이드는 자바 ME 구현이 아니다.
  - 안드로이드는 리눅스 폰 표준화 포럼이나 오픈 모바일 얼라이언스의 일부가 아니다.
  - 안드로이드는 단순한 애플리케이션 계층이 아니다.
  - 안드로이드는 휴대폰이 아니다.
  - 안드로이드는 아이폰을 겨냥한 구글의 대응책이 아니다.

모바일 개발을 위한 오픈 플랫폼
  - 구글은 안드로이드를 다음과 같이 설명하고 있다.
"특정 회사에 종속되어 모바일 혁신을 더디게 만든 독점적인 장애물 없이, 휴대폰을 실행하는 모든 소프트웨어와 모바일 장치를 위한 최초의 진정한 종합 오픈 플랫폼."

네이티브 안드로이드 애플리케이션
  - 출시 당시 처음에 설치되어 있는 애플리케이션이다. 소비자는 원하지 않으면 사용하지 않아도 된다.
Gmail, SMS관리 애플리케이션, Google Maps, Android Market 등 이있다.

안드로이드 SDK의 특징
  - 카메라, GPS, 가속도 센서 등의 하드웨어 접근
  - 네이티브 구글 맵, 지오코딩, 위치기반 서비스(LBS)
  - 백그라운드 서비스 ( 다른 앱 운영시 백그라운드로 동작)
  - 데이터 저장과 검색을 위한 SQLite 데이터베이스
  - 공유 데이터와 애플리케이션 간 통신
  - 구글 톡을 이용한 P2P 서비스
  - 평범한 미디어 지원과 2D/3D 그래픽스
  - 최적화된 메모리와 프로세스 관리 (앱의 시작 부터 종료까지 메모리를 관리해준다.)

개발 프레임워크 소개


그림3. 안드로이드 아키텍쳐


5. 개발 환경 구축

다음과 같은 개발 환경을 설치해야 한다.
  1. JRE(SDK) - java.sun.com - install (http://java.sun.com)
  2. SDK - developer.android.com - 압축해제 (http://developer.android.com/sdk/index.html)
  3. eclipse - www.eclipse.org - 압축해제 (http://www.eclipse.org/)

JRE
    현재 JAVA는 jdk 1.6.까지 나왔다. 1.2와 1.5는 큰 버전 업이다. 1.2는 JAVA2로 불린다. 또한 JAVA2 에서 부터 EE, SE, ME가 분류되기 시작했다. 안드로이드는 1.5버전 이상을 권장하고 있다.
대부분의 JAVA는 1.5 이상 사용을 권장한다. 이는 새롭게 변경된 시그니쳐가 많기 때문이다. 대표적으로 generic( 대표적으로 ArraryList<A) ), annotation(@aaa등 사용)을 지원하기 때문이다.

Android SDK
    현재 2.1 2.2를 받으면 된다.

Eclipse 
    현재 3.5. (3.3에서  SE, EE, C++등의 목적 별로 바뀌었다.)  3.3은 Europa 버전, 3.4은 Ganymade, 3.5는 Galileo 버전이라고 한다. 안드로이드는 이클립스에 프러그인으로 설치하여 사용한다.

위에 설치 프로그램들은 다운로드 받고 플러그인 설치하는데 시간이 많이 걸린다.
일반적으로 자바를 설치하면 다음과 같은 경로에 설치 된다.
C:\Program Files\Java\jdk1.5.0_12

환경 변수 설정
JAVA_HOME: C:\Program Files\Java\jdk1.5.0_12

< JAVA_HOME 설정>

path: C:\Program Files\Java\jdk1.5.0_12\bin; C:\Dev\android-sdk_r06-windows\android-sdk-windows\tools;


< Path 설정 >

이클립스는 exe를 실행하면 된다. 안드로이드 플러그인 설치는 그림과 같다.
플러그인 설치는 URL을 이용한 방법과 ADT를 직접 다운받아 설치하는 방법이있다.
< 안드로이드 플러그인 설치 메뉴>

설치된 플러그인을 업데이트 하기 위해서는 플러그인에서 경로를 설정해 주어야 한다. 
(Preference에서 SDK 폴더 설정)

ADT를 설치 했으면 Virtual Device를 설정한다. (ADV)

용어 설명
ADT: Android Development Tool (eclipse plugin)
Dalvik: 버추얼 머신
AVD: Android Virtual Device 로 에뮬레이터라고 부르기도 한다.
DDMS: Dalvik Debug Monitoring Service 

에뮬레이터가 아이폰보다 아쉬운점은 느리고, 버그도 많다.
메뉴얼도 좀 부족하고 깔끔하게 나오지도 않는다고 한다. 폰에서하는게 더 빠르다고 한다.
< 기본 ADV 화면 >

ADV는 여러개 설정 가능하면 삭제/추가 등이 가능하다. 

Hello World
1. 안드로이드 프로젝트를 연다.
2. Project Name: 개발을 위한 프로젝트 명이다.
3. Build Target: 안드로이드, 구글 API로 나누어져 있다. Android 는 표준만 들어오며, Google에서 구글에서 사용할 수 있는 라이브러리를 제공한다.(구글 맵등)
4. Create Activity: Application 명은 사용자 스마트폰에 깔릴때 설치되는 이름.
5. Package Name: 패캐지는 app의 패키지로 설정 된다.(패키지 명이 어플리케이션의 식별자가 된다.. 동일한 패캐지 명이면 앱에도 올라가지 않는다. 반드시 유니크한 명이 되어야 한다.)
6.Min SDK Version최소 버전을 작성한다.

manifest.xml의 파일에 위에 정보들이 저장되며 이러한 정보들은 앱에 올릴되 최소로 요구되는 정보를 만들어 준다. package 명과 Min SDK Version은 중요한 정보를 가지고 있으므로 적절한 명과 버전을 선택해서 만들어야 한다.

6. 폰테스트
USB 드라이버를 설치하고 실행을 하면 ADV선택창에서 디바이스가 보인다.
이때 설치할 디바이스를 선택하면 된다. 폰테스트는 환경 설정에서 응용프로그램에설 설정해주면 된다.
<폰테스트를 위한 환경 설정>


공식 디벨로퍼 사이트: http://developer.android.com/index.html

마켓에 올리기 위해서는 마켓에 개발자 등록을 해야 한다. 마켓 사이트 제일 아래에 등록하는 버튼이 있다.
등록 비용은 25불...


안드로이드에서 Export Signed Application으로 사인드 된 Application을 만들어서 마켓에 올리면 된다.
키파일은 같은 어플리케이션의 경우 반드시 같아야 하며 맵등을 이용할때 필요하다.
< Signed Application 만들기>

< Key Creation>

7. 국내 안드로이드 개발자 사이트 :
   - 구글 안드로이드 튜토리얼을 한글로 번역해놓은 파일을 얻을 수 있다.
  2. Android Pub : http://www.androidpub.com/

* Apple의 개발자 사이트:  http://developer.apple.com/ 

8. 안드로이드 애플리케이션의 종료
  - 포그라운드 액티비티: 포그라운드에서만 쓸모있는 애플리케이션.
  - 백그라운드 서비스: 화면에 보이지 않고 상호 작용하는 애플리케이션.
  - 인터미턴트 액티비티: 드문드문 상호작용이 있지만 대부분 백그라운드로 서비스 제공.

9. 모바일 애플리케이션 개발하기
     모바일 애플리케이션은 하드웨어가 제약적이다. 현재 이러한 제약은 많이 좋아지고 있다. 무거운 앱이 아니라면 특별한 제약은 아닐것 같다. 하지만, 항상 핸드 핼드 디바이스, 임베디드 프로그램이라는 걸 잊어서는 안된다. 주의가 필요하다.
- 느린처리 속도
- 제한된 RAM
- 제한된 영구 저장 공간
- 저해상도의 작은 화면
- 비싼 데이터 전송 비용
- 다소 신뢰성이 떨어질 수 있는 데이터 연결
- 제한된 베터리 수명

1. 효율적일 것
2. 제한된 저장 공간을 예측할 것
3. 작은 화면을 위해 디자인 할 것
4. 상황에 따라 효율적으로 동작해야 한다.: 적절한 시점에 따라 리소스 활용등을 고려해야 한다.
5. 백그라운드에서 포그라운드로 매끄럽게 전환되어야 한다.: 안드로이드 시스템에 의해 라이프 사이클이 조절 되므로 항상 환경을 고려한 프로그래밍 필요.
6. 품위 있어야 한다.: 사용자가 현재 사용하고 있는 액티비티를 방해하지 말아야 한다.
7. 일관된 사용자 인터페이스를 보여줘야 한다.
8. 반응성이 좋아야 한다.: 모든 사용자 액션에 대해 5초이네에 동작해야 한다.

안드로이드 개발자 사이트에는 Performance를 위해 다음과 같이 디자인 할 것을 요구하고 있다.
1. Avoid Creating Objects: 필요하지 않은 오브젝트 인스턴스를 생성하는것을 피해야 한다.
   ex> 2차원 배열 1개 보다는 1차원 배열 두개가 성능상 좋다.
2. Use Native Methods : 문자열을 처리할 때 String.indexOf(). 등
3. Prefer Virtual Over Interface: 직접 자기 타입을 이용하는게 성능상 좋다.
4. Prefer Static Over Virtual: 매쏘드를 static으로 만들어라
5. Avoid Internal Getters/Setters: 변수 접근 보다 멤버 접근이 더 싸다.
6. Cache Field Lookups: Local variable 접근이 더 싸다.
7. Declare Constants Final
8. Use Enhanced for Loop Syntax with Caution
9. Avoid Enums
10. ...

3장 애플리케이션과 액티비티 만들기
Android Application 개발은 다음과 같은 특징을 가진다.
- Component 기반 구조:
- apk file:
- Manifest file:

Component
기반
기반 구조
   1. XML이용 Layout program
   2. Component 기반: 각 애플리케이션은 컴퍼넌트 기반으로 만들어져서 서로 사용가능하다. 네이티브 애플리케이션에서 필요한 앱을 가져다 쓰면 된다. 컴퍼넌트간에는 비결정 모델로 다른 앱을 이용할 수 있어야 한다.
컴퍼넌트 간에는 Intent를 사용한 느슨한 결합으로 연결되어 있다.

Android의 컴퍼넌트의 종류
    1. Activity: 일반적인 UI (Ch.4)
    2. Broadcast Receiver: 시스템에서 발생하는 broadcast message에 의해 실행.(Ch.5) SMS 메세지 도착 등을 이용할 수 있다.
    3. Content Provider: 외부 애플리케이션에 Data 공개 목적
    4. Service: Background 작업 ( Intent와 Notification은 컴퍼넌트로 분류되지는 않는다.)

Android Application 구조
    1. apk 파일 하나를 하나의 Application이라 한다.
    2. 압축을 해지하면 다음과 같은 폴더와 파일들이 나온다.
         - res -  png, mp3, xml
         - classes.dex - 일반적인 .class 파일을 .dex파일로 변환시켜 Dalvik에 올린다.
         - resource.arsc - Resource 의 인덱스 정보
         - AndroidManifest.xml - 메인 환경 파일. 인스톨, 구동시 필요한 파일
           (필요한 컴포넌트 등록,  permission, library, main sdk 등의 정보가 들어있다.)
      



Posted by 빨간 양말