본문 바로가기
Android/깡샘의 안드로이드

[깡샘의 안드로이드] 02 안드로이드 앱의 기본 구조

by 밤초록 2022. 4. 24.
02-1 안드로이드 소개

 

안드로이드 운영체제의 구조
pg. 52

 

[출처] https://developer.android.com/guide/platform?hl=ko

 

  • 리눅스 커널 안드로이드는 리눅스에 기반을 둔 오픈소스 소프트웨어 스택
  • 하드웨어 추상화 레이어 하드웨어의 추상화 게층으로, 상위의 자바 API 프레임워크에서 하드웨어 기능을 이용할 수 있게 표준 인터페이스 제공
  • 안도르이드 런타임 ART, 앱을 실행하는 역할, 안드로이드 앱이 빌드되는 DEX 파일을 해석해서 실행
  • 네이티브 C/C++ 라이브러리 안드로이드 앱 대부분은 자바 프레임워크로 개발하지만 네이티브 C/C++ 라이브러리를 이용할 수도 있음 -> 안드로이드 NDK
  • 자바 API 프레임 워크 앱을 개발할 때 사용하는 자바 API

 

 

 

 

02-2 안드로이드 앱 개발의 특징

 

 

컴포넌트를 기반으로 한 개발
pg. 56

 

컴포넌트

 

  • 애플리케이션의 구성 요소 (구성하는 단위)
  • 안드로이드에서는 클래스로 컴포넌트 개발, 하나의 클래스가 하나의 컴포넌트

 


 

컴포넌트 개발의 특징

 

  • 컴포넌트는 앱 안에서 독립된 실행 단위
  • 앱 실행 시점이 다양 -> 안드로이드 앱에는 메인 함수(딴일 시작점) 개념이 없음
  • 애플리케이션 라이브러리를 사용할 수 있음

 


 

 

클래스 - 컴포넌트

 

  • 애플리케이션을 구성하는 모든 클래스가 컴포넌트는 아님
  • 앱은 여러 클래스로 구성
  • 컴포넌트 클래스와 일반 클래스로 구분 - 런타임 때 생명주기를 누가 관리하는가에 따라 차이
  • 일반 클래스 - 생명주기 관리를 개발자 코드에서 함
  • 컴포넌트 클래스 - 생명주기를 안드로이드 시스템에서 관리

 


 

안드로이드 컴포넌트 종류

 

  • 액티비티 화면을 구성하는 컴포넌트, 앱이 실행되면 액티비티에서 출력한 내용이 안드로이드 폰에 나옴
  • 서비스 백그라운드 작업을 하는 컴포넌트, 화면 출력 기능 없음
  • 콘텐츠 프로바이더 앱의 데이터 공유, 하나의 앱이 자신의 데이터를 다른 앱에 공유하려면 콘텐츠 프로바이더를 만들어야 함
  • 브로드캐스트 리시버 시스템 이벤트가 발생할 때 실행되게 하는 컴포넌트 (ex) 부팅 완료, 배터리 방전

 

 

 

리소스를 활용한 개발
pg. 61

 

 

리소스

 

  • 안드로이드 앱 개발의 특징 - 리소스를 많이 활용
  • 리소스란? 코드에서 정적인 값을 분리한 것
  • 개발 생산성과 유지보수성 향상

 

문자열을 리소스로 등록

<string name="mytxt">
    애국가
</string>

 

문자열 리소스 사용 예

 

textView.text = resources.getString(R.string.mytxt)

 

 

 

 

 

02-3 앱 구성 파일 분석

 

 

프로젝트의 폴더 구성 알아보기
pg. 63

 

 

 

앱 환경 설정 파일

메인 액티비티 파일

레이아웃 XML 파일

빌드 설정 파일

 

 

  • 프로젝트를 만들면 app이라는 모듈이 자동 생성
  • 모듈 하나가 앱 하나, 프로젝트는 여러 모듈을 묶어서 관리

 

 

 

모듈의 폴더 구성 알아보기
pg. 64

 

 

그래들 빌드 설정 파일

 

  • 그래들 안드로이드 앱의 빌드 도구, 앱을 빌드하는 데 필요한 설정 등록
  • build.gradle(Project) 프로젝트 수준
  • build.gradle(Module) 모듈 수준, 모듈은 앱을 의미 -> 대부분의 빌드 설정은 모듈 수준의 그래들 파일에 작성

 

/ 플러그인 선언 /
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}


android {
    / 컴파일 버전 설정 /
    compileSdk 31

    defaultConfig {
//        앱의 식별자 설정, 고유한 문자열로 지정
        applicationId "com.example.androidlab"
//        SDK 버전 설정
        minSdk 21
        targetSdk 31
//        앱의 버전 설정
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
//    컴파일 옵션
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

//앱에서 이용하는 라이브러리 버전 설정
dependencies {

    implementation 'androidx.core:core-ktx:1.7.0'
    implementation 'androidx.appcompat:appcompat:1.4.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.3'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}

 

 


 

 

메인 환경 파일

 

  • 매니페스트 파일 안드로이드 앱의 메인 환경 파일
  • XML의 속성 값이 @으로 시작하면 리소스를 의미함

 

  • 안드로이드 컴포넌트(애플리케이션의 구성 요소)는 시스템에서 생명주기 관리
  • 시스템은 매니페스트 파일에 있는 대로 앱 실행
  • 컴포넌트는 매니페스트 파일에 등록해야 시스템이 인지

 

<?xml version="1.0" encoding="utf-8"?>
<!--네임 스페이스 선언  -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.androidlab">

<!--    애플리케이션과 관련된 정보들 (앱 아이콘, 앱 이름, 테마 등) -->
    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AndroidLab">

<!--        액티비티 선언 -->
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
<!--                앱 아이콘을 클릭했을 떄 실행되는 액티비티라는 의미 -->
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

 

 


 

리소스 폴더

 

  • 각 리소스 폴더에 다시 하위 폴더 정의할 수 없음
  • 리소스 파일명은 자바의 이름 규칙 위배할 수 없음
  • 리소스 파일명에는 알파벳 대문자 이용할 수 없음

 


 

 

메인 액티비티 파일

 

  • 매니페스트 파일의 설정값에 따라 폰에 앱을 설치한 후 앱의 아이콘을 터치하면 MainActivity.kt 파일이 실행
  • MainActivity 클래스가 실행되면 onCreate() 함수가 자동으로 호출
  • setContentView() 함수는 매개변수에 지정한 내용을 액티비티 화면에 출력
  • 본 코드에서는 R.layout.activity_main 로 지정했으므로 src/main/res/layout/activity_main.xml 파일에 구성한 내용을 화면에 출력

 

// 'AppCompatActivity' 를 상속받아 'MainActivity'라는 클래스 정의
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
//        setContentView() 함수는 매개변수에 지정한 내용을 액티비티 화면에 출력
        setContentView(R.layout.activity_main)
    }
}
반응형

댓글