2016년 10월 6일 목요일

[안드로이드] Gradle로 여러가지 버전 생성하기

Gradle로 여러가지 버전 생성하기

  • Gradle은 하나의 프로젝트에서 여러가지 버전의 APK를 생성할 수 있도록 지원한다.
  • Build Variants = BuildType + Product Flavor
  • Gradle을 이용하면 Build Variants 별로 각각 다른 APK를 한번에 생성할 수 있다.

BuildType

  • 일반적으로 애플리케이션의 개발 과정에 따라 나뉠 수 있다.(debugalphabetarelease 등)
  • 안드로이드 프로젝트를 처음 생성하면 Gradle은 기본적으로 debugrelease의 빌드타입을 생성한다.
  • 빌드타입에 따라 키스토어 적용 여부, 디버그모드 허용 여부, 프로가드 적용 여부 등을 다르게 설정할 수 있다.
  • 빌드타입 별로 소스코드, 리소스를 다르게 적용할 수 있다.(이 후의 SourceSet 부분 참조)
  • 모듈별 build.gradle 스크립트에 buildTypes 속성을 추가하고 원하는 빌드타입을 추가한다.
  • 다음 예시는 alphabetarelease 빌드타입을 추가한 것이다.
android {
    ...
    buildTypes {
        alpha {
            applicationIdSuffix '.alpha'
            debuggable true
            minifyEnabled false
        }
        beta {
            applicationIdSuffix '.beta'
            debuggable true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            applicationIdSuffix '.release'
            debuggable false
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    ...
}

Product Flavor

  • 동일한 앱의 서로 다른 버전을 의미(ex : free버전, paid버전 등)
  • 안드로이드 프로젝트를 처음 생성하면 Product Flavor는 존재하지 않는다.
  • 이 속성에 따라 applicationId, 버전코드, 버전명 등, 앱의 속성을 다르게 설정할 수 있다.
  • 빌드타입과 마찬가지로 소스코드, 리소스를 다르게 적용할 수 있다.
  • 모듈별 build.gradle 스크립트에 productFlavors 속성을 추가하고 원하는 flavor들을 추가한다.
  • 다음 예시에서는 freepaid 를 추가한 것이다.
android {
    ...
    productFlavors {
        free {
            applicationId 'com.test.app.free'
            versionCode 2
            versionName '1.0.1'
        }
        paid {
            applicationId 'com.test.app.paid'
            versionCode 1
            versionName '1.0.0'
        }
    }
    ...
}

Source Set

  • Gradle은 Build Variants의 소스코드, 리소스를 각각 다르게 설정할 수 있다.
  • 지정하고자 하는 디렉터리들을 미리 생성해두어야 한다.
  • BuildType과 ProductFlavor의 조합을 각각 지정할 수도 있고, 필요한 경우만 지정할 수도 있다.
    • BuildType과 ProductFlavor를 조합하여 지정할 경우 ProductFlavor+BuildType의 순서로 작성한다.
    • ex) debug & free => freeDebug
  • 다음의 예시는 위의 Build Variants를 각각 지정하여 변경한 것이다.
android {
    ...
    sourceSets {
        // main은 디폴트 위치
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'
            java.srcDirs = ['src/main/java']
            res.srcDirs = ['src/main/res']
        }
        // Product Flavor만 따로 지정하는 경우
        free {
            manifest.srcFile 'src/free/AndroidManifest.xml'
            java.srcDirs = ['src/free/java']
            res.srcDirs = ['src/free/res']
        }
        paid {
            manifest.srcFile 'src/paid/AndroidManifest.xml'
            java.srcDirs = ['src/paid/java']
            res.srcDirs = ['src/paid/res']
        }
        // Build Type만 따로 지정하는 경우
        debug {
            res.srcDirs = ['src/main/resDebug']
        }
        alpha {
            res.srcDirs = ['src/main/resAlpha']
        }
        beta {
            res.srcDirs = ['src/main/resBeta']
        }
        release {
            res.srcDirs = ['src/main/resReal']
        }
        // 둘을 조합하여 지정하는 경우
        freeDebug {
            res.srcDirs = ['src/free/resDebug']
        }
        freeAlpha {
            res.srcDirs = ['src/free/resAlpha']
        }
        freeBeta {
            res.srcDirs = ['src/free/resBeta']
        }
        freeRelease {
            res.srcDirs = ['src/free/resReal']
        }
        paidDebug {
            res.srcDirs = ['src/paid/resDebug']
        }
        paidAlpha {
            res.srcDirs = ['src/paid/resAlpha']
        }
        paidBeta {
            res.srcDirs = ['src/paid/resBeta']
        }
        paidRelease {
            res.srcDirs = ['src/paid/resReal']
        }
    }
    ...
}

변경 내용 확인하기

  • 안드로이드 스튜디오의 Project 인스펙터를 연다. (맥 단축키 cmd + 1)
  • 왼쪽 하단의 Build Variants를 선택하면 Project 인스펙터 하단에 Build Variants 인스펙터가 열린다.
  • 모듈별로 Variants를 선택할 수 있는데, variants를 선택하면 Project 인스펙터에서 선택된 폴더를 확인할 수 있다.
BuildType

댓글 없음:

댓글 쓰기