Android Studio에서 Product Flavor 사용

날과 씨


Eclipse가 만든 어떤 앱을 안드로이드 스튜디오로 옮겼을 때, 지금까지 다른 프로젝트로 관리해온 일반판과 프레젠테이션 버전을 하나의 프로젝트로 관리하고 싶어 그때 시도했던 다양한 결과를 메모에 함께 기록했다.

기본 정보


Configuring Gradle Builds

컨디션


Android Studio 2.0 Preview 4

작업 단계


Android Studio 가져오기

  • [File] [New] [Import project]에서 Android Studio로 일반 항목을 가져옵니다.1
  • build.gradle 편집(Modle:app) (중 하나)


    Project Structures부터 수정하는 것이 왕도입니다.
    [File] [Project Structure]가 열립니다.[module][app]를 엽니다.
  • [Flavors]를 엽니다.
  • 화면 아래쪽에 있는 + 버튼을 클릭하여 Flavor를 추가합니다.
  • "Name"에 임의의 이름을 붙입니다.
  • Application Id를 지정합니다.
  • OK 버튼을 클릭하여 저장합니다.
  • build.그냥gradle을 다시 쓰고, 아래처럼'productFlavors'를 추가해도 OK.아니면 이게 더 빨라요.
    android {
      (略)
      productFlavors {
          regular {
              applicationId "com.foo.bar"
          }
          demo {
              applicationId "com.foo.bar.demo"
          }
      }
    }
    

    [참고]

  • 지정하지 않은 곳에는 "defaultConfig"설정값이 사용되므로 Name 및 Application Id만 지정하면 됩니다.
  • 일반판과 프레젠테이션판 두 APK를 만들려면 각각의 Flavor를 등록해야 한다.'default Config'은 일반 버전으로 사용할 수 있을 것 같아서 프레젠테이션 버전용 플라보만 만들면 디버깅, APK 제작 시 프레젠테이션 버전만 만들 수 있어 고민입니다.
  • 프레젠테이션용 소스 코드 추가

  • src 폴더를 마우스 오른쪽 단추로 클릭하고 [New][Directory]를 클릭합니다.
  • "directory name"에 "demo"를 입력하고 OK 버튼을 클릭합니다.
  • 데모 폴더를 마우스 오른쪽 단추로 클릭하고 [New] [Folder] [ava Folder]를 클릭합니다.
  • Finish 버튼을 클릭합니다.
  • 필요에 따라res 등 폴더도 추가됩니다.
  • 데모 폴더 아래의 자바 폴더를 오른쪽 단추로 누르고 [New] [Package]를 누르십시오.2
  • 프레젠테이션 버전에 필요한 코드를 추가합니다(Eclipse의 프레젠테이션 버전 항목에서 복사하면 됩니다).3
  • 항목의 src 폴더를 오른쪽 단추로 눌러서 일반적인 폴더를 추가합니다.4
  • 변경된 프로젝트 구조는 다음과 같다.
    <通常版のみ>                    <通常版+デモ版>
    プロジェクト名                  プロジェクト名
      ┗━app                         ┗━app
         ┗━src                         ┗━src
            ┗━main                        ┣━demo
               ┣━java                     ┃  ┣━java
               ┗━res                      ┃  ┗━res
                                          ┣━main
                                          ┃  ┣━java
                                          ┃  ┗━res
                                          ┗━regular
    

    Android Manifest 추가


    Android Manifest가 결합됩니다.
    Android Manifest가 결합됩니다.
    중요한 일이니까 두 번 말했어.처음에는 이걸 이해하지 못했기 때문에 일반판과 프레젠테이션판 두 개의 아이콘이 나와 고민이 많았다.
    결론적으로 일반 버전과 프레젠테이션 버전, 그리고 공통 부분의 3개의 매니페스트를 만들었다.
    또 방법에 따라 둘 다 갈 수 있다(후술)지만, 매니페스트는 가기 어려워 보여 추천하지 않는다.

    일반판과 프레젠테이션판의 차이


    안드로이드 매니페스트의 추가·수정 내용은 앱 내용에 따라 다를 수 있다고 생각한다.이번 경우 일반판과 시연판은 다음과 같은 차이가 있는데, 여기에 기재된 내용은 이 차이에 따른 내용이다.
    + 시작 시 Activity가 다릅니다.
    + 서비스 등 일부 구성 요소가 다릅니다.
    + 광고 표시에 필요한 권한이 추가됩니다.
    + 라이센스 인증을 하지 않으므로 CHECKLICENSE 권한을 제거합니다.
    + 애플리케이션 이름이 다릅니다.

    일반 매니페스트

  • main 폴더에 있는 안드로이드 매니페스트xml을 엽니다.
  • 일반 버전과 프레젠테이션 버전이 모두 통용되지 않는 구성 요소(activity, 서비스,receiver,provider,uses-perission 등)에 대한 설명을 삭제합니다.
  • 일반 매니페스트

  • regular 폴더를 마우스 오른쪽 버튼으로 클릭하여 [New] [Other] [Android Manifest]를 엽니다.
  • Finish 버튼을 클릭합니다.
  • 작성된 regular/Android Manifest입니다.xml을 엽니다.
  • 일반 버전에만 존재하는 구성 요소에 대한 설명이 추가되었습니다.
  • 이번에는 <uses-permission android:name="com.android.vending.CHECK_LICENSE"/>를 추가했고 일반 버전이 시작될 때의Activity와 차이가 있는 구성 요소를 추가했다.

    데모판 매니페스트

  • 데모 폴더를 마우스 오른쪽 단추로 클릭하고 [New] [Other] [Android Manifest]를 엽니다.
  • Finish 버튼을 클릭합니다.
  • 작성된 regular/Android Manifest입니다.xml을 엽니다.
  • 일반 버전에만 존재하는 구성 요소에 대한 설명이 추가되었습니다.
  • manfest 라벨에 추가xmlns:tools="http://schemas.android.com/tools".
  • 응용 프로그램 탭에 있는 "android: label"을 프레젠테이션 버전의 응용 프로그램 이름으로 변경합니다.
  • 응용 라벨에 추가tools:replace="android:label".
  • 이번에는 광고 디스플레이에 필요한 권한이 추가됐고, 프레젠테이션 시작 시 액티비티와 차이가 있는 구성 요소가 추가됐다.
    또 개작android:label만 하면 경쟁의 오류가 발생하기 때문에 설정tools:replace="android:label"으로 경쟁을 해소한다.

    [참고]

  • 병합된 Manifest는 "Android Studio workspace/프로젝트/app/build/intermediate/manifests/full"의 부하로 출력됩니다.
  • 일반 버전의 Manifest를 만들지 않는 방법


    비스듬히 읽기Manifest Merging, 먼저 시도하는 방법은 다음과 같다.
    main 폴더의 안드로이드 매니페스트xml에 일반 버전 + 공통 구성 요소에 대한 설명을 모두 씁니다. 데모 폴더 아래의 안드로이드 매니페스트입니다.xml에서 필요하지 않은 구성 요소의 탭에 추가 tools:node='remove' 삭제 (물론 프레젠테이션에 필요한 구성 요소의 기술도 추가).
    다만, 해보면 알겠지만, 마니페스트는 읽기가 어려워졌다.

    build.gradle 편집 (Module: app) (2)


    여기까지의 내용과 시위판에 필요한 설정build.gradle에 반영됩니다.일부분은 반영된 것일 수도 있다.

    프리젠테이션 소스 코드의 위치 지정


    위 순서대로 하면 일하지 않아도 반영돼 만일을 대비한다.
  • build.gradle(Module:app)을 엽니다.
  • sourceSets에 다음과 같은 기술을 추가합니다.5
  • sourceSets {
        main {
          (略)
        }
        demo {
            java.srcDirs = ['src/demo/java']
            res.srcDirs  = ['src/demo/res']
        }
    }
    

    광고 갤러리 추가


    프레젠테이션에서만 광고 디스플레이를 사용하는 프로그램 라이브러리를 설정합니다.
  • build.gradle(Module:app)을 엽니다.
  • dependencies에 다음 기술을 추가합니다(libs/ads.jar는 광고 디스플레이용 라이브러리입니다).
  • dependencies {
        (略)
        demoCompile files('libs/ads.jar')
    }
    

    프레젠테이션용 Progruard 설정


    프레젠테이션 버전은 광고 라이브러리에 대응하기 위해 일반 버전과 다른 Progruard 설정을 사용했다.
  • build.gradle(Module:app)을 엽니다.
  • 제품Flavors에 다음과 같은 설명을 추가합니다.
  • productFlavors {
        regular {
          (略)
        }
        demo {
            (略)
            proguardFile('proguard-rules_demo.so')
        }
    }
    

    버전 이름 바꾸기


    애플리케이션 이름과 함께 버전 이름도 변경되었습니다.
  • build.gradle(Module:app)을 엽니다.
  • 제품Flavors에 다음과 같은 설명을 추가합니다.
  • productFlavors {
        regular {
            (略)
            versionName "1.0.0"
        }
        demo {
            (略)
            versionName "1.0.0(demo)"
        }
    }
    

    실행 및 서명을 위한 APK 작성


    실행


    Build Variants를 통해 프리젠테이션 및 일반 버전을 전환할 수 있습니다.
  • Android Studio 창 프레임 왼쪽 아래에 있는 "Build Variants"(이미지 참조)를 클릭합니다.
  • '적용'을 통해 시작할 Build variant을 선택합니다.
  • 실행 버튼을 눌러 실행합니다.

  • 서명 APK 생성


    마지막으로 만들고 싶은 Flavor만 선택하면 다른 것은 바뀌지 않습니다.
    서명을 변경하려면build을 사용하십시오.gradle에 사용할 서명을 지정한 것 같습니다. (확인되지 않았습니다.)
    (참조)Signing Your Applications

    역사를 갱신하다


    2015/12/25 초판
    프레젠테이션 버전의 항목은 가져올 필요가 없습니다. 
    Package를 선택할 수 없는 경우 Android Studio 창의 왼쪽 끝에 있는 "Build Variants"를 열고 "app"를 "demo**"(Debug이든 Release)로 변경합니다.이래도 안 된다면 다이렉트로 포장과 같은 걸 만들면 돼. 
    합병해야 하기 때문에 일반판과 공통된 코드를 추가할 필요가 없다. 
    regular 폴더 밑에 일반 버전의 코드 클래스를 놓아야 하는데 이번에는main 아래에 설정되어 있기 때문에 자바 폴더를 만들지 않았습니다.reglar 폴더의 Android Manifest 뒤에 있습니다.xml만 놓습니다. 
    이번에는 일반 소스를 레귤러에 넣지 않았기 때문에main에 자바가 있어요.srcDirs,res.srcDis의 기록이 없어도 상관없습니다. 

    좋은 웹페이지 즐겨찾기