애플리케이션 ID 설정

모든 Android 앱에는 com.example.myapp과 같이 자바 패키지 이름처럼 보이는 고유한 애플리케이션 ID가 있습니다. 이 ID 덕분에 기기와 Google Play 스토어에서 각 앱을 고유하게 식별할 수 있습니다. 새로운 앱 버전을 업로드하려면 애플리케이션 ID와 로그인할 때 사용할 인증서가 원래의 APK와 같아야 합니다. 애플리케이션 ID를 변경할 경우 Google Play 스토어에서는 APK를 완전히 다른 앱으로 취급하게 됩니다. 따라서 일단 앱을 게시한 후에는 절대로 애플리케이션 ID를 변경하지 마세요.

애플리케이션 ID는 다음과 같이 모듈의 build.gradle 파일에 있는 applicationId 속성으로 정의됩니다.

android {
        defaultConfig {
            applicationId "com.example.myapp"
            minSdkVersion 15
            targetSdkVersion 24
            versionCode 1
            versionName "1.0"
        }
        ...
    }
    

Android 스튜디오에서 새 프로젝트를 생성하면 applicationId는 설치 과정 중에 선택한 자바 스타일 패키지 이름과 정확히 일치합니다. 하지만 애플리케이션 ID와 패키지 이름은 이 시점 이후로는 서로 관련이 없습니다. 코드의 패키지 이름(코드 네임스페이스)을 변경할 수 있으며 이름을 변경하더라도 애플리케이션 ID에 영향을 주지 않고 그 반대도 마찬가지입니다. 단, 이때도 일단 앱을 게시한 후에는 애플리케이션 ID를 변경하면 안 됩니다. 그러나 패키지 이름을 변경하면 다른 결과가 발생한다는 점을 알고 있어야 합니다. 패키지 이름 변경 방법에 관한 섹션을 참조하세요.

애플리케이션 ID는 기존의 자바 패키지 이름과 같은 형태이지만 애플리케이션 ID의 명명 규칙은 다음과 같이 좀 더 제한적입니다.

  • 이름은 두 개 이상의 세그먼트(한 개 이상의 점)로 구성해야 합니다.
  • 각 세그먼트는 문자로 시작해야 합니다.
  • 모든 문자는 영숫자나 밑줄[a~z, A~Z, 0~9 또는 _]이어야 합니다.

참고: 전에는 애플리케이션 ID가 코드의 패키지 이름과 직접 연결되었으므로, 일부 Android API는 메서드 이름과 매개변수 이름에 '패키지 이름'이라는 용어를 사용합니다. 그러나 이는 실제로 애플리케이션 ID입니다. 예를 들어 Context.getPackageName() 메서드는 애플리케이션 ID를 반환합니다. 코드의 실제 패키지 이름을 앱 코드 외부에서 공유할 필요가 없습니다.

주의: WebView를 사용하는 경우 애플리케이션 ID에서 패키지 이름을 접두사로 사용하는 것이 좋습니다. 그렇게 하지 않으면 문제 211768에 설명된 것과 같은 문제가 발생할 수 있습니다.

빌드 변형을 위해 애플리케이션 ID 변경

앱의 APK를 빌드할 때 아래에 나오는 것처럼 빌드 도구는 build.gradle 파일에서 defaultConfig 블록에 정의된 애플리케이션 ID로 APK의 태그를 지정합니다. 그러나 Google Play 스토어에서 다양한 앱 버전('free' 및 'pro' 버전)이 별도의 목록으로 표시되도록 하려면 애플리케이션 ID가 서로 다른 별개의 빌드 변형을 만들어야 합니다.

이 경우에는 각 빌드 변형을 별개의 제품 버전으로 정의해야 합니다. productFlavors 블록 내부의 각 버전에 applicationId 속성을 재정의하거나, 아래와 같이 applicationIdSuffix를 사용하여 기본 애플리케이션 ID에 세그먼트를 대신 추가할 수 있습니다.

android {
        defaultConfig {
            applicationId "com.example.myapp"
        }
        productFlavors {
            free {
                applicationIdSuffix ".free"
            }
            pro {
                applicationIdSuffix ".pro"
            }
        }
    }
    

이렇게 하면 'free' 제품 버전의 애플리케이션 ID는 'com.example.myapp.free'가 됩니다.

아래와 같이 빌드 유형을 기반으로 applicationIdSuffix를 사용하여 세그먼트를 추가할 수도 있습니다.

android {
        ...
        buildTypes {
            debug {
                applicationIdSuffix ".debug"
            }
        }
    }
    

Gradle은 제품 버전 뒤에 빌드 유형 구성을 적용하기 때문에 'free debug' 빌드 변형의 애플리케이션 ID는 'com.example.myapp.free.debug'입니다. 이는 디버그와 릴리스 빌드를 모두 같은 기기에 두려고 할 때 유용합니다. 두 APK의 애플리케이션 ID가 같을 수는 없기 때문입니다.

Google Play 스토어에서는 애플리케이션 ID가 서로 다른 APK는 다른 앱으로 취급됩니다. 그래서 대신에 같은 앱 등록정보를 사용해 서로 다른 기기 구성(예: API 레벨)을 타겟팅하는 여러 API를 배포하려는 경우에는 각 빌드 변형에 같은 애플리케이션 ID를 사용하되, 각 APK에 다른 versionCode를 부여해야 합니다. 자세한 내용은 다중 APK 지원을 참조하세요.

주의: 이전 SDK 도구 호환성을 위해, build.gradle 파일에서 applicationId 속성을 정의하지 않으면 빌드 도구는 AndroidManifest.xml 파일의 패키지 이름 애플리케이션 ID로 사용합니다. 이 경우 패키지 이름을 리팩터링하면 애플리케이션 ID도 변경됩니다.

팁: manifest 파일에서 애플리케이션 ID를 참조해야 하는 경우 임의의 manifest 속성에 ${applicationId} 자리표시자를 사용할 수 있습니다. 빌드하는 동안 Gradle은 이 태그를 실제 애플리케이션 ID로 교체합니다. 자세한 내용은 빌드 변수를 manifest에 삽입을 참조하세요.

테스트를 위해 애플리케이션 ID 변경

기본적으로 빌드 도구는 지정된 빌드 변형의 애플리케이션 ID(.test 포함)를 사용하여 계측 테스트 APK에 애플리케이션 ID를 적용합니다. 예를 들어 com.example.myapp.free 빌드 변형의 테스트 APK에는 애플리케이션 ID com.example.myapp.free.test가 있습니다.

반드시 필요한 것은 아니지만, defaultConfig 또는 productFlavor 블록에서 testApplicationId 속성을 정의하여 애플리케이션 ID를 변경할 수 있습니다.

패키지 이름 변경

프로젝트의 패키지 이름이 기본적으로 애플리케이션 ID와 일치할지라도 이를 변경할 수 있습니다. 그러나 패키지 이름을 변경하려면 다음과 같이 패키지 이름(프로젝트 디렉터리 구조에서 정의)이 항상 AndroidManifest.xml 파일의 package 속성과 일치해야 합니다.

<?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.myapp"
        android:versionCode="1"
        android:versionName="1.0" >
    

Android 빌드 도구는 다음 두 가지 이유로 package 속성을 사용합니다.

  • 빌드 도구는 앱에서 생성된 R.java 클래스의 네임스페이스로 이 이름을 적용합니다.

    예: 위의 manifest를 사용하면 R 클래스는 com.example.myapp.R이 됩니다.

  • 빌드 도구는 package 속성을 사용하여 manifest 파일에 선언되어 있는 상대 클래스 이름을 확인합니다.

    예: 위의 manifest를 사용하면 <activity android:name=".MainActivity">로 선언된 활동은 com.example.myapp.MainActivity로 확인됩니다.

이와 같이 package 속성에 있는 이름은 활동 및 기타 앱 코드를 유지하는 프로젝트의 기본 패키지 이름과 항상 일치해야 합니다. 물론 프로젝트에 하위 패키지가 있을 수 있지만 그에 포함된 파일은 package 속성에서 네임스페이스를 사용하여 R.java 클래스를 가져와야 하고, manifest에 선언된 모든 앱 구성요소는 누락된 하위 패키지 이름을 추가하거나 정규화된 패키지 이름을 사용해야 합니다.

패키지 이름을 완전히 리팩터링하려면 package 속성도 업데이트해야 합니다. Android 스튜디오의 도구를 사용하여 패키지 이름을 바꾸고 리팩터링하는 한, 패키지는 자동으로 동기화된 상태로 유지됩니다. (동기화된 상태로 유지되지 않으면 R 클래스가 더 이상 같은 패키지에 유지되지 않으므로 앱 코드가 이 클래스를 확인할 수 없고 manifest가 활동 및 기타 구성요소를 식별하지 못합니다.)

프로젝트의 기본 AndroidManifest.xml 파일에서 항상 package 속성을 지정해야 합니다. 제품 버전 또는 빌드 유형에 추가 manifest 파일이 있는 경우, 우선순위가 가장 높은 manifest 파일을 통해 제공되는 패키지 이름이 최종적으로 병합된 manifest에 항상 사용된다는 점에 유의하세요. 자세한 내용은 여러 manifest 파일 병합을 참조하세요.

하나 더 알아야 할 사항: manifest package 및 Gradle applicationId의 이름이 다를 수 있지만, 빌드 도구는 빌드 종료 시 애플리케이션 ID를 APK의 최종 manifest 파일로 복사합니다. 따라서 빌드 후 AndroidManifest.xml 파일을 검사할 때 package 속성이 변경되어도 놀라지 마세요. package 속성은 Google Play 스토어와 Android 플랫폼이 앱을 식별하기 위해 실제로 살펴보는 대상이므로, 빌드에서 원래 값을 사용하여 R 클래스에 네임스페이스를 지정하고 manifest 클래스 이름을 확인하고 나면 원래 값을 버리고 애플리케이션 ID로 대체합니다.