안드로이드와 코틀린이란? 프로젝트 구조 알아보기

임현주·2022년 4월 19일
0
post-thumbnail

시작

혼자 공부하면서 정리하고 싶은 부분을 작성한 글입니다 👀
함께 공부하는 사람에게는 도움이 되었으면 좋겠고,
혹시 제가 잘못 이해한 부분이 있다면 알려주시면 감사하겠습니다 💌


안드로이드란

모바일 기기를 제어하는 리눅스 기반의 운영체제

안드로이드를 왜 사용할까

1. 누구나 참여할 수 있는 오픈소스
개발자나 단말기를 생산하는 사람들은 기기의 호환성에 맞게 자유롭게 수정 가능

2. 다양한 생태계 존재
Android TV, Wear OS, Android Auto, Android Things 등

3. 풍부한 리소스와 검증된 라이브러리
구글 기반 서비스들과 쉽게 연동 가능

4. 특정 운영체제나 장비가 필요 없음


코틀린이란

자바에서 일어나는 문제 해결을 위해 만들어진, JVM에서 동작하는 정적 타입 프로그래밍 언어

코틀린의 장점

1. 간결성
ex. getter와 setter를 작성하는 Java의 class ➡ Kotlin에서 data class로 간결하게 표현

2. 더 안전한 코드 작성
ex. Null Safety, 컴파일 시점에 미리 알려주기 때문에 NullPointException 방지

3. 자바와 100% 호환 가능


프로젝트 구조

  • app : 소스코드
  • Gradle Scripts : 빌드에 필요한 정보 (앱을 만드는데 필요한 옵션, 라이브러리 등)

📁 app

manifests

앱과 관련된 기본적인 설정 - 앱의 4대 구성요소(Activity, Service, Broadcast Receiver, Content Provider)와 권한들을 명시함

java

앱 내 동작을 정의하는 코드들
android test : 안드로이드 프레임워크를 가지고 테스트
test : 유닛 테스트

res

앱 내 사용하는 자원들의 집합 (사진, 아이콘, 색상, 문자 등)

🐘 Gradle Scripts

미리 알고 가자 🙋🏻‍♀️

  • Gradle : 빌드 프로세스 자동화 툴
    ➡ 코드를 작성하고 컴파일, 테스트, 서명 및 배포, apk, bundle 패키징하는 작업까지 모두 이루어져야 앱을 사용할 수 있는데 이 과정을 자동화한 것!

  • 모듈 : 소스 파일 및 빌드 설정으로 구성된 모음
    프로젝트에는 하나 이상의 모듈이 포함 될 수 있으며, 하나의 모듈이 다른 모듈을 종속 항목으로 사용할 수 있다. 각 모듈은 개별적으로 빌드, 테스트 및 디버그 할 수 있다.

    📱 안드로이드 스튜디오 대표적인 모듈
    • Application : 처음으로 프로젝트를 만들고 생성되는 app 모듈 ➡ APK 파일 생성
    • Android Library : 안드로이드 프로젝트에서 지원되는 모든 파일 형식을 포함할 수 있음, Application 모듈의 종속 항목으로 추가 할 수 있음 ➡ AAR 파일 생성
    • Java or Kotlin library : 순수 Java 혹은 Kotlin으로만 이루어진 모듈, 안드로이드 프레임워크로부터 독립적인 기능을 구현할 때 사용 ➡ JAR 파일 생성

bulid.gradle (Project: xxx)

모든 하위 프로젝트 모듈에 공통적인 구성 옵션을 추가할 수 있는 최상위 빌드 파일

// Top-level build file where you can add configuration options common to all sub-projects/modules.
// 모든 하위 프로젝트 모듈에 공통적인 구성 옵션을 추가할 수 있는 최상위 빌드 파일입니다.
buildscript {
    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:7.1.3'
        classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.20'
    }
}

// 새로 빌드할 때 기존 파일들을 어떻게 할지
task clean(type: Delete) {
    // 모든 파일을 삭제하고 다시 빌드
    delete rootProject.buildDir
}

settings.gradle

bulid.gradle (Project: xxx) 파일보다 조금 더 높은 스코프에 있음
bulid.gradle (Project: xxx) 의 플러그인을 어디서 가져올지 설정

bulid.gradle (Module: xxx)

  • plugins
    반드시 필요한 플러그인들 선언

  • compileSdk
    어떤 안드로이드 SDK 버전으로 앱을 컴파일 할 것인지 (앱 개발 당시의 최신 API를 컴파일 SDK로 지정할 것을 권장)

  • defaultConfig
    빌드 타입과는 무관하게 모두 적용되는 속성들

  • minSdk
    앱을 사용할 수 있는 최소한의 API 레벨

  • targetSdk
    앱이 기기에서 동작할 때 사용하는 API 레벨 (앱이 개발 당시 테스트 된 API 레벨)
    앱 개발 당시의 최신 API를 targetSdk로 지정할 것을 권장

  • buildTypes
    release 모드(출시용), debug 모드(개발용)이 있다.

  • dependencies
    앱에 종속시킬 라이브러리들 선언

// 반드시 필요한 플러그인들 선언
plugins {
    id 'com.android.application'
    id 'kotlin-android'
}

android {
    // 어떤 안드로이드 SDK 버전으로 앱을 컴파일 할 것인지
    // 앱 개발 당시의 최신 API를 컴파일 SDK로 지정할 것을 권장
    compileSdk 31

    // 빌드 타입과는 무관하게 모두 적용되는 속성들
    defaultConfig {
        applicationId "com.xxx.xxx"
        minSdk 23 // 앱을 사용할 수 있는 최소한의 API 레벨
        targetSdk 31 // 앱이 기기에서 동작할 때 사용하는 API 레벨 (앱이 개발 당시 테스트 된 API 레벨) 앱 개발 당시의 최신 API를 targetSdk로 지정할 것을 권
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    // release 모드(출시용), debug 모드(개발용)이 있다.
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    
    // 컴파일할 때 필요한 옵션들
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    
    // jvmTarget이 몇 버전인지
    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'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    testImplementation 'junit:junit:4.+'
    androidTestImplementation 'androidx.test.ext:junit:1.1.3'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    ...
}


📖 참고
https://youtu.be/BIubAKowCyw
https://youtu.be/kQEBMV9swzQ

profile
🐰 피드백은 언제나 환영합니다

0개의 댓글