Як змінити назву програми для типу збірки Gradle


135

Я намагаюся з'ясувати спосіб змінити назву програми мого додатка на тип збірки в градусах.

Наприклад, я хотів би мати версію налагодження і версію <APP_NAME>-debugqa <APP-NAME>-QA.

Мені знайоме:

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

Однак, здається, я не можу знайти команду gradle, щоб застосувати зміну програми під час запуску.

Відповіді:


167

Якщо під назвою "назва програми" ви маєте android:labelна увазі <application>, найпростішим рішенням є вказати цю точку на рядковому ресурсі (наприклад, android:label="@string/app_name"), то мати іншу версію цього рядкового ресурсу у src/debug/наборі джерел.

Ви можете бачити, що в цьому зразковому проекті , де я маю заміну на app_nameв src/debug/res/values/strings.xml, який буде застосовано для debugзбірок. releasebuilds буде використовувати версію 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тип збірки, який просто додає суфікс ідентифікатора програми та залишає рядки в спокої.
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"
    }
}

Ви можете використовувати @ string / app_name у файлах AndroidManifest.xml.

Переконайтеся , що ви вилучили app_name з значень / папок (без входу під цим ім'ям).


Ідеально, коли ім’я програми потрібно читати із зовнішнього файлу
Джо Махер

Помилка при побудові цього способу. Не вдалося виконати завдання ': app: mergeDebugResources' .. Дублікати ресурсів: res / values ​​/ strings.xml: string / app_name
user2010496

5
Якщо ви отримуєте: Отримав помилку під час створення цього способу. Не вдалося виконати завдання ": app: mergeDebugResources" .. Дублікати ресурсів: res / values ​​/ strings.xml: string / app_name, які ви повинні зробити, як написано: "Переконайтесь, що ви видалили app_name зі значень / папки (немає запису під цим іменем ) ".
ivan.panasiuk

Мені це подобається, тому що рішення папки рядків (прийняте рішення вище) працює лише в тому випадку, якщо назва програми визначено для певного набору джерел / аромату продукту. У моєму випадку я налаштовую роботу Jenkins Pipeline, щоб автоматично створювати різні версії нашого додатка з різними назвами, і не всі ці імена мають для них продуктові смаки. Тож Дженкінс просто постачає назву програми через навколишнє середовище, а gradle читає її:resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex

якщо я видалив ім'я програми з папки рядків, то час отримання помилки збирання помилки отримує помилку -Помилка: Виконання не виконано для завдання ': app: processDevDebugManifest'. > Не вдалося
збільшити

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'} налагодження {manifestPlaceholders = [appName: "GridL Debug"] applicationIdSuffix ".dev1"}
JSONParser

44

Щоб підтримати переклади, зробіть це:

1. видалити рядок "ім'я програми"

2. додати до граді

 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. Встановіть назву програми в Manifest як "@ 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>

Які існують різні типи складання? Окрім, адміністратора, випуску та налагодження?
Дінеш

@DineshVG ви можете встановити різницю самостійно, наприклад, інший applicationId
NickUnuchek

Я хочу використовувати тест UIAutomator в іншій конфігурації збірки, окрім налагодження з різними правилами захисту. Це можливо?
Дінеш

Це має бути прийнята відповідь, чудово працював для мене
Олег Датер

Мені дуже подобається такий підхід, оскільки він дозволяє навіть додати користувальницький файл app_nameу розділ productFlavorsbuild.gradle . Надзвичайно зручний та гнучкий підхід, коли це потрібно.
Егель

15

Ім'я програми видиме користувачеві, тому Google рекомендує вам зберігати його у вашому файлі strings.xml. Ви можете визначити окремий рядовий файл ресурсу, який містить рядки, характерні для ваших buildTypes. Це здається, що у вас може бути власний qaтип збірки. Якщо це неправда, ігноруйте частину qa нижче.

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

1
це коли-небудь працювало для вас? Я документально мій приклад, і він не працює ... stackoverflow.com/questions/26032950 / ...
volkersfreunde

це аромати, що не створюють типів
грузинський Бенетатос

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 ]
        }

    }

значення \ 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>

Наприклад, така гра, як "Потреба в швидкості", ніколи не буде називатися "Bedürfnis nach Geschwindigkeit". Якщо тільки це не відірветься від сумнівного розробника ...
Неймовірний

Це працює. Дуже дякую. Тим НЕ менше, в моєму випадку, мені потрібно додати ще 1 tools:replace="android:label"в applicationвAndroidManifest
Фан Ван Linh

5

Для більш динамічного рішення на основі gradle (наприклад, встановити базову назву програми в main''s strings.xmlодин раз, і уникайте повторень у кожній комбінації типів аромат / збірка strings.xml), дивіться мою відповідь тут: https://stackoverflow.com/a/32220436/1128600


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.xmlв app\src\main\res\values\папці.

У AndroidManifestвас буде те саме

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

Жодних змін взагалі немає. Навіть якщо ви додали бібліотеку з AndroidManifestфайлом і strings.xml.


1

Оскільки автор просить зробити це в Gradle , ми можемо припустити, що він хоче це робити в сценарії, а не в конфігураційних файлах. Оскільки і Android Studio, і 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"
        }
    }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.