** 사용 이유

기존에 테스트 서버와 연결되는 앱과 실제 서비스 서버와 연결되는 앱이 따로 설치되기를 희망하였음.

이번에 마이그레이션 작업 진행하며 기존 앱과 따로 설치하여 테스트하기를 희망함.

(기존 앱은 이클립스로 작업)




** 방법

1. 해당 모듈의 build.gradle에 아래와 같은 형식으로 추가

- 나는 마이그레이션/DEV/SERVICE로 나누었음.


flavorDimensions "mode"

    productFlavors {

        migration {

            dimension "mode"

            applicationIdSuffix ".migration"

            buildConfigField 'boolean', 'isTestMode', "true"

        }

//        dev {

//            dimension "mode"

//            applicationIdSuffix ".dev"

//            buildConfigField 'boolean', 'isTestMode', "true"

//        }


        service {

            dimension "mode"

            applicationIdSuffix ""

            buildConfigField 'boolean', 'isTestMode', "false"

        }

    }


flavorDimensions - 무엇인지는 모르겠지만.. flavor 설정 시 모든 항목이 같은 flavorDimensions에 속해야 한다는 에러메세지가 떠서 추가


migration/dev/service - 그냥 자기가 마음대로 설정 가능. 이후 폴더를 생성할 때 동일한 이름으로 생성해야 한다. (대문자가 되는지는 아직 확인하지는 못했다.) 이 때 Flavor가 하나 이상 등록되어있으면 나중에 APK 뽑을 때 Flavor를 무조건 선택해야되서 service를 추가하였음.


applicationIdSuffix - 식별자를 정하는 것 같음. Suffix 설정 시 applicationId 뒤에 붙여지게 된다. 예를 들어 마이그레이션용 앱의 applicationId는 com.example.flavortest.migration 이 되는 식. 나중에 google-services.json 복사 시 문서 내의 applicationID와 동일하게 적어야 한다. service는 기본 설정과 동일하게 해 주기 위해서 빈 값으로 설정하였다.


buildConfigField - 설정하게 되면 BuildConfig 내부에 static 변수로 등록이 되서 소스 코드 내에서 사용이 가능하다. 예를 들어 migration과 dev의 앱에서 BuildConfig.isTestMode는 true지만 service에서는 false가 된다.




2. 각 flavor 별로 폴더 추가



위에서 만든 flavor별로 폴더를 만들고, 내부에 google-services.json을 복사해서 넣는다.

(이제와서 보니 service 폴더랑 main 안의 google-services.json 파일은 없어도 될듯..)


각 flavor별로 리소스 관리를 할 수 있다.

따로 설정하지 않으면 기본(main)폴더 내의 리소스를 사용하는 듯.



이런식으로 앱 아이콘을 따로하고 싶을 때 사용한다. (우측은 플레이 스토어에 등록된 앱, 좌측은 migration flavor로 설치한 앱)




3. google-services.json 수정


google-services.json 파일은 



이렇게 package_name 부분만 변경해주면 된다.


gradle의 applicationId에 위에서 추가했던 applicationIdSuffix 를 더한 문자열을 쓰면 됨.

예를 들어 migration 폴더의 package_name은 "com.example.flavortest.migration"로 변경하면 됨.






4. Manifest 수정(FileProvider 사용 시)


마지막으로 혹시 FileProvider을 정의해서 사용한다면, 혹은 Manifest 파일에서 android:authorities 속성을 사용한다면 android:authorities 속성의 값을 변경해야 한다.

(이렇게 안 하면 앱이 동시에 설치가 안 된다.)


android:authorities="${applicationId}.fileprovider"



이와 같이 applicationId를 변수로 가져오게 수정하여야 한다. 





5. 빌드 시 flavor 선택하기





Build Variants 메뉴를 통해 Run 및 Instant Run 시 어떤 flavor로 실행할 지 선택할 수 있다.







APK 추출 시에는 Flavors 부분에서 선택할 수 있다.

(그런데 Flavors가 하나 이상 등록되어있을 때 선택 해제가 안 된다. 그래서 service Flavor를 따로 만들었음.)








** 참고

http://gun0912.tistory.com/74

https://stackoverflow.com/questions/16267785/install-shows-error-in-console-install-failed-conflicting-provider 

https://medium.com/@iammert/android-product-flavors-1ef276b2bbc1

+ Recent posts