얼마전 한끼족보라는 앱을 릴리즈 했다.
그래서 스토어에서 앱을 다운받아두었고, 이후 개발을 다시 하려고 했다.
Existing package com.hankki.hankkijogbo signatures do not match newer version; ignoring!
이러한 오류가 발생했다. 그리고 다른 방법을 통해서 디버그 버전을 실행시키려 하니 "이미 앱이 존재합니다. 지우고 다시 다운받으시겠어요?" 와 같은 오류가 발생했다.
내가 원하는 것은 Debug앱은 따로 있고, Release앱도 따로 있어서 둘다 다운받아둘 수 있는. 그런 상황을 원한다.
그래서 원인을 찾아보았고, 해결법까지 찾아 적용한 기록을 남긴다.
참고로 지금부터 작성할 모든 gradle파일은 build.gradle.kts(Module :app) 이다.
뭐가 문제일까?
우선 기본적으로 하나의 패키지는 고유한 하나의 앱을 의미한다.
고유하다는 표현에서 느껴지듯 같은 패키지명을 가진 앱은 한 기기에 두개이상 설치될 수 없다.
즉, 구조상 Debug앱과 Release앱은 같은 패키지이기때문에 둘다 설치할 수 없다.
그럼... 이대로 글 끝...?
이면 글을 안썼다. 당연히 해결법이 있고, 공식문서에도 존재한다.
isDebuggable (공식문서)
사용자 모드로 기기에서 실행할 때에도 애플리케이션을 디버그할 수 있는지 여부입니다.
디버그할 수 있으면 "true"이고 디버그할 수 없으면 "false"입니다.
기본값은 "false"입니다.
이 값이 true가 된다면 취약점은 아니지만, 관리 기능에 대한 의도하지 않거나 승인되지 않은 엑세스가 허용되기 때문에 위험에 처할 수 있다. 그렇기 때문에 애플리케이션을 출시할 때에는 반드시 false여야 한다.
하지만, 우리는 debug앱에만 설정할 수 있기 때문에 아래와 같이 debug버전에서는 true로 만들어준다.
android {
...
buildTypes {
debug {
isDebuggable = true
}
}
...
}
applicationIdSuffix
applicationIdSuffix는 말 그대로 패키지명 끝에 추가로 붙여주는 친구다.
Suffix라는 단어에서부터 알듯 접미사로 붙여준다는 이야기이다.
앞서 말했던 것 처럼 같은 패키지인 앱은 하나의 기기에 하나만 설치될 수 있다.
그렇기 때문에 패키지명에 변경을 주어 debug모드와 release 모드를 구분해서 다운로드 받을 수 있게 해준다.
android {
...
buildTypes {
debug {
isDebuggable = true
applicationIdSuffix = ".debug"
}
}
...
}
이렇게 Suffix를 설정해준다면 기존의 패키지명 뒤에 .debug가 붙게 된다
실제로 한끼족보는 com.hankki.hankkijogbo라는 패키지명을 사용하고 있다.
이렇게 설정해둔 debug모드에서는 com.hankki.hankkijogbo.debug 와 같은 패키지명이 된다.
이거만 하면 끝난다.
그렇게 되면 Debug앱과 Release앱을 만들 수 있다.
그렇다면 퀴즈. 둘중 뭐가 Debug앱일까?
정답은 나도 모른다.
그렇기 때문에 앱 이름과 아이콘을 바꿔주는 추가적인 코드를 넣어줘 구분하기 쉽게 해주는 작업을 하면 좋다.
앱 이름 바꾸는 법
물론 string res를 디버그용을 따로 만드는 방법이 있긴 하다.
근데 제일 큰 문제는 그렇게 할줄 모른다는것.
그리고 만약 알았다고 해도 이 방법을 사용했을 것 같다. 이 밑에 Icon을 바꾸는 방법도 알려줄텐데 그 방법과의 통일성을 위해서다.
strings.xml를 들어가면 app_name으로 앱 이름이 있을 것이다.
거기에 dev_app_name을 추가해준다.
<resources>
<string name="app_name">한끼족보</string>
<string name="dev_app_name">블랙족보</string>
</resources>
그 후 build.gradle에 가서 아래와 같이 설정해준다.
android {
...
buildTypes {
debug {
...
manifestPlaceholders["appName"] = "@string/dev_app_name"
...
}
release {
...
manifestPlaceholders["appName"] = "@string/app_name"
...
}
}
...
}
릴리즈 모드와 디버그 모드에서 다른 appName을 설정해준다.
그 후 Android Manifest에서 label을 이렇게 설정해주면 된다.
android:label="${appName}"
이렇게 한다면 앱의 이름이 디버그 모드와 릴리즈 모드가 달라져 있을 것이다.
아이콘도 바꿔보자
res에 마우스 오른쪽을 누르고 Image Asset을 눌러보자. 멀티모듈이라면 App 모듈에서 하면 된다.
그후 마음에 드는 이미지를 넣어주고, 이름을 dev_ic_launcer로 설정하고 next를 눌러 생성해준다.
그 다음 단계는 똑같다.
build.gradle에 가서 아래와 같이 설정해준다.
android {
...
buildTypes {
debug {
...
manifestPlaceholders["appIcon"] = "@mipmap/dev_ic_launcher"
manifestPlaceholders["roundAppIcon"] = "@mipmap/dev_ic_launcher_round"
...
}
release {
...
manifestPlaceholders["appIcon"] = "@mipmap/ic_launcher"
manifestPlaceholders["roundAppIcon"] = "@mipmap/ic_launcher_round"
...
}
}
...
}
그 후 Android Manifest에서 icon을 이렇게 설정해주면 된다.
android:icon="${appIcon}"
android:roundIcon="${roundAppIcon}"
이렇게 해준다면 정말 간단하게 설정이 완료되었다.
물론 앱 이름만 달라도 구분하는데는 문제가 없지만... 아이콘도 다르면 귀엽지 않은가? ㅎ.ㅎ
이렇게 다르게 설정하고 편하게 빌드하고 개발하면 된다
글이 도움이 되었다면 앱도 한번 구경해보세요 ㅎ.ㅎ
https://play.google.com/store/apps/details?id=com.hankki.hankkijogbo