-
[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
- 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은 프로젝트의 구성 정보를 기록하는 곳 하위 프로젝트들이 어떤 관계로 구성되어 있는지를 기술, 앱 프로젝트를 형성하게될 경우, 프로젝트 들의 관계를 여기서 기술 그레이들은 이 파일에 기순된대로 프로젝트를 구성하게 됨
반응형'Framework > Android' 카테고리의 다른 글
[Android Kotlin] Permission에 대해서 정리해보기 (0) 2022.04.17 [Android Kotlin] MVVM 패턴 이해하기 (0) 2022.04.13