Gradle 빌드 유형별로 앱 이름을 변경하는 방법


135

빌드 유형마다 내 응용 프로그램의 앱 이름을 gradle로 변경할 수있는 방법을 찾으려고합니다.

예를 들어 디버그 버전 <APP_NAME>-debug과 qa 버전을 갖고 싶습니다 <APP-NAME>-QA.

나는 익숙하다 :

debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
}

그러나 실행기에있을 때 앱 변경 사항을 적용하는 gradle 명령을 찾을 수없는 것 같습니다.

답변:


167

"앱 이름"으로 android:labelon 을 의미 하는 <application>경우 가장 간단한 해결책은 해당 지점을 문자열 리소스 (예 :) android:label="@string/app_name"에두고 src/debug/소스 세트 에 해당 문자열 리소스의 다른 버전을 갖는 것 입니다.

이 샘플 프로젝트 에서 in에 대한 대체물이 app_name있는 빌드 프로젝트src/debug/res/values/strings.xml적용됩니다 debug. release의 버전을 사용하는 빌드 app_name의를 src/main/.


이 솔루션이 각 번역에 대해 추가 strings.xml을 추가해야 함을 의미하지 않습니까? 그것은 유지하는 고통이 될 수 있습니다 ...
Sfera

7
@ sfera : 먼저이 문자열을 원하는 경우 자체 리소스 파일로 격리 할 수 ​​있습니다. 둘째, 이것은 하나의 문자열에만 해당됩니다. 셋째, 이것은 해당 문자열을 바꾸려는 빌드 유형에만 해당됩니다. 넷째, 공용 언어가없는 개발 팀이 없으면 release문자열 이 아닌 언어를 번역 할 필요가 없습니다 .
CommonsWare

문자열을 분리하는 것이 좋습니다. 고마워요! 비 제한적 release으로, "릴리스"와 "테스트"빌드가 같은 장치에 공존 할 수 있도록하는 동시에 현지화 문제를 테스트하고 싶을 때와는 조금 다릅니다. 이 경우 두 빌드 모두 동일한 실행기 레이블로 끝날 수 있으며 혼동을 일으킬 수 있습니다. 그것이 내가 피하려고했던 것입니다.
Sfera

1
@ sfera : "그게 내가 피하려고했던 것"이므로이 문자열을 번역하지 마십시오. 그 문자열에 대한 테스트는 어쨌든 유효하지 않습니다. 정의에 따르면 release모드 에서 사용하려는 문자열이 아닙니다 . 그리고 app_name다른 역할이 아닌 이 문자열 리소스 만 사용하십시오 .
CommonsWare

3
@sfera : "AppNom-DEBUG"와 함께 앱을 제공하지 않습니다. "AppNom"과 함께 앱을 제공 할 수 있습니다. 따라서 "AppNom-DEBUG"를 테스트 할 필요가 없습니다. app_name반드시 필요하지 않더라도 디버그 버전을 번역 할 수 있습니다 (예 : 영어를 구사하지 못하는 프랑스어 또는 독일어 개발자가 있으므로 번역해야 함). 번역과 함께 수정되지 않은 release버전의 app_name저작물을 테스트하기 release위해 빌드를 테스트 하거나 near-release앱 ID 접미사 만 추가하고 문자열 만 남겨 두는 빌드 유형을 만듭니다 .
CommonsWare

159

이런 식으로 사용할 수 있습니다

 buildTypes {
    debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
        resValue "string", "app_name", "AppName debug"
    }
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release
        zipAlignEnabled true
        resValue "string", "app_name", "AppName"
    }
}

AndroidManifest.xml 파일에서 @ string / app_name 을 사용할 수 있습니다 .

값 / 폴더에서 app_name 을 제거하십시오 (이 이름으로 항목이 없음).


외부 파일에서 앱 이름을 읽어야 할 때 적합
Joe Maher

이런 식으로 빌드 할 때 오류가 발생했습니다. 작업 ': app : mergeDebugResources'에 대한 실행에 실패했습니다. 중복 리소스 : res / values ​​/ strings.xml : string / app_name
user2010496

5
당신이 얻는 경우 :이 방법으로 빌드 할 때 오류가 발생했습니다. 태스크 ': app : mergeDebugResources'에 대한 실행에 실패했습니다. 중복 자원 : res / values ​​/ strings.xml : string / app_name과 같이 작성해야합니다. "value / 폴더에서 app_name을 제거하십시오 (이 이름으로 입력하지 마십시오) ). "
ivan.panasiuk

문자열 폴더 솔루션 (위의 허용되는 솔루션)은 앱 이름이 특정 소스 세트 / 제품 특징에 대해 정의 된 경우에만 작동하기 때문에 이것을 좋아합니다. 제 경우에는 다른 이름으로 다른 버전의 앱을 자동으로 빌드하기 위해 Jenkins Pipeline 작업을 설정하고 있으며 모든 이름에 productFlavors가 정의되어 있지는 않습니다. Jenkins는 단순히 환경을 통해 앱 이름을 제공하고 gradle은 다음과 같이 읽습니다.resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex

문자열 폴더에서 app_name을 제거하면 오류 컴파일 시간이 발생합니다. 오류 : 오류 : 작업 ': app : processDevDebugManifest'에 대해 실패했습니다. > 매니페스트 합병 여러 오류와 함께 실패, 로그 참조
aj0822ArpitJoshi

55

gradle 로이 작업을 수행 할 수 있습니다.

android {
    buildTypes {
        release {
            manifestPlaceholders = [appName: "My Standard App Name"]
        }
        debug {
            manifestPlaceholders = [appName: "Debug"]
        }
    }
}

그런 다음에 AndroidManifest.xml넣어 :

<application
    android:label="${appName}"/>
    <activity
        android:label="${appName}">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

참고 : 또한 작동합니다 productFlavors.


오류 :-오류 : 태스크 ': app : processDevDebugManifest'에 대한 실행에 실패했습니다. > 매니페스트 합병 여러 오류와 함께 실패, 로그 참조
aj0822ArpitJoshi

작동하지 않음 --- buildTypes {release {minifyEnabled false proguardFiles getDefaultProguardFile ( 'proguard-android.txt'), 'proguard-rules.pro'} debug {manifestPlaceholders = [appName : "GridL Debug"] applicationIdSuffix ".dev1"}}
JSONParser

44

번역을 지원하려면 다음을 수행하십시오.

1. 문자열 "app_name"을 제거하십시오.

2. gradle에 추가

 buildTypes {
    admin {
       resValue "string", "app_name", "@string/app_name_admin"
    }
    release {
        resValue "string", "app_name", "@string/app_name_release"
    }
    debug {
        resValue "string", "app_name", "@string/app_name_debug"
    }
}

3. 매니페스트의 앱 이름을 "@ string / app_name"으로 설정

4. strings.xml 값에 추가

<string name="app_name_admin">App Admin</string>
<string name="app_name_release">App  release</string>
<string name="app_name_debug">App debug</string>

다른 유형의 빌드 유형은 무엇입니까? 관리자, 릴리스 및 디버그 외에?
Dinesh

@DineshVG 당신은 다른 applicationId와 같은 당신 스스로 차이를 설정할 수 있습니다
NickUnuchek

다른 프로 가드 규칙으로 디버그하는 것 이외의 다른 빌드 구성에서 UIAutomator 테스트를 사용하고 싶습니다. 가능합니까?
Dinesh

이것은 받아 들일만한 대답이어야하고, 나를 위해 훌륭하게 일했습니다
Oleg Dater

난 정말이 방법처럼 당신도 사용자 정의를 추가 할 수 있기 때문 app_nameproductFlavors의 섹션 build.gradle파일. 필요할 때 매우 편리하고 유연한 접근 방식.
Egel

15

앱 이름은 사용자가 볼 수 있으므로 strings.xml 파일에 보관하는 것이 좋습니다. buildTypes에 특정한 문자열을 포함하는 별도의 문자열 리소스 파일을 정의 할 수 있습니다. 사용자 정의 qabuildType 이있는 것 같습니다. 사실이 아닌 경우 아래의 qa 부분을 무시하십시오.

└── src
    ├── debug
       └── res
           └── buildtype_strings.xml
    ├── release
       └── res
           └── buildtype_strings.xml
    └── qa
        └── res
            └── buildtype_strings.xml

1
이것이 당신을 위해 일한 적이 있습니까? 내 예를 문서화하고, 일 ...하지 않는 stackoverflow.com/questions/26032950/...
volkersfreunde

이들은 풍미가없는 맛입니다
Georgian Benetatos

13

현지화 (다국어)로 앱 이름을 지원하는 솔루션이 필요합니다. @Nick Unuchek 솔루션으로 테스트했지만 빌드가 실패합니다 (@ string /을 찾을 수 없음). 이 버그를 수정하기위한 약간의 변경 : build.gradle 파일 :

android {
    ext{
        APP_NAME = "@string/app_name_default"
        APP_NAME_DEV = "@string/app_name_dev"
    }

    productFlavors{

        prod{
            manifestPlaceholders = [ applicationLabel: APP_NAME]
        }

        dev{
            manifestPlaceholders = [ applicationLabel: APP_NAME_DEV ]
        }

    }

values ​​\ strings.xml :

<resources>
    <string name="app_name_default">AAA prod</string>
    <string name="app_name_dev">AAA dev</string>

</resources>

values-en \ strings.xml :

<resources>
    <string name="app_name_default">AAA prod en</string>
    <string name="app_name_dev">AAA dev en</string>

</resources>

Manifest.xml :

<application
    android:label="${applicationLabel}" >
</application>

예를 들어 "Need for Speed"와 같은 게임은 독일에서 "Bedürfnis nach Geschwindigkeit"로 불리지 않습니다. 모호한 개발자가 찢어
않는

작동합니다. 정말 고맙습니다. 하지만, 내 경우에, 나는 더 많은 일을 추가 할 필요가 tools:replace="android:label"applicationAndroidManifest
판 반 린


2

strings.xml다른 폴더에서 사용할 수 있습니다 . 릴리스 및 디버그 빌드에 대해서는 Android의 별도 문자열 값을 참조하십시오 .

따라서이 파일을 작성하십시오.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Your app name</string>
</resources>

그런 다음 폴더 app\src\debug\res\values\app\src\release\res\values\폴더에 붙여 넣습니다 . 디버그 및 릴리스 파일에서 "앱 이름"을 바꾸십시오. 제거 app_name에서 항목 strings.xmlapp\src\main\res\values\폴더.

에서 AndroidManifest동일한있을 것이다

<application
    android:label="@string/app_name"
    ...

전혀 변화가 없습니다. AndroidManifest파일과 함께 라이브러리를 추가하더라도 strings.xml.


1

작성자가 Gradle 에서이 작업을 수행하도록 요청 하면 구성 파일이 아닌 스크립트에서 수행하려고한다고 가정 할 수 있습니다. 모두 이후 안드로이드 스튜디오Gradle을가 크게 업데이트 작년에 수정되었습니다 (~ 2018) 위의 모든 다른 답변은 지나치게 뒤틀린 것 같다. 쉬운 방법은 다음을 추가하는 것입니다 app/build.gradle.

android {
    ...
    buildTypes {
        ...
        // Rename/Set default APK name prefix (app*.apk --> AwesomeApp*.apk)
        android.applicationVariants.all { variant ->
            variant.outputs.all { output ->
                def appName = "AwesomeApp"
                outputFileName = appName+"-${output.baseName}-${variant.versionName}.apk"
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.