Android Graddle Build Variant 구분하기

태그
Build Variant. 언제 사용하는가?
보통 빌드 유형을 구분하는 이유는 여러가지가 있지만 가장 대표적으로는 디버그 버전(개발시 사용하는 앱)과 릴리즈 버전(프로덕션용, 실제 사용자에게 배포되는 앱)으로 구분할 수 있다. 가령 디버그 버전에서만 개발자가 테스트하기에 용이하게끔 테스트 인터페이스를 삽입한다던가, 디버깅시에만 확인 가능하도록 별도의 로그나 UI를 표시하는 경우가 있다.
 
이 밖에도 빌드 유형이 아닌 프로덕트 플레이버(Product Flavor)도 존재한다. Product Flavor는 가령 사용자가 앱의 서비스를 구독하여 사용하는 버전인 경우거나 무료로만 일부 기능을 제공하는 경우로 나뉘어 배포가 필요한 앱인 경우 유용하게 사용된다. 실제 플레이스토어에 올라와 있는 여러 앱들 중 보면 무료 버전인 경우와 유료 버전의 앱을 나누어서 서비스하는 앱들이 있다. 이 때 각각의 앱을 별도의 프로젝트에서 빌드하는 것이 아니라 동일한 프로젝트에서 Graddle의 프로덕트 플레이버 설정만 바꾸는 것으로도 쉽게 배포가 가능하다.
 
설정 방법
 
 
릴리즈 버전에서도 디버깅 버전과 마찬가지로 로깅하는 것이 가능하다. 이때 다음과 같이 debuggable 설정을 true로 바꿔야 한다.
동일한 디바이스에대해 같은 앱인데 Build 타입을 구분해 여러 앱을 동시에 설치하려는 경우 INSTALL FAILED CONFLICTING PROVIDER 에러가 뜨는 경우가 있다.
이는 이미 똑같은 앱이 디바이스에 존재한다고 인식하여 에러가 뜨는데 다음과 같은 방법으로 해결 가능하다.
 
  1. Firebase나 구글 Ad나 애널리틱스를 사용하면 google-service.json을 가지고 있게 된다. 이때 google-service.json 복사하여 붙여넣어야 한다 (app/src/debug)폴더에 생성해야함
  1. authorities 속성 ${applicationId}... 로 바꿔주기(eg. Provider 태그)
  1. 앱 이름의 경우도 마찬가지로 디버그 앱/릴리즈 앱 구분을 위해 속성 바인딩 해주는 게 좋음.
    1. 아니면 Manifest를 병합시키는 것도 하나의 방법이다. 다음을 참고하자
 
만약 안드로이드 AppLink (또는 Deep Link) 를 사용한다면 이때 문제가 발생할 수 있다. 동일한 링크에 대해 처리하는 앱이 디버그 버전과 릴리즈 버전이 겹치게 된다. 따라서 만약 디버그 앱에서 처리해야할 앱 링크인데 엉뚱하게 릴리즈앱에서 수신하게 되어 정상적으로 테스트가 어려워 진다.
이러한 경우에는 어쩔 수 없이 릴리즈 버전의 앱과 디버그 버전의 앱이 수신하는 링크를 다르게 처리해주는 수 밖에 없다.
이렇게 빌드 타입에 따라 앱링크 수신 URL을 바꾸려면 매니페스트를 병합하는 방법을 사용하면 쉽게 해결 가능하다.
 
/project/module/build/intermediates/manifests/full/debug/AndroidManifest.xml 에서 병합된 매니페스트 파일을 확인 할 수 있다.
 
참조 자료