태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

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

2013.11.16 19:10

저번 포스트 (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 클래스로부터 받은 문자열이 화면에 잘 표시되는 것을 확인할 수 있습니다.









저작자 표시 비영리 변경 금지
신고

커니 개발환경 설정/Tools , , , , , , , , , , , , , , , , , , ,

  1. 안녕하세요!
    모듈추가해서 라이브러리 추가하는 과정 정말 자세히 읽었는데요!
    혹시나 한가지 질문 드려도 될까요?

    기존에 있는 library를 추가하기 위해서는 어떻게 해야될까요?
    stackoverflow에서 찾아 볼 때는 대부분 사람들이 0.3.2 버전 부터 project structure가 생긴게 좀 바뀌면서
    다들 많이 혼동해서 제대로 된 답을 찾기 어려워서 찾다가 이렇게 질문드리게 됬습니다!

    혹 말씀해주신다면 정말 감사하겠습니다!

  2. 그리고 추가로!

    defaultConfig 밑에
    buildTypes {
    release {
    runProguard true
    proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
    }
    }
    productFlavors {
    defaultFlavor {
    proguardFile 'proguard-rules.txt'
    }
    }

    이 항이 추가로 있는데 이건 제가 설정을 잘못해서 그런건가요?

    그리고 tools 에서 sync with gradle을 했을 때

    Error:Gradle:Execution failed for task ':Lib:proguardRelease'
    >Could not call ProGuardTask.proguard()on task ':Lib:proguardRelease'

    라는 에러가 뜹니다 이건 왜그런걸 까요 ㅠㅠ

  3. Blog Icon
    신정훈

    https://github.com/astuetz/PagerSlidingTabStrip
    이 라이브러리 추가를 위해 계속 이것저것 해보고 있는데요,
    new module 추가할 때 root를 저 library가 위치한 폴더로 지정을 한 다음,

    Create Activity, 등의 선택사항을 하나씩 바꿔가면서 3가지로 모듈을 만들어서 실행했는데
    어떨 때는 에러가 없는데 어떨 때는 또 위에서 말씀드렸던 proguardRelease 가 발생합니다.....흑

    그리고 또 제일 중요한 모듈안에 추가한 라이브러리의 java 파일조차도 나타나지가 않습니다ㅠㅠ

    말을 할 수 있는데가 이 곳 뿐이여서 염치 불구하고 자꾸 남기게 되네요..