본문 바로가기

Android/개념 및 예제

안드로이드 앱 개발의 특징 및 디렉터리 구조

안드로이드 앱 개발의 특징

안드로이드의 특징

  • iOS에 비해 많이 오픈되어 있다.
    • 안드로이드는 공개 운영체제인 리눅스 기반이다.
    • 안드로이드 앱 개발은 자바 및 코틀린을 이용해 개발한다.
    • 운영체제의 핵심 코드, 라이브러리 코드, 스마트폰에 기본으로 탑재된 구글에서 만든 앱 코드 등 대부분 코드가 오픈되어 있다.
    • 안드로이드 플랫폼 기반의 스마트폰을 여러 제조업체에서 만들 수 있다.
    • 개발자가 만든 앱은 구글 Play 스토어 뿐만 아니라 다양한 방법으로 사용자에게 배포할 수 있다
    • 안드로이드 기반의 모든 애플리케이션은 평등하다는 사상으로 스마트폰에 기본 탑재된 앱과 개발자들이 만드는 앱이 같은 환경에서 같은 API를 사용한다.
  • 기기의 파편화해상도가 다양함
  • 스마트폰 제조업체에서 안드로이드 플랫폼을 이런 저런 이유로 수정이나 추가해서 제작함
  • 멀티 태스킹iOS는 알림, 오디오, 위치, 블루투스 등 제한적인 기능만 백그라운드에서 수행 가능
  • 서비스를 사용해 백그라운드에서 동작해 계속 업무를 수핼할 수 있음

안드로이드 아키텍처

안드로이드 플랫폼은 리눅스 커널 기반이다.

HAL(하드웨어 추상화 레이어)은 자바 API 프레임워크에서 하드웨어 기능을 이용하는 표준 인터페이스를 제공한다.

안드로이드 런타임은 ART 가상 머신을 사용해서 그 위에 일반 앱 개발 시 이용할 수 있는 자바 API 프레임워크를 제공함

자바 API 프레임워크에서 하드웨어 기기(블루투스, 카메라)를 이용하기 위한 코드가 실행되면 내부적으로 HAL의 라이브러리 모듈이 로딩되어 처리한다.

 

안드로이드 런타임(ART)

자바로 개발된 다른 애플리케이션은 런타임 때 JVM이 수행함, 반면 안드로이드의 VM은 ART를 이용한다.

참고로 ART는 API Level 21(Android 5)에서 새로 추가된 VM이며 이전 VM은 Dalvik이었다.

ART는 앱을 실행할 때 Dex 파일을 실행함.

일반적인 자바 어플리케이션이 실행될 때 JVM이 class파일을 해석한다.

애플리케이션 프레임워크

자바 API 프레임워크는 개발자가 안드로이드 앱을 만들 때 이용하는 표준 라이브러리다.

대표적으로 View 클래서부터 리소스 관리, 데이터 영속화 등의 기능을 제공한다.

컴포넌트 기반 개발

컴포넌트는 앱의 구성 단위이며, 컴포넌트 여러 개를 조합하여 하나의 앱을 만든다.

안드로이드 앱에서 컴포넌트의 물리적인 모습은 클래스이다. 즉 클래스 하나가 컴포넌트이다.

하지만 앱에서 만든 클래스가 컴포넌트인 것은 아니다.

안드로이드에서 클래스는 컴포넌트와 일반 클래스로 나뉜다. 이 둘의 차이는 클래스의 생명주기를 누가 관리하는지에 있다.

일반 클래스의 생명주기는 개발자의 코드로 관리한다.

컴포넌트의 생명주기는 안드로이드 시스템이 관리한다.

컴포넌트 독립적인 수행 단위로 동작합니다.

느슨한 결합도와 관련이 있다. A 컴포넌트가 B 컴포넌트를 실행할 때 개발자 코드로 직접 결합하여 실행하지 않고 인텐트를 매개로 결합하지 않은 상태에서 실행하기 때문에 독립적으로 실행하는 구조이다.

따라서 직접적인 결합이 발생하지는 않는다.

main 함수 같은 애플리케이션의 진입 지점이 따로 없다.

앱의 수행 시점은 다양하다. 앱 아이콘을 클릭하거나 SMS 수신 시 특정 컴포넌트를 실행할 수 있다.

애플리케이션 라이브러리 개념이 있다.

SMS 앱에서 갤러리 앱을 실행할 수 있다.

안드로이드 앱이 컴포넌트 기반이여서 컴포넌트 클래스 간에 직접적인 결합이 없기 때문에 가능하다.

안드로이드 컴포넌트 종류

  • 액티비티 : 사용자 화면을 제공하는 컴포넌트
  • 서비스 : 사용자 눈에는 보이지 않지만, 백그라운드에서 장시간 수해되는 컴포넌트
  • 콘텐츠 프로바이더 : 앱 간의 데이터 공유하기 위한 컴포넌트
  • 브로드캐스트 리시버 : 이벤트 모델로 수행되는 컴포넌트

리소스를 이용한 개발

정적인 콘텐츠를 외부에 분리하여 개발하고 이는 유지보수성을 높이는 이점을 가진다.

문자열, xml, 이미지, 정수 등이 이에 해당한다.

 

개발 디렉터리와 파일 구조

앱의 디렉터리와 파일

메니페스트 파일 : 앱의 메인 환경 파일

res: 앱의 모든 리소스 파일이 res 폴더 하위에 위치한다.

res/drawable : 이미지 파일을 저장하기 위함

res/layout : UI 구성을 위한 레이아웃 XML 파일을 위한 폴더

res/mipmap : 앱의 아이콘 이미지를 위한 폴더

res/values : 리소스 중 문자열 등 값을 위함

R.java의 이해

public final class R {
public static final class anim {
public static final int abc_fade_in=0x7f050000;
public static final int abc_fade_out=0x7f050001;
public static final int abc_grow_fade_in_from_bottom=0x7f050002; 
public static final int abc_popup_enter=0x7f050003;

앱을 개발하면서 생기는 수백 개의 리소스를 식별하기 위한 파일이 R.java이다.

R.java 파일은 툴이 자동으로 만들어주고 파일에는 int형 변수만 선언되어 있다.

  • res 밑에 임의의 폴더를 생성불가
  • 리소스 파일명은 자바 명명규칙을 위배할 수 없다.
  • 파일 명에 대문자를 사용할 수 없다.

그래들 파일

안드로이드 빌드 도구이다.

settings.gradle

그레이들에 모듈을 포함하여 그레이들이 모듈을 관리하고 빌드하게 설정

include ':app'

 

settings.gradle 파일을 열어보면 위 코드처럼 그레이들이 관리하고 빌드해야 할 모듈이 등록되어 있다.

위는 app이란 모듈 하나만 등록되어 있다. 프로젝트에 여러 모듈을 만들어 개발하면 모듈을 만들 때마다 모듈 명이 자동으로 settings.gradle에 포함된다.

 

프로젝트 수준의 그레이들

‘Gradle Scripts’ 영역의 최상위에 있는 build.gradle이고 옆에 프로젝트 명이 표시되어 있다.

모든 모듈을 위한 최상위 설정을 목적으로 한다.

 

모듈 수준의 그레이들

android {
    compileSdkVersion 30
    defaultConfig {
        applicationId "com.example.project1"
        minSdkVersion 21
        targetSdkVersion 30
        versionCode 1
        versionName "1.0.0"

...............................................
dependencies { ................................... }
  • compileSdkVersion: 사용하는 컴파일러 버전
  • applicationId “com.example.user.androidlab”: 앱의 식별자
  • minSdkVersion 15: 최소 지원 범위
  • targetSdkVersion 25: 사용하고 있는 SDK 버전
  • versionCode 1: 앱의 버전
  • dependencies: 앱을 위한 라이브러리 등록

 

참고 :

http://m.yes24.com/goods/detail/51208294

 

깡샘의 안드로이드 프로그래밍

안드로이드 새내기도 앱을 만들 수 있는 체계적 구성!이 책은 각 챕터마다 안드로이드 프로그램과 각 기능이 어떠한 구조로 어떻게 작동하는지 그 원리를 파악하는 데 주력합

m.yes24.com