Answers:
如果使用“应用程序名称”,您的意思android:label
是<application>
,最简单的解决方案是将该点指向字符串资源(例如android:label="@string/app_name"
),然后在源集中使用该字符串资源的其他版本src/debug/
。
您可以在此示例项目中看到,其中有一个替代app_name
in src/debug/res/values/strings.xml
,它将用于debug
构建。release
构建将使用app_name
in 的版本src/main/
。
release
字符串。
release
部分,我看到有点不同,因为可能希望同时测试“本地化”问题,同时允许“发布”和“测试”构建共存于同一设备上。在这种情况下,两个版本可能最终都带有相同的启动器标签,可能会引起一些混乱。那就是我想要避免的。
release
模式下使用的字符串。并且仅将此字符串资源用于app_name
,而不用于其他任何角色。
app_name
,即使没有必要,您也可以翻译的调试版本(例如,您有不讲英语的法语或德语开发人员,因此需要进行翻译)。为了进行测试以查看作品的未修改release
版本app_name
及其翻译是否正确,请测试release
构建,或者创建near-release
仅添加应用程序ID后缀并仅保留字符串的构建类型。
你可以用这样的东西
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(此名称无输入)。
resValue "string", "app_name", System.getenv("APP_NAME") ?: "MyApp"
您可以使用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
。
为了支持翻译,请执行以下操作:
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>
app_name
在文件的productFlavors部分中添加自定义build.gradle
。当您需要时,这是一种极为方便且灵活的方法。
该应用程序名称是用户可见的,因此Google鼓励您将其保留在strings.xml文件中。您可以定义一个单独的字符串资源文件,其中包含特定于您的buildTypes的字符串。听起来您可能有一个自定义的qa
buildType。如果不正确,请忽略下面的质量检查部分。
└── src
├── debug
│ └── res
│ └── buildtype_strings.xml
├── release
│ └── res
│ └── buildtype_strings.xml
└── qa
└── res
└── buildtype_strings.xml
我们需要一种解决方案来支持具有本地化的应用名称(适用于多语言)。我已经使用@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>
tools:replace="android:label"
在application
中AndroidManifest
对于更动态的基于gradle的解决方案(例如,strings.xml
一次在main中设置一个基本的应用程序名称,并避免在每种风味/构建类型组合的中重复自己strings.xml
),请在此处查看我的答案:https : //stackoverflow.com/a/32220436/1128600
您可以使用 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
。
正如作者要求在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"
}
}
}