如何更改每种Gradle构建类型的应用程序名称


135

我试图找出一种方法可以更改gradle中每种构建类型的应用程序的应用程序名称。

例如,我想要调试版本<APP_NAME>-debug和qa版本<APP-NAME>-QA

我熟悉:

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

但是,在启动器中,我似乎找不到gradle命令来应用更改。

Answers:


167

如果使用“应用程序名称”,您的意思android:label<application>,最简单的解决方案是将该点指向字符串资源(例如android:label="@string/app_name"),然后在源集中使用该字符串资源的其他版本src/debug/

您可以在此示例项目中看到,其中有一个替代app_namein src/debug/res/values/strings.xml,它将用于debug构建。release构建将使用app_namein 的版本src/main/


这个解决方案是否暗示我们每次翻译都必须添加一个额外的strings.xml?可能难以维持……
sfera 2014年

7
@sfera:首先,如果需要,欢迎将此字符串隔离在其自己的资源文件中。其次,这仅适用于一个字符串。第三,这仅适用于您要替换该字符串的构建类型。第四,除非您的开发团队没有通用语言,否则您将不需要翻译非release字符串。
CommonsWare 2014年

隔离字符串听起来是个好主意。感谢那!至于非release部分,我看到有点不同,因为可能希望同时测试“本地化”问题,同时允许“发布”和“测试”构建共存于同一设备上。在这种情况下,两个版本可能最终都带有相同的启动器标签,可能会引起一些混乱。那就是我想要避免的。
sfera 2014年

1
@sfera:“这就是我要避免的事情”-因此,请勿翻译此字符串。对该字符串的测试无论如何都将是无效的,因为根据定义,它不是您要在release模式下使用的字符串。并且仅将此字符串资源用于app_name,而不用于其他任何角色。
CommonsWare 2014年

3
@sfera:您永远不会附带“ AppNom-DEBUG”的应用程序。您可能会附带“ AppNom”的应用程序。因此,不需要测试“ AppNom-DEBUG”。当然app_name,即使没有必要,您也可以翻译的调试版本(例如,您有不讲英语的法语或德语开发人员,因此需要进行翻译)。为了进行测试以查看作品的未修改release版本app_name及其翻译是否正确,请测试release构建,或者创建near-release仅添加应用程序ID后缀并仅保留字符串的构建类型。
CommonsWare 2014年

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,就像写的一样:“确保从值/文件夹中删除app_name(此名称不能输入) )。”
ivan.panasiuk '16

我之所以这样,是因为字符串文件夹解决方案(上面接受的解决方案)仅在为特定的源集/产品风味定义了应用名称时才起作用。就我而言,我正在设置一个Jenkins Pipeline作业,以使用不同的名称自动构建应用程序的不同版本,并且并非所有这些名称都为其定义了productFlavor。因此,詹金斯只是通过环境提供应用程序名称,而gradle会读取它:resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
Aphex

如果我从字符串文件夹中删除了app_name,那么编译时将出错-Error:Error'Execution failed for task':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


出现错误-Error:任务':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>

有哪些不同类型的构建类型?除了admin,发布和调试?
Dinesh

@DineshVG您可以自己设置差异,例如,不同的applicationId
NickUnuchek

我想在其他构建配置中使用UIAutomator测试,而不是使用其他保护规则进行调试。那可能吗 ?
Dinesh

这应该是一个可以接受的答案,对我非常
有用

我真的很喜欢这种方法,因为它甚至允许您app_name在文件的productFlavors部分中添加自定义build.gradle。当您需要时,这是一种极为方便且灵活的方法。
埃格尔

15

该应用程序名称是用户可见的,因此Google鼓励您将其保留在strings.xml文件中。您可以定义一个单独的字符串资源文件,其中包含特定于您的buildTypes的字符串。听起来您可能有一个自定义的qabuildType。如果不正确,请忽略下面的质量检查部分。

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

    }

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>

例如,像“极品飞车”这样的游戏在德国永远不会被称为“Bedürfnisnach Geschwindigkeit”。除非它是从可疑的开发者那里窃取的,否则…………
令人难以置信的

工作正常。非常感谢。然而,在我的情况,我需要更多的加1 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中执行此操作一样,我们可以假定他想在脚本中而不是在配置文件中执行此操作。由于Android StudioGradle在去年(〜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"
        }
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.