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

And*_*ins 122 android android-gradle-plugin

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

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

我熟悉:

debug {
        applicationIdSuffix '.debug'
        versionNameSuffix '-DEBUG'
}
Run Code Online (Sandbox Code Playgroud)

但是,我似乎无法在启动器中找到应用更改应用程序的gradle命令.

Com*_*are 151

如果"应用程序名",你的意思android:label<application>,最简单的解决办法是有一个点在一个字符串资源(例如,android:label="@string/app_name"),然后在有不同的版本字符串资源的src/debug/sourceset.

您可以在此示例项目中看到,我将替换app_namein src/debug/res/values/strings.xml,将其应用于debug构建.releasebuild将使用app_namein 的版本src/main/.

  • @sfera:首先,如果需要,欢迎您在自己的资源文件中隔离此字符串.其次,这仅适用于一个字符串.第三,这仅适用于要替换该字符串的构建类型.第四,除非你有一个没有共同语言的开发团队,否则你不需要翻译非`release`字符串. (7认同)
  • @sfera:您永远不会发布带有"AppNom-DEBUG"的应用程序.您可以发送带有"AppNom"的应用程序.因此,测试"AppNom-DEBUG"是不必要的.您当然欢迎翻译`app_name`的调试版本,即使它没有必要(例如,您有法语或德语开发人员,他们不会说英语,因此需要翻译它).为了测试`app_name`的未经修改的'release`版本是否有效,及其翻译,测试`release`构建,或创建一个'near-release`构建类型,只需添加应用程序ID后缀并保留字符串. (3认同)

小智 140

你可以使用这样的东西

 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"
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在AndroidManifest.xml文件中使用@ string/app_name.

确保从values /文件夹中删除app_name(此名称没有条目).

  • 如果你得到:以这种方式构建时出错.任务执行失败':app:mergeDebugResources'..重复资源:res/values/strings.xml:你应该做的字符串/ app_name,就像它写的:"确保你从values /文件夹中删除app_name(没有这个名字的条目)". (4认同)

Alb*_*lvo 51

你可以用gradle做到这一点:

android {
    buildTypes {
        release {
            manifestPlaceholders = [appName: "My Standard App Name"]
        }
        debug {
            manifestPlaceholders = [appName: "Debug"]
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的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>
Run Code Online (Sandbox Code Playgroud)

注意:它也可以使用productFlavors.


Nic*_*hek 35

为了支持翻译,请:

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"
    }
}
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


Kry*_*lez 14

应用名称是用户可见的,这就是Google鼓励您将其保留在strings.xml文件中的原因.您可以定义一个单独的字符串资源文件,其中包含特定于buildTypes的字符串.听起来你可能有自定义的qabuildType.如果不是这样,请忽略下面的qa部分.

??? src
    ??? debug
    ?   ??? res
    ?       ??? buildtype_strings.xml
    ??? release
    ?   ??? res
    ?       ??? buildtype_strings.xml
    ??? qa
        ??? res
            ??? buildtype_strings.xml
Run Code Online (Sandbox Code Playgroud)


Hun*_*NM2 12

我们需要一个解决方案来支持具有本地化的应用名称(适用于多语言).我已经使用@Nick Unuchek解决方案进行了测试,但构建失败(未找到@ string /).稍微修改一下这个bug: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 ]
        }

    }
Run Code Online (Sandbox Code Playgroud)

值\ strings.xml中:

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

</resources>
Run Code Online (Sandbox Code Playgroud)

值恩\ strings.xml中:

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

</resources>
Run Code Online (Sandbox Code Playgroud)

的Manifest.xml:

<application
    android:label="${applicationLabel}" >
</application>
Run Code Online (Sandbox Code Playgroud)


Ami*_*aza 7

您可以采取多种方式。

您可以在应用程序级别创建manifestPlaceholders OR 。例如resValuebuild.gradle

buildTypes {
     release {
          ...
          manifestPlaceholders = [appLabel: "My App"]
          //resValue "string", "appLabel", '"My App"'
     }
     debug {
          ...
          manifestPlaceholders = [appLabel: "My App - Debug"]
          //resValue "string", "appLabel", '"My App - Debug"'
     }
}
Run Code Online (Sandbox Code Playgroud)

或者

如果有productFlavors,您可以在那里创建

flavorDimensions "env"
productFlavors {
    dev {
        dimension "env"
        ...
        manifestPlaceholders = [appLabel: "My App - Development"]
        //resValue "string", "appLabel", '"My App - Development"'
    }
    prod {
        dimension "env"
        ...
        manifestPlaceholders = [appLabel: "My Awesome App"]
        //resValue "string", "appLabel", '"My Awesome App"'
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,AndroidManifest.xml如果您正在使用manifestPlaceholders,只需更改android:label="${appLabel}"如下,或者如果您正在使用resValue,只需更改android:label=@string/appLabel

<application
    ...
    android:label="${appLabel}"> //OR `android:label=@string/appLabel`
    
    <activity
        ...
        android:label="${appLabel}">

        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>
Run Code Online (Sandbox Code Playgroud)

注意:请确保在类别android:label中也进行更改。如果不需要使用in ,只需删除它即可。<activity>LAUNCHERandroid:label<activity>


如果不想build.gradle直接添加,可以values/string.xml选择添加ProductFlavors。例如

添加

<string name="appLabel">My App - Development</string> 
Run Code Online (Sandbox Code Playgroud)

app/src/dev/res/values/string.xml

<string name="appLabel">My Awesome App</string> 
Run Code Online (Sandbox Code Playgroud)

app/src/prod/res/values/string.xml


Ste*_*nke 5

对于更动态的基于gradle的解决方案(例如,strings.xml一次在main中设置一个基本的应用程序名称,并避免在每种风味/构建类型组合的中重复自己strings.xml),请在此处查看我的答案:https : //stackoverflow.com/a/32220436/1128600