앱 모듈 구성

이 페이지에서는 전환하려는 모듈 수준 build.gradle 파일에서 사용할 수 있는 유용한 앱 설정에 관해 설명합니다. build.gradle 파일에 설정된 중요한 속성의 개요 외에 다음을 수행할 수 있는 방법도 설명합니다.

  • 여러 빌드 구성을 위해 애플리케이션 ID 변경
  • 애플리케이션 ID와 관계없이 안전하게 네임스페이스 조정

애플리케이션 ID 설정

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

아래에 나오는 것처럼 애플리케이션 ID는 모듈의 build.gradle 파일에 applicationId 속성으로 정의됩니다.

Groovy

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

Kotlin

android {
    defaultConfig {
        applicationId = "com.example.myapp"
        minSdk = 15
        targetSdk = 24
        versionCode = 1
        versionName = "1.0"
    }
    ...
}

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

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

Android 스튜디오에서 새 프로젝트를 생성하면 applicationId에는 설치 과정 중에 선택한 자바 스타일 패키지 이름이 자동으로 할당됩니다. 그 이후 그 두 가지 속성을 독립적으로 전환할 수는 있지만 이는 권장하지 않습니다.

애플리케이션 ID를 설정할 때 권장되는 사항은 다음과 같습니다.

  • 애플리케이션 ID를 네임스페이스와 동일하게 유지합니다. 두 속성의 차이가 약간 혼란스러울 수 있지만 동일하게 유지한다면 아무것도 걱정할 필요가 없습니다.
  • 앱을 게시한 후에는 애플리케이션 ID를 변경하지 마세요. 애플리케이션 ID를 변경하면 Google Play 스토어는 이후 업로드를 새 앱으로 취급합니다.
  • 애플리케이션 ID를 명시적으로 정의합니다. applicationId 속성을 사용하여 애플리케이션 ID가 명시적으로 정의되지 않으면 자동으로 네임스페이스와 동일한 값이 사용됩니다. 즉, 네임스페이스를 변경하면 애플리케이션 ID가 변경되는데 이는 대부분의 경우 바람직하지 않습니다.

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

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

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

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

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

네임스페이스 설정

모든 Android 모듈에는 생성된 RBuildConfig 클래스의 자바 패키지 이름으로 사용되는 네임스페이스가 있습니다.

다음 코드 스니펫에 나오는 것처럼 네임스페이스는 모듈의 build.gradle 파일에 namespace 속성으로 정의됩니다. 처음에 namespace프로젝트를 생성할 때 선택한 자바 스타일 패키지 이름으로 설정됩니다.

android {
    namespace 'com.example.myapp'
    ...
}

앱을 최종 애플리케이션 패키지(APK)로 빌드하는 동안 Android 빌드 도구는 네임스페이스를 앱에서 생성된 R 클래스(앱 리소스에 액세스하는 데 사용됨)의 네임스페이스로 사용합니다. 예를 들어 위의 빌드 파일에서 R 클래스는 com.example.myapp.R에 생성됩니다.

이와 같이 build.gradle 파일의 namespace 속성에 설정한 이름은 활동 및 기타 앱 코드를 유지하는 프로젝트의 기본 패키지 이름과 항상 일치해야 합니다. 물론 프로젝트에 다른 하위 패키지가 있을 수도 있지만, 해당 파일들은 namespace 속성의 네임스페이스를 사용하여 R 클래스를 가져와야 합니다.

더 간단한 워크플로를 위해 네임스페이스를 애플리케이션 ID와 동일하게 유지해야 합니다. 기본적으로 동일하기 때문입니다.

네임스페이스 변경

편의상 네임스페이스와 애플리케이션 ID는 동일하게 유지하려고 해야 합니다. 기본적으로 동일하기 때문입니다. 그러나 코드를 재구성하거나 네임스페이스 충돌을 방지하기 위해 특정 시점에 네임스페이스를 변경해야 할 수도 있습니다. 이러한 경우에는 애플리케이션 ID와 관계없이 모듈의 build.gradle 파일에서 namespace 속성을 업데이트하여 네임스페이스를 변경할 수 있습니다. 이렇게 하려면 애플리케이션 ID가 명시적으로 정의되어 있어야 합니다. 그래야 네임스페이스를 변경해도 애플리케이션 ID가 똑같이 변경되지 않습니다. 네임스페이스가 애플리케이션 ID에 미치는 영향에 관한 자세한 내용은 애플리케이션 ID 설정을 참고하세요.

namespace와 Gradle applicationId의 이름이 서로 다른 경우 빌드 도구는 빌드가 종료될 때 앱의 최종 매니페스트 파일에 애플리케이션 ID를 복사합니다. 따라서 빌드 후에 AndroidManifest.xml 파일을 검사해 보면 package 속성이 애플리케이션 ID로 설정되어 있을 텐데 염려하지 마세요. 이는 병합된 매니페스트의 package 속성은 실제로 Google Play 스토어와 Android 플랫폼이 앱을 식별하기 위한 것입니다.

테스트를 위한 네임스페이스 변경

androidTesttest 소스 세트의 기본 네임스페이스는 끝에 .test가 추가된 기본 네임스페이스입니다. 예를 들어, build.gradle 파일의 namespace 속성이 com.example.myapp이면 테스트 네임스페이스는 com.example.myapp.test로 기본 설정됩니다. 테스트를 위해 네임스페이스를 변경하려면 다음 코드 스니펫과 같이 testNamespace 속성을 사용하세요.

android {
    namespace 'com.example.myapp'
    testNamespace 'com.example.mytestapp'
    ...
}

주의: testNamespacenamespace를 동일한 값으로 설정하면 안 됩니다. 동일한 값으로 설정하면 네임스페이스 충돌이 발생합니다.

테스트에 관한 자세한 내용은 Android에서 앱 테스트를 참고하세요.