HOME > android > basic

안드로이드 - Project 구조 알아보기

JSFollow17 Aug 2017

Project file(Android view)

그림1에서 보여지는 화면은 Android Studio의 왼편에 Project 버튼을 누르면 볼 수 있습니다. 기본적으로 Android view를 보여줍니다. 다른 view가 설정되어있다면 왼쪽 상단에 드롭다운 메뉴를 누르고 Android로 설정하시면 Android view로 변경됩니다.

Android view에서 보여지는 구조들은 실제 Directory 구조와 다릅니다. 개발편의를 위해서 필요한 폴더들만 보여주고 있습니다.

android project structure

Gradle Scripts 그룹은 build와 관련된 파일들이 있습니다.
app 그룹은 app의 source 등을 포함하고 있고, 하위에 다음과 같은 내용을 보여줍니다.

manifest
AndroidManifest.xml 파일을 포함합니다. App의 Spec을 보여준다고 생각하시면 됩니다.

java
Java source 및 Junit 파일들을 포함합니다.

res
코드가 아닌 모든 Resource(Image, layout, String 등) 파일들을 포함합니다.

Project file(Project view)

그림 2는 Project view의 화면입니다. 왼쪽 상단 드롭다운에서 Project를 선택하면 Project view로 전환할 수 있습니다. Project view는 실제 Directory 구조를 보여줍니다.

android project structure

다음은 Directory 및 File에 대한 간략한 설명입니다.

build/
Build output 파일들이 있습니다.

libs/
Private library(비공개 라이브러리)들이 있습니다.

src/
이 모듈에 대한 모든 code 및 resource 파일들이 있습니다.

  • androidTest/
    Android 기기에서 실행되는 instrumentation 테스트에 대한 code가 있습니다. 자세한 내용은 Android 테스트 문서를 참조하세요.

  • main/
    main source 파일이 있습니다. main source는 Android code 및 resource가 있습니다.

    • AndroidManifest.xml
      애플리케이션의 특성 및 각 구성 요소를 설명합니다. 자세한 내용은 AndroidManifest.xml 문서를 참조하세요.

    • java/
      Java source가 있습니다.

    • jni/
      JNI(Java Native Interface)를 사용하는 native code가 있습니다. 자세한 내용은 Android NDK 문서를 참조하세요.

    • gen/
      Android Studio에서 생성하는 Java 파일(예: R.java 파일) 및 AIDL 파일에서 생성되는 인터페이스들이 있습니다.

    • res/
      애플리케이션 resource(예: drawable, layout file, UI string 등)가 있습니다. 자세한 내용은 애플리케이션 리소스를 참조하세요.

    • assets/
      .apk 파일 안에 함께 컴파일되어야 하는 파일들이 있습니다. 이 위치의 파일들은 AssetManager 를 통하여 사용할 수 있습니다.

  • test/
    호스트 JVM에서 실행되는 로컬 테스트의 코드가 있습니다.

build.gradle(모듈)
모듈별 빌드 구성을 정의합니다.

build.gradle(프로젝트)
모든 모듈에 적용되는 빌드 구성을 정의합니다. 이 파일은 프로젝트 내의 모든 모듈의 build에 영향을 주기 때문에 version 관리를 잘 해야 합니다. 자세한 내용은 빌드 구성을 참조하세요.

AndroidManifest.xml 살펴보기

첫번째 App 만들기에서 생성한 Project를 간단히 살펴보겠습니다.
왼쪽 Project file은 보기 편하게 Android view로 설정해주세요.

App source를 볼 때 가장 먼저 확인해야 할 것은 AndroidManifest.xml입니다. 이 파일은 App의 모든 설정 및 component들이 정의되어 있습니다. Device에 App이 설치될 때 Device는 이 파일을 보고 App에 어떤 내용이 있는지 알게 됩니다. 만약 이 파일에 Activity를 정의하지 않으면 Device가 알지 못해 실행할 수 없게 됩니다. 이 파일은 manifests 폴더 아래에 있습니다.

    <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/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

내용을 보면 <application>Tag에 App에 대한 정의가 있습니다. 이 Application Tag안에 <activity>Tag로 Activity에 대한 정의가 있습니다. Activity는 Application 하위에 있다는 의미입니다.

Application의 속성들에 대해서 살펴보면 android:icon 속성이 "@mipmap/ iclauncher"로 되어있는데 이는 /res/mipmap 폴더의 iclauncher.png 파일을 의미합니다.

android:label 속성은 "@string/appname"로 설정되어있는데 /res/values/ strings.xml 파일에서 appname 변수로 정의되어 있는 string을 찾을 수 있습니다. 직접 string을 입력해도 되지만 Android에서는 변수로 설정하고 이것을 참조하는 방식을 권장합니다. 마지막으로, "android:theme"는 "@style/AppTheme"로 설정되어있는데 이 내용은 /res/values/styles.xml에 정의되어 있습니다.

Activity 정의를 보면, android:name은 이름인 동시에 Package path를 나타냅니다. 현재 위치는 package name과 동일합니다. 그래서 '.MainActivity'는 'com.example.xyz.myapplication.MainActivity'가 됩니다. 왼쪽 Project file에서 찾아보시면 이 위치에 MainActivity를 찾을 수 있습니다. Android view를 Project view로 바꿔서 실제 위치도 확인해보세요.

<intent-filter>도 정의되어 있는데 이것은 나중에 알아보도록 하겠습니다.

MainActivity.java 살펴보기

다음으로 MainActivity.java를 열어보시면 MainActivity 객체가 정의되어 있는 것을 확인할 수 있습니다. 이 객체는 AppCompatActivity를 상속받아 구현하였습니다.

package com.example.xyz.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

onCreate()함수를 보시면 "setContentView(R.layout.activity_main);"라는 코드가 있는데요. Java 코드로 Layout을 구성하지 않고 activity_main.xml 파일을 참조하여 Activity의 Layout을 구성하겠다는 의미입니다. 이 파일은 /res/layout/ 폴더 아래에 있습니다. 이것 역시 Android view를 Project view로 바꿔서 실제 위치도 확인해보세요.

activity_main.xml 살펴보기

이 파일을 열어보시면 아래와 같이 Layout design view를 볼 수 있습니다. 이 Tool은 직접 xml 코드를 짜지 않고 마우스로 UI를 변경할 수 있는 기능을 제공합니다. 그리고 xml 코드가 Activity에서 어떻게 보여질 지 preview 화면도 제공합니다. 오른쪽 preview를 보시면 Layout의 경계선을 볼 수 있습니다.

android project structure

왼쪽 하단의 Text탭을 누르면 xml 코드를 직접 수정할 수 있습니다.
코드를 보면 ConstraintLayout 안에 TextView가 정의되어 있습니다. ConstraintLayout의 android:layout_widthandroid:layout_height속성이 "match_parent" 로 설정되었기 때문에 디바이스 화면에 가득차도록 영역이 설정되었습니다. 이 영역은 Design view에서 확인할 수 있습니다.

TextView의 경우 "wrap_content"로 설정되었기 때문에, layout은 글자 크기만큼 영역이 설정되었습니다. 그리고 android:text 속성으로 "Hello World!"가 설정되어 TextView는 이 문자를 보여주었습니다.

참고로 ConstraintLayout의 tools:context 속성에 "com.example.xyz.myapplication. MainActivity"로 설정되어있는데, Design view에서 preview를 보여줄 때 이 Class에 설정된 Theme 등을 참고하여 보여주겠다는 의미입니다. preview 기능을 사용하지 않으면 설정하지 않아도 됩니다.

android project structure

build.gradle 살펴보기

Android studio는 gradle을 이용하여 build를 합니다. bulid.gradle은 build에 대한 설정 파일입니다. 아래 그림처럼 2개의 bulid.gradle을 볼 수 있는데 다음과 같은 역할을 합니다.

  • build.gradle (Project: MyApplication) Project 전체에 적용되는 설정입니다. 지금은 1개의 Moudle(app)뿐이 없지만 Library 등 여러개의 Module을 함께 build할 수 있습니다.

  • build.gradle (Module: app) app module에 적용되는 설정입니다.

android project structure

build.gradle (Project: MyApplication)을 열어보면 dependencies에 gradle version이 정의되어 있습니다.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

build.gradle (Module: app)을 열어보면 Sdk의 version 등이 나와있네요. dependencies에는 Sdk외에 다른 library들이 선언되어있네요. 위에서 MainActivity.java에서 AppCompatActivity을 상속받은 것을 확인했었는데 build가 가능했던 이유는 compile 'com.android.support:appcompat-v7:25.3.1'이 정의되어 있었기 때문입니다.

android {
    compileSdkVersion 25
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId "com.example.xyz.myapplication"
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}

정리

Project 구조에 대해 알아보고 간단히 첫번째 앱의 파일들을 살펴보았습니다.

  • AndroidManifest.xml : App의 모든 설정 및 component들의 정의
  • MainActivity.java : Activity의 Java code
  • activity_main.xml : Activity의 Layout에 대한 정의
  • /res/ 파일 : resource 파일들에 대한 정의
  • build.gradle : build 설정에 대한 정의

참고