오늘은 안드로이드 프로젝트 구성에 대해서 알아보자.
프로젝트의 폴더 구성
처음에 안드로이드 프로젝트를 생성하게 되면 많은 폴더와 파일이 생성이 된다.
근데 사실 프로젝트 폴더에서 [모듈명 -> src -> main]이 가장 중요하다.
안드로이드 스튜디오 프로젝트 탐색착에서는 이렇게 보여준다.
프로젝트를 생성하게 되면 app이라는 모듈이 자동으로 생성된다. 모듈하나다가 앱 하나이며 프로젝트는 여러 모듈을 묶어서 관리하는 개념이다. 하나의 프로젝트에는 자동으로 만들어지는 app모듈이외에 여러 모듈을 추가할 수 있다.
모듈의 폴더 구성
모듈을 구성하는 폴더와 파일 간단 정리
이름 | 설명 |
build.gradle | 빌드 설정 파일 |
AndroidManifest.xml | 앱의 메인 환경 파일 |
res | 리소스 폴더 |
activity_main.xml | 레이아웃 XML 파일 |
MainActivity.kt | 메인 액티비티 파일 |
그래들 빌드 설정 파일
그래들(Gradle)은 앱을 빌드하는 도구이다.
앱을 빌드하는 데 필요한 설정을 이 파일에 등록한다.
위의 이미지와 같이 두개의 파일이 존재하는데 하나는 프로젝트 수준의 build.gradle(Project: My_Appliacation)이고, 또 하나는 모듈 수준의 build.gradle(Module :app)이다. 모듈은 앱을 의미하기때문에 대부분의 빌드 설정은 모듈 수준의 그래들 파일에 저장한다.
기본적으로 (내 프로젝트에는) com.android.application 과 org.jetbrains.kotlin.android 가 있고 필요에 따라 추가할 수 있다.
안드로이드 SDK 33 버전을 적용해서 컴파일 하라는 의미이다.
applicationId는 앱의 식별자를 설정한다. 만약 구글 플레이 스토어에 등록된 어떤 앱이 똑같은 식별자를 이미 사용하고 있다면 이 앱은 플레이 스토어에 등록되지 않는다. 또, 스마트폰에 식별자가 똑같은 앱이 설치되어 있다면, 이 앱은 설치되지 않는다.
targetSdk는 개발할 때 적용되는 SDK 버전이다.
그리고 minSdk는 이 앱을 설치할 수 있는 기기의 최소 SDK 버전을 의미한다.
앱의 버전을 설정한다. 초깃값은 1이지만 개발자가 앱의 업데이트할때 이 버전을 올려서 다시 배포한다.
개발 언어의 버전을 설정하는 곳이다. 자바 버전 선언을 생략하면 기본으로 1.6이 적용된다.
tarketSdk에 명시한 안드로이드 SDK는 기본으로 적용되지만 그 외에 개발자가 추가하는 오픈소스 라이브러리나 구글의 androidx 라이브러리등 SDK 라이브러리가 아닌 것들은 모든 dependencies에 선언해야한다.
메인 환경 파일
AndroidManifest.xml은 안드로이드 앱의 메인 환경 파일이다. 안드로이드 시스템은 이 파일에 설정한 대로 사용자의 폰에서 앱을 실행한다. 즉, 매니페스트 파일은 개발부터 실행까지 중요한 역할을 한다.
<manifest>는 매니페스트 파일의 루트 태그이다.
xmlns는 XML의 네임스페이스 선언이며 URL은 안드로이드 표준 네임 스페이스이다. package는 매니페스트 파일에 선언한 컴포넌트 클래스의 기본 패키지 명이다.
추후에 개발할 때 추가되는 액티비티, 서비스 등등의 클래스들은 이 패키지명 이후부터 작성하면 된다.
아래는 예제로 만든 안드로이드 프로젝트 매니페스트 파일 코드이다.
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myapplication">
<application
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyApplication"
tools:targetApi="31">
<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>
<application> 태그는 앱 전체를 대상으로 하는 설정이다. 여기서는 icon 속성이 있느넫, 이곳에 지정한 이미지가 앱을 설칭한 사용자의 폰에 보이는 실행 아이콘이다.
label 속성에는 앱의 이름을 등록하는데 @string/app_name으로 지정했기 때문에 res/values/strings/xml 파일에 app_name에 지정된 문자열 리소스를 가리킨다.
theme 설정은 앱에서 저용해야 하는 테마를 설정하는 것이다. res/values/themes.xml 파일에 Theme.MyApplication 이름으로 선언한 테마를 적용하겠는 뜻이다.
안드로이드 컴포넌트들은 시스템에서 생명 주기를 관리한다. 즉 컴포넌트는 매니페스트 파일에 등록해야 시스템이 인지한다.
액티비티는 <activity> 태그
서비스는 <service>태그
브로드캐스트 리시버는 <receiver> 태그
콘텐츠 프로바이더 <provider> 태그로 각각 등록한다.
만약 액티비티가 10개라면 10개의 태그를 선언해야한다.
<intent-filter> 태그는 생략이 가능하다.
인텐트는 추후 공부를 더 해보고 포스팅을 하겠지만, <intent-filter>가 선언 되었고, 그 안에 <action>태그의 name 값이 android.intent.action.Main 그리고 <category> 태그의 name값이 android.intent.category.LAUNCHER로 선언 되어 있다면, 앱을 실행하였을 때 가장먼저 실행되어야하는 액티비티라는 의미이다.
리소스 폴더
res폴더는 앱의 리소를 등록하는 목적으로 사용한다.
- drawable : 이미지 리소스
- layout : UI구성에 필요한 XML 리소스
- mipmap : 앱 아이콘 이미지
- values : 문자열 등의 값으로 이용되는 리소스
res 폴더 아래에 리소스를 만들면 자동으로 R.java 파일에 상수 변수로 리소스가 등록된다. R.java는 개발자가 만드는 파일이 아니며 폴더에 있는 리소스를 보고 자동으로 만들어진다.
예전 버전의 안드로이드 스튜디오에서는 R.java 파일을 직접 찾아 확인해 볼 수 있었다고 합니다.
하지만 지금은 보여주지는 않습니다.
왜냐 R.java 파일은 개발자가 직접 건드리지 않고 내부에서 리소스를 등록하기 위해서 사용하기 때문입니다.
리소스가 등록되면 R.java 파일에 int형 변수가 생기므로 res 폴더에는 개발자 임의의 폴더를 사용할수 없다.
지정된 폴더명에서 사용해야한다는 의미이다. 즉 이미지는 drawable 폴더에서 UI관련 XML 파일은 layout 폴더를 이용해야하며, 각 리소스 폴더에 하위 폴더를 만들 수 없다.
리소스 파일명은 자바의 이름 규칙에 위배되는 파일명으로 정의할 수 없다.
레이아웃 XML 파일
res/layout 폴더 아래에 기본으로 생성되는 화면을 구성하는 XML 파일이다.
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
메인 액티비티 파일
MainActivity 클래스가 실행되면 onCreate()함수가 자동으로 호출되며 함수 안에 구문을 실행한다.
setContentView() 함수는 매개 변수에 지정한 내용을 액티비티에 출력한다.
package com.example.myapplication
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)
}
}
'Android > Study' 카테고리의 다른 글
[Android] TextView 정리 (0) | 2023.09.23 |
---|---|
[Android] View Class에 대한 정리 (0) | 2023.09.23 |
[Android] 안드로이드 앱 개발의 특징 (0) | 2023.09.19 |
[Android] ConstraintLayout 이란 (0) | 2023.09.11 |
[Android] View, ViewGroup, XML Layout 이란? (0) | 2023.09.10 |