본문 바로가기

개발환경 설정/Tools

Android Studio를 배워보자 - (2) 라이브러리 프로젝트 생성, 참조하기

저번 포스트 (2013/11/12 - Android Studio를 배워보자 - (1) 주요 특징 및 빌드 시스템)를 통해 안드로이드 스튜디오의 기본적인 사용법과 빌드 시스템에 대해 알아보았습니다. 이번 포스트에서는 안드로이드 스튜디오에서 안드로이드 라이브러리 프로젝트를 만들고 참조하는 방법에 대해 알아보겠습니다.


이 포스트에서 함께 만들어볼 예제의 구성은 다음과 같습니다.


+ 프로젝트 (AndroidStudioLibApp)

   - 애플리케이션 모듈 (StudioApp)

   - 라이브러리 프로젝트 모듈 (StudioLib)


그럼, 바로 예제를 만들어 보겠습니다.


본 포스트는 Android Studio 버전 0.3.6을 기준으로 작성되었습니다.

추후 업데이트로 인해 변경되는 부분이 있을 수 있으니 참고해주세요.


프로젝트 생성 및 모듈 추가


먼저 프로젝트를 생성합니다. 프로젝트를 생성하면서, 동시에 애플리케이션 모듈도 만들어줍니다.


프로젝트 이름(Application name) : AndroidStudioLibApp

모듈 이름(애플리케이션 이름) : StudioApp


새 프로젝트와 모듈을 생성합니다.



프로젝트를 생성한 후, 프로젝트(AndroidStudioLibApp)를 오른쪽 클릭하여 표시되는 메뉴에서 New > Module...을 선택합니다.

이어 표시되는 모듈 추가 마법사에서 'Android Library'를 선택합니다.





다음 화면에서 라이브러리 프로젝트 이름과 패키지를 입력합니다. 액티비티는 생성하지 않을 것이므로 Create activity 항목은 체크는 해제해줍니다..


새로 추가할 모듈 정보(라이브러리 프로젝트)를 입력합니다.



Finish 버튼을 누르면 라이브러리 프로젝트 모듈이 추가됩니다. 다음과 같이 프로젝트 구조에 새로 생성한 라이브러리 프로젝트(StudioLib)가 추가된 것을 확인할 수 있습니다.





빌드 스크립트는 어떻게 바뀌었을까?


라이브러리 프로젝트는 애플리케이션 프로젝트와 대부분이 유사하나, 빌드 스크립트에 약간 차이가 있습니다. 아래는 위에서 생성한 StudioLib 라이브러리 프로젝트의 빌드스크립트를 보여줍니다.


[build.gradle]

buildscript {

    repositories {

        mavenCentral()

    }

    dependencies {

        classpath 'com.android.tools.build:gradle:0.6.+'

    }

}

apply plugin: 'android-library'


repositories {

    mavenCentral()

}


android {

    compileSdkVersion 19

    buildToolsVersion "18.0.1"


    defaultConfig {

        minSdkVersion 7

        targetSdkVersion 19

    }


}


dependencies {

compile 'com.android.support:appcompat-v7:+'

}



대부분에 애플리케이션 프로젝트와 동일한 모습을 하고 있지만, apply plugin에 'android'가 아닌 'android-library'를 사용하고 있습니다. 이를 통해 이 빌드스크립트는 안드로이드 라이브러리를 빌드한다는 것을 알 수 있습니다.


라이브러리 프로젝트를 추가한다는 것은, 위에서 생성한 프로젝트(AndroidStudioLibApp)에 모듈을 추가하는 하는 것과 동일합니다. 즉, 전체 프로젝트를 빌드할 때 우리가 추가한 모듈(라이브러리 프로젝트)도 함께 빌드되도록 프로젝트의 빌드 설정도 변경해야 합니다. 프로젝트의 빌드 설정을 관리하는 settings.gradle 파일을 열어 내용이 어떻게 바뀌었는지 확인해보겠습니다.


[settings.gradle]

include ':StudioApp', ':StudioLib'


최초 프로젝트를 생성할 때는 ':StudioApp' 만 포함하도록 되어있었는데, 이제는 StudioLib 모듈도 settings.gradle에 추가되어 프로젝트를 빌드하면 StudioLib 모듈도 함께 빌드됩니다.



라이브러리 프로젝트 작성 및 사용하기


라이브러리 프로젝트를 생성했으니, 라이브러리 프로젝트 내부를 구현하고 애플리케이션 프로젝트에서 참조하여 사용하는 방법에 대해 알아보겠습니다. 먼저, 라이브러리 프로젝트에 LibProjectMessage 클래스를 추가합니다. (main>java>com.androidhuman.example.studiolib 에서 New > Java class 선택)


해당 클래스는 다음과 같이 매우 간단한 기능을 가지고 있습니다.


[LibProjectMessage.java]

public class LibProjectMessage {

    private String msg;

    public LibProjectMessage(String message){
        this.msg = message;
    }

    public String getMessage(){
        return "Message from LibProject : "+this.msg;
    }
}


이제 애플리케이션 프로젝트에서 위 라이브러리 프로젝트를 참조하도록 해야 합니다. 이를 위해 애플리케이션 프로젝트의 빌드스크립트를 수정해야 합니다.  StudioApp의 build.gradle을 다음과 같이 수정합니다.


[build.gradle]

dependencies {

    compile 'com.android.support:appcompat-v7:+'

    compile project(':StudioLib')

}


메이븐 저장소에 있는 라이브러리를 참조하기 사용했던 구문과 유사하게, compile project 구문을 사용하여 같은 프로젝트 내에 있는 라이브러리 프로젝트 모듈인 'StudioLib' 을 참조하도록 지정하였습니다. compile project 내에는 참조할 모듈의 경로를 적어주는데, 프로젝트 최상위 경로를 기준으로 하여 해당 모듈이 존재하는 경로를 적어주면 됩니다. 이 때, 디렉터리 구분자로 콜론(':')을 사용하며, 경로의 가장 앞에서 동일하게 콜론을 붙여줍니다.


만약, 다음과 같은 구조를 가지는 프로젝트에서 


+ SampleProject

    - ApplicationModule (애플리케이션 프로젝트)

    + Libraries

        - SampleLibModule1 (라이브러리 프로젝트)

        - SampleLibModule2 (라이브러리 프로젝트)


ApplicationModule 애플리케이션에서 SampleLibModule1 라이브러리를 참조하도록 설정하려면, dependencies 부분을 다음과 같이 설정하면 됩니다.


dependencies {

    ... (기존에 정의되어있던 항목들) ...

   compile project(':Libraries:SampleLibModule1')

}


Gradle 빌드 스크립트와 안드로이드 스튜디오는 별개로 동작하기 때문에, 빌드스크립트에서 변경된 사항을 안드로이드 스튜디오에 반영하는 절차가 필요합니다. 이를 수행하기 위해 Tools > Sync Project with Gradle Files를 실행합니다. 


그럼, 이제 StudioApp에서 라이브러리 프로젝트의 클래스를 사용해 보겠습니다. 라이브러리 프로젝트에 구현한 LibProjectMessage로부터 받은 문자열을 TextView를 통해 표시하는 간단한 예제입니다. 먼저, 문자열을 표시할 TextView에 다음과 같이 tv_message라는 id를 부여해줍니다.


[fragment_main.xml]

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity$PlaceholderFragment">

    <TextView
        android:id="@+id/tv_message"
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>

다음, LibProjectMessage의 메시지를 화면에 표시하기 위해 다음과 같이 LibProjectMessage 인스턴스를 생성하고,  TextView에 문자열을 출력합니다.


[MainActivity.java]

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);

            LibProjectMessage msg = new LibProjectMessage("Hello, Studio!");

            TextView tv = (TextView) rootView.findViewById(R.id.tv_message);
            tv.setText(msg.getMessage());

            return rootView;
        }
    }

이제 애플리케이션을 실행해 볼 차례입니다. 메뉴에서 Run > Run 'StudioApp' 을 선택하여 우리가 작성한 애플리케이션을 실행합니다. 애플리케이션을 실행하면 다음과 같이 LibProjectMessage 클래스로부터 받은 문자열이 화면에 잘 표시되는 것을 확인할 수 있습니다.