포스팅 OS : Mac

검색어 : 안드로이드(Android), 자바(Java), 라이브러리(Library), 모듈(Module), 생성(Create), 변환(Convert), 참조(reference)

 

 

오늘 포스팅 할 내용은 빌드 가능한 라이브러리 모듈 생성 방법 입니다. 여기서 '빌드 가능한' 이라는 뜻은 안드로이드 스튜디오(Android Studio)로 오픈(Open) 했을 때 빌드가 가능하다는 것을 의미합니다. 이 말이 무엇을 뜻하는 것인지는 안드로이드 스튜디오로 라이브러리를 제작해보신 분들이라면 쉽게 이해하셨겠지만 모르는 분들을 위해 간략하게 설명을 하도록 하겠습니다.

 

안드로이드 스튜디오에서 라이브러리를 생성할 때 기본적으로 앱 프로젝트를 생성 후 그 앱에 라이브러리를 추가하는 방식으로 밖에 생성하지 못합니다. 물론 제가 아는 한도내에서는 말이죠. 바로 라이브러리를 생성할 수 있는 선택 메뉴가 없습니다. 

 

물론 전자의 방법으로 라이브러리를 추가해서 개발을 진행해도 되지만 Git과 같은 저장소에 업로드 할 때 라이브러리 폴더만 덩그라니 올리게 되면 그 라이브러리가 제대로 작동하는지 확인하기 위해서는 앱 프로젝트를 생성하여 라이브러리를 삽입하거나 애초에 Git에 업로드 할 때 앱 프로젝트까지 같이 올리는 수 밖에 없게됩니다. 

 

이러한 점이 불편해서 문득 라이브러리만 빌드가 가능하다면 좋겠다라는 생각이 들어서 이 포스팅을 계획하게 되었습니다. 제 의도가 글로 충분히 전해졌는지 모르겠네요. 그럼 시작하겠습니다.

 

 

1. 라이브러리 모듈 생성을 위한 앱 프로젝트 생성

 

위에서 그렇게 앱 프로젝트에 의존적이지 않은 라이브러리 모듈을 생성하겠다고 떠들었는데 앱 프로젝트를 생성한다고 하니 의아하신 분들도 있을 겁니다. 엄밀히 말하면 이 포스팅은 앱 프로젝트를 라이브러리 모듈로 변환(Convert)하는 포스팅이라 보시면 됩니다. 애초에 안드로이드 스튜디오에서 라이브러리 모듈을 바로 생성하는 것은 지원하지 않으니 약간의 변칙을 사용하는 것입니다.

 

아래 그림의 순서를 따라 액티비티가 없는 앱 프로젝트를 생성하세요.

 

1) New Project

 

 

 

2) Minimum SDK 지정

 

 

 

3) No Activity 옵션 선택 후 Finish 버튼을 눌러 프로젝트 생성

 

 

 

4) 프로젝트를 생성한 후에는 파인더로 해당 프로젝트의 폴더로 이동합니다. 그리고 아래 그림처럼 app 폴더 앞에서 libs, src, build.gradle 파일을 선택하여 상위 폴더(프로젝트 폴더)로 옮겨주세요. 그리고 app 폴더는 삭제합니다. 

 

- 이 과정을 하는 이유는 나중에 지금 만든 라이브러리를 다른 앱에 넣을 경우 module 명을 app이 아닌 라이브러리 이름(이 포스팅에선 module 이겠죠?)으로 적용하게 하기 위해서 입니다.

 

 

 

 

 

 

 

 

5) 방금 app 폴더에서 상위 폴더로 꺼낸 src 폴더에서 레이아웃이 들어 있는 res폴더를 마찬가지로 프로젝트 폴더로 꺼내주세요. 

 

- 이 부분은 개인 취향입니다. 폴더 위치를 자기 맘대로 정하는 것이 해도 그만 안해도 그만 입니다만 나중에 gradle에서 sourceSet으로 path를 정해줄때 제대로 적용만 하면 됩니다.

 

 

 

 

 

 

6) 윗 단계까지 폴더정리가 끝났으면 이제 gradle에서 변경된 폴더의 위치를 잡아줄 차례입니다. 아래 그림처럼 일단 settings.gradle에서 app으로 지정된 부분을 삭제합니다. 

 

- 변경 전

 

 

 

 

 

 

 

 

 

- 변경 후

 

 

 

 

 

 

7) 이번에는 build.gradle에서 아래 그림과 같이 변경해주시고 sync 해주시면 빌드가 됩니다. 

- 필수 변경 사항

-> apply plugin : 'com.adroid.application' -> 'com.adroid.library' 변경

-> applicationId 삭제

 

(글씨가 작아서 안보이시면 사진 클릭하시면 크게 보입니다.)

- 변경 전 

 

 

- 변경 후

 

 

 

- Java 버전

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

apply plugin: 'com.android.library'

android {
    compileSdkVersion 26
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['res']
        }
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    repositories {
        google()
        jcenter()
    }
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
}

- Kotlin 버전

buildscript {
    ext.kotlin_version = '1.3.20'
    repositories {
        google()
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
    }
}

apply plugin: 'com.android.library'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 28
    defaultConfig {
        minSdkVersion 19
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['res']
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
}

 

 

 

8) 빌드가 된 것을 확인 했으면 라이브러리 테스트용 클래스를 하나 만들어 주세요. 아래 그림과 똑같이 만드셔도 되고 본인이 직접 알아서 만드셔도 됩니다.

 

 

 

 

 

 

-----------------------------------------------------------------

 

자 여기까지 완료하셨으면 빌드 가능한 라이브러리 모듈을 만드는데 성공하셨습니다. 

 

여기까지 오셨는데도 왜 굳이 이렇게 힘들게 빌드 가능한 라이브러리 모듈을 만들어야 하는가에 대해 궁금증이 있으신 분이 있으신가요? 

생각해보시면 간단합니다. 라이브러리 모듈만 따로 만들고 싶고 그 라이브러리 모듈이 에러가 있는지 없는지 자체적으로 확인을 하고 싶을때 이 방법을 사용하시면 됩니다. 

 

그리고 가장 중요한 이유로 라이브러리 모듈 프로젝트를 따로 관리하면서 다른 앱 프로젝트에서 라이브러리를 복사해서 넣는게 아닌 참조하여 관리하고 싶을때 사용하시면 굉장히 편리합니다. 

 

 

 

 

 

 

2. 앱 프로젝트에 생성한 라이브러리 모듈 참조하기 

 

그럼 이제 만든 라이브러리를 앱에 넣어서 사용해 볼까요?

참고로 라이브러리를 넣는 방법으로 import module 하시면 해당 라이브러리 폴더를 그대로 복사하여 앱 프로젝트에 넣습니다. 그럴 경우 이렇게 힘들게 라이브러리를 만들 필요가 없습니다. 그냥 new module로 앱 프로젝트에 의존적인 라이브리를 만드시면 됩니다. 그래서 이번엔 참조하여 라이브러를 넣는 방법을 사용하겠습니다. 

 

참조한다는 것은 sourceSet의 개념과 비슷합니다. 라이브러리를 넣은 앱 프로젝트에서 라이브러리를 수정하면 실제 따로 관리되는 라이브러리 모듈에서도 똑같이 적용됩니다. 바로 이것이 이렇게 힘들게 라이브러리 모듈을 만든 궁극적인 이유입니다. 

 

라이브러리를 제작하게 되면 바로 테스트 가능한 앱도 필요하기 때문에 앱에 의존적으로 라이브러리를 생성하도록 해놓은 것 같지만 Git같은 저장소에 업로드 할때는 테스트앱을 제외하고 라이브러리만 올려야 관리가 간편하기 때문에 이런 방법을 생각해 내었습니다. 올리되 빌드가 가능하면 더욱 관리가 편해질 것 같아서요.

 

 

1) 앱 프로젝트 생성

 

 

 

 

 

 

2) settings.gradle에 라이브러리 모듈 추가

 

 

 

 

 

 

 

 

3) 라이브러리가 목록에 추가된 것 확인

 

 

 

 

 

4) build.gradle에서 라이브러리 compile 

 

- 라이브러리 참조 후 compile 과정을 거쳐야 실제로 사용이 가능합니다.

 

 

 

 

 

5) 테스트 액티비티 제작

 

 

 

 

 

6) 실행 확인

 

 

 

 

 

 

 

 

 

 

 

 

 

 

늘 이야기 하지만 제 포스팅은 어느정도 안드로이드 개발이 가능한 분들을 대상으로 하기에 기초적인 설명은 최대한 배제하고 있습니다. 혹시라도 이해가 안되거나 설명이 부족하다고 느끼신다면 공부를 좀 더 하고 보실 것을 권장합니다.

 

누군가 가르쳐 주는 것은 자신의 실력을 업그레이드 하는데 큰 도움이 되지 않습니다. 스스로 해결하려고 노력하는 것이 더 중요하죠. 어려움이 닥치면 물어보기 보단 먼저 스스로 해결해보려고 노력하는 습관을 갖는 것이 중요합니다.

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts