ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android Kotlin] 프로젝트 생성 시 기본 폴더 구조 및 내용 요약
    Framework/Android 2022. 4. 12. 22:19
    반응형

    목차

    • Android 생성 시 기본 폴더 구조 파악
    • Manifest.Xml 하는 일과 용도 및 내용 정리
    • Entry Point(시작점)란 무엇이고 어떻게 적용되는가
    • Java 폴더가 하는 일
    • res 폴더가 하는 일
    • gradle 폴더가 하는 일

     

    Android 생성 시 기본 폴더 구조 파악하기

    기본 프로젝트 생성 시 파일구조
    projectName
    ├── manifests    
    │   └── AndroidManifest.xml
    ├── java
    │   ├── 패키지이름.앱이름                  - 메인 코드 작성 및 코드 작성하는 곳
    │   ├── 패키지이름.앱이름(androidTest)     - 테스트 코드 작성시 사용
    │   └── 패키지이름.앱이름(test)
    ├── res
    │   ├── drawable     - 각종 이미지 관리
    │   ├── layout       - 화면 UI XML 
    │   ├── mipmap       - 각종 아이콘 및 앱에 사용하는 이미지파일
    │   └── values       - 앱의 테마나, 컬러 코드, 문자열 저장 공간
    ├── gradle 
    │   ├── build.gradle(Project)
    │   ├── build.gradle(Module)
    │   ├── gradle-wrapper.properties
    │   ├── proguard-rules.pro
    │   ├── settings.gradle
    └── └── local.properties

     

     

    Mainfest

    • Mainfest란 안드로이드 Application에 대한 각종 정보들을 기술하는 파일이다. 맨 처음 앱이 알아야하는 기본정보라고 보면 되고 Mainfest의 App관련 화면과 코드가 등록이 되어 있어야 사용이 가능하다. 맨 처음 이 xml을 보고 앱이 구동 되니 여기가 처음 시작점이라고 봐도 무방하다.
    맨 처음 프로젝트 생성 시 Manifest
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapplication">  <- 바라볼 소스 패키지 명
    
        <application
            android:allowBackup="true"         <- 데이터를 백업하고 복원할지 여부
            android:icon="@mipmap/ic_launcher" <- 기본아이콘 설정 mipmap에 ic_launcher를 기본아이콘으로 사용한다는 의미
            android:label="@string/app_name"   <- 앱의 이름 설정 String.xml에 App_name을 사용한다는 의미
            android:roundIcon="@mipmap/ic_launcher_round" <- 기본 아이콘 설정 Icon과 역할은 똑같은데 동그라미로 표시할 것인지 설정한다는 의미
            android:supportsRtl="true"         <- 앱 오른쪽에서 왼쪽으로 RTL 레이아웃을 지원할지 여부를 선언합니다. 기본값 false
    				<- RTL은 Right to Left 라는 의미
            android:theme="@style/Theme.MyApplication"> <- theme.xml에서 MyApplication 기본 테마 색을 지정 
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    • Manifest 4대 구성요소
      • Intent
        • 안드로이드 Component를 호출 및 변경하는 내용을 관리하는 App 관리자 나 최상위 Component 정도로 이해하면 좋다 Activity 전환할때 주로 intent를 사용하며 표시해 준다.
      • Activity
        • 안드로이드에서 화면을 보여주는 단위이다. Android project에서 최소 하나의 activity가 있어야 한다.
      • Service
        • 백그라운드 작업을 하는 공간이라고 보면 된다. 어떤 Activity에서 한 Service를 실행 시키고 Activity를 종료하여도 Service는 꺼지지 않고 백그라운드에서 계속 돌게 된다.
      • Broadcast Receiver
        • System 전반에서 특정 이벤트에 대해 응답하는 역할을 한다. 배터리가 부족하거나, 스크린 캡쳐될 때, 다운로드가 완료되었을 때 등 이러한 행위들이 Broadcast Receiver를 통해 응답받을 수 있다. 하지만, 직접적으로 ui로 알려 주지는 않고 사용자에게 알려 주려고 하면, notification, toast 등을 이용해서 알려 주어야 한다.
      • Contents Provider
        • 앱 내에서 사용할 수 있는 데이터를 공유하기 위한 구성요소로 앱에서 자료를 저장할 때 DB를 사용하는데 이 DB는 해당 앱 외에는 다른 앱이 접근하는 것이 불가능하지만, Contents Provider의 역할 중에 하나가 외부 앱이 DB에 접근하는 것을 막는 동시에 DB중에 원하는 것들만 공유할 수 있도록 한다.
    • Intent Filter
      • 명시적 인텐트 : 호출할 컴포넌트를 명확하게 알려주는 것
      • 암시적 인텐트 : 호출할 컴포넌트를 정확하게 아는 것이 아니라 추상적으로 호출 하고 싶을 때 사용

    Entry Point

    안드로이드 Launcher화면에서 안드로이드 앱을 켰을 때 처음 들어오는 곳을 뜻함 Launcher라는 것은 핸드폰을 켰을 때 밑에서 위로 슬라이드 하면 나오는 앱들 모음 화면임 Source에서 Entry Point를 정하는 곳을 Manifest.xml에 intent-filter가 있는 곳으로 설정이 됨 intent-filter가 MainActivity에 있으니 처음 시작하는 Activity(화면)는 MainActivity가 되는 것임

    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
    
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
    android:name=".MainActivity3"
    android:exported="false"
    android:label="@string/title_activity_main3"
    android:theme="@style/Theme.MyApplication.NoActionBar" />
    

     

    Java 폴더 이해하기

    • Java 폴더는 기본패키지(MainActivity), androidTest, test로 구성되어있음
    • androidTest는 android UI를 테스트 하는 소스임
    • test폴더는 JUnit test를 활용하는 소스임
    • 사용법은 찾아보자 큰 프로젝트에서 사용하면 좋을 듯

     

    Java폴더 - 기본 소스 파악해 보기

    package com.example.textviewkt
    
    import androidx.appcompat.app.AppCompatActivity
    import android.os.Bundle
    
    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
        }
    }

     

    Java폴더 - Bundle이란?

    override fun onCreate(savedInstanceState: Bundle?) <- Bundle이란?
    • 안드로이드에서 Bundle이란 Map 형태로 구현된 데이터의 묶음(Bundle이 묶음이라는 뜻)임
    • 안도르이드에서 Bundle은 savedInstanceState라는 Instance State(인스턴스 상태)를 이용하여 Activity의 상태 저장 및 복구를 진행한다.
    • Intent의 extras를 이용하여 다른 구성요소(Activity, Broadcast Receiver 등)에 데이터를 전달 하고 그 전달한 값에 savedInstanceState를 이용하여 상태를 다시 초기화 해 줄 수 있다.
    • 즉, 안드로이드 화면의 상태나 데이터를 관리하고 화면 전환 시 입력된 데이터를 전달해주는 역할이다.

     

    Java폴더 - R.java 이해하기

    setContentView(R.layout.activity_main) <- R이란 무엇일까?
    • 소스를 보다보면 R.layout이나 R.drawable와 같은 것을 볼 수 있음
    • R이라는 것은 밑에서 설명 하겠지만 res폴더를 가리키는 말로 보면 됨
    • R.java를 찾아 보면 아래와 같이 클래스로 되어있고 res 폴더안에 있는 내용이 들어가게 되는 것을 볼 수 있음
    /* R.java 클래스 */ 
    public final class R{ 
    	//색 관리 리소스
    	public static final colores{ 
    	}
    
    	//이미지 리소스
    	public static final drawable{ // ... 
    	}
    
    	// 문자열 리소스
    	public static final string{ // ... 
    	} 
    	
    	// 레이아웃 리소스
    	public static final layout{ // ... 
    	}
    }
    
    • setContentView(R.layout.activity_main) <- R이란 무엇일까?

     

    res폴더 이해하기

    res 폴더는 갖종 resource를 관리하는 폴더임

    • drawable - 각종 이미지가 저장되고 관리 되는 곳
    • layout - 화면 ui xml 이 저장되고 관리 되는 곳
    • mipmap - 각종 아이콘 파일이 저장되고 관리 되는 곳
    • values - 앱의 테마나, 자주 사용되는 컬러 코드, 문자열 등을 저장되고 관리되는 곳 파일 열어 보면 알겠지만 name으로 하여 관리가 되고 소스에서 불러서 사용가능

     

    gradle폴더 이해하기

    작성한 자바/코틀린 언어를 complie해주거나 필요한 lib, dependency들을 관리하고 호환해주는 역할을 하는 곳 Project와 Module로 나뉘게 되는데 여러개의 module들을 모아서 하나의 project가 되는 형식으로 보면 됨

    //build.gradle(project)
    //프로젝트 단위 플러그인 버전관리
    plugins {
        id 'com.android.application' version '7.1.2' apply false
        id 'com.android.library' version '7.1.2' apply false
        id 'org.jetbrains.kotlin.android' version '1.5.30' apply false
    }
    
    //프로젝트 실행시 클린할 영역 설정
    task clean(type: Delete) {
        delete rootProject.buildDir
    }
    
    //build.gradle(module)
    //모듈 단위 플러그인 관리
    plugins {
        id 'com.android.application'
        id 'org.jetbrains.kotlin.android'
    }
    
    //버전 관리 
    android {
    		//sdk 버전을 정의 
    		//sdk란? Software Development Kit을 의미함
    		//개발에 필요한 컴파일러, 디버깅, API등을 제공해주는 Kit
        compileSdk 32
    
    		//기본 config설정
    		//com.example.kotlin1 <- 생성한 프로젝트 이름에 main을 바라봄
        defaultConfig {
            applicationId "com.example.myapplication" //manifest에 package명과 동일해야함
            minSdk 21               //앱구현 최소 api sdk 21 기본 sdk 32
            targetSdk 32            //앱구현 api sdk 버전정의
            versionCode 1           //앱버전
            versionName "1.0"    		//앱버전 이름 versionCode는 배포 버전 관리 올릴 수만 있음
    				
    				//기본 테스트 계측기 설정
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    
    		//배포할 목적의 빌드 유형이 기술되는 부분
        buildTypes {
            release {
    						//release할 때 minify(소스 공백 제거로 압축하는 효과)할지 여부 설정
                minifyEnabled false
    						//proguard 규칙 명명
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    		//compile target 소스 버전 관리
    		//java version 1.8을 사용하겠다는 의미
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
        kotlinOptions {
            jvmTarget = '1.8'
        }
    }
    
    //gradle dependency를 설정이 가능
    dependencies {
        implementation 'androidx.core:core-ktx:1.7.0'
        implementation 'androidx.appcompat:appcompat:1.3.0'               //AppCompat은 하위 버전에서도 최신 버전의 ui를 지원하기 위해 사용되는 것 
        implementation 'com.google.android.material:material:1.4.0'       
        implementation 'androidx.constraintlayout:constraintlayout:2.0.4' //멀티해상도를 좀더 쉽게 지원하기 위하여 추가된 layout
        testImplementation 'junit:junit:4.13.2'
        androidTestImplementation 'androidx.test.ext:junit:1.1.3'
        androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
    }
    

    아래 부분은 잘 모르면 건드리지 말자

    • gradle-wrapper 그레이들을 설치하거나 연동하지 않아도 사용 할 수 있게 해주는 스크립트 파일
    • proguard-rules.pro는 중요한 코드나 비밀번호 같은 부분의 코드를 난독화 시켜주는 곳
    • gradle.properties, local.properties는 그레이들과 속성과 로컬 파일 속성이 담긴 곳
    • settings.gradle은 프로젝트의 구성 정보를 기록하는 곳 하위 프로젝트들이 어떤 관계로 구성되어 있는지를 기술, 앱 프로젝트를 형성하게될 경우, 프로젝트 들의 관계를 여기서 기술 그레이들은 이 파일에 기순된대로 프로젝트를 구성하게 됨
    반응형

    댓글

Designed by Tistory.