如何在Android Studio中使用不同应用名称的flavors?

43
在我的应用程序级别的build.gradle文件中,我有以下的flavors:
productFlavors {
    originalFlavour{
    }

    freeFlavour{
    }
}
在构建两种不同的应用程序时,我得到了相同的应用程序名称。实际上,我希望每个版本都有不同的应用程序名称。只需添加后缀即可。希望有人能够帮助我。
提前感谢您的帮助。
编辑:app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="z.fncapps.etsiipod"  >

    <uses-permission
        android:name="android.permission.CALL_PHONE"
        android:required="false" />

    <uses-feature
        android:name="android.hardware.telephony"
        android:required="false"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <!-- actvities declared here -->
    </application>
</manifest>

app/src/freeFlavour/AndroidManifest.xml

<uses-permission 
    android:name="android.permission.CALL_PHONE"
    android:required="false" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-feature
   android:name="android.hardware.telephony"
   android:required="false" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >

    <!-- actvities declared here -->
</application>

3个回答

83

从您现有的strings.xml文件中删除app_name字符串,然后您可以执行以下操作:

productFlavors {
    originalFlavour{
        resValue "string", "app_name", "Original Flavor Name"
    }

    freeFlavour{
        resValue "string", "app_name", "Free Flavor Name"
    }
}

那么,您在清单文件中现有的对@string/app_name的引用将指向一个生成的字符串资源,该资源基于所选的风味。

请注意,如果您为启动 Activity 指定标签(通过在 <activity> 元素中定义 android:label xml 标记),则该值将在许多用户可见的位置使用,而不是应用程序的标签。为了解决这个问题,您可以完全从 <activity> 元素中删除标签。有关此区别的更多细节,请参见https://dev59.com/XG035IYBdhLWcg3wZvJg#13200774


3
回答你的第一个问题:是的,这对于构建类型(debug、release等)也适用。从Gradle插件v0.8.1的发布说明中可以看到:“您现在可以在构建类型和产品风味上使用resValue <type>,<name>,<value>,就像您可以使用buildConfigField一样。” - stkent
1
关于你的第二个问题,我不确定。我尝试查看了Android Plugin DSL文档,但在相关类型(ProductFlavor/GroupableProductFlavor、BuildType)中没有找到resValue或buildConfigField方法的任何提及。文档可能已经过时了。我建议进行一些实验来确定是否接受非字符串值! - stkent
2
很好。我已经测试了“app_name”,但是Android Studio声称我已经有了它("duplicate resources...")。我该怎么避免这种情况呢?是因为,正如你所写的那样,我需要从“strings.xml”文件中删除“app_name”吗?我该如何避免删除它(它已被翻译)? - android developer
1
关于翻译的问题 - 这是个好问题,不确定 - 或许值得单独提出一个问题。 - stkent
谢谢!!!请注意,resValue行必须位于每个flavor声明的开头,当我将resValue放在flavor的末尾时出现了问题。 - Hermandroid
显示剩余6条评论

27

你可以在AndroidManifest.xml中使用字符串资源:

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

然后在 ../app/src/ 文件夹中为每个风味使用不同的资源文件:

../app/src/

这种解决方案的关键是,您可以在每个值(values)文件夹内创建本地化的 strings.xml 文件:/res/values/、/res/values-pt/、/res/values-es/ 等。

每个 string.xml 可以将应用程序名称本地化,对于 Free Flavor Name 的默认值(/res/values/)可以是:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">Free Flavor Name</string>
</resources>

在我看来,这是本地化的更好方法。 - Bruce
如果你正在本地化应用程序名称,那么我同意;否则,我认为这是一种多余的机制和间接性。 - stkent
我们也可以使用ManifestPlaceholder来处理它。 - Zar E Ahmer

0

既然您已经为免费版本准备了单独的清单文件,为什么不将其标签分配给不同的字符串资源值呢?

android:label="@string/free_app_name"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接