针对不同构建风格的不同应用名称?

Ale*_*tin 78 android gradle

我有2种构建口味,比如,flavor1flavor2.

我希望我的应用程序可以命名为" AppFlavor1 ",当我为flavor1构建时," AppFlavor2 ",当我为flavor 2构建时.

这不是我想要改变的活动的标题.我想更改应用程序名称,因为它显示在手机菜单和其他地方.

build.gradle我可以为我的口味设置各种参数,但似乎不是应用程序标签.我也无法根据某些变量以编程方式更改app标签.

那么,人们如何处理这个问题呢?

Gan*_*nan 223

从strings.xml中删除app_name(否则gradle会抱怨重复的资源)然后像这样修改构建文件:

productFlavors {
    flavor1{
        resValue "string", "app_name", "AppFlavor1"
    }

    flavor2{
        resValue "string", "app_name", "AppFlavor2"
    }
   } 
Run Code Online (Sandbox Code Playgroud)

这比在不同的构建集下创建新的strings.xml或编写自定义脚本具有更小的破坏性.

我有一个使用此方法运行的生产应用程序

https://play.google.com/store/apps/details?id=co.getintouch.play,应用名称为"InTouch Messenger:Premium Edition"

https://play.google.com/store/apps/details?id=co.getintouch,应用名称为"InTouch Messenger"

productFlavors {
    main{
        resValue "string", "app_name", "InTouch Messenger"
    }

    googlePlay{
        resValue "string", "app_name", "InTouch Messenger: GPE Edition"
    }
   } 
Run Code Online (Sandbox Code Playgroud)

不要忘记从st​​rings.xml中删除app_name!

  • 这就像一个魅力,但问题是:在添加像这样的字符串资源时,我们如何为其他语言环境添加本地化字符串? (8认同)
  • 如何使用多种风味尺寸?我怎样才能为每种风味/风味组合命名不同? (3认同)
  • @ mahbub.kuet你使用`@ string/app_name`作为你的启动器*`activity`*标签?请记住,主要启动器`activity`中的`label`优先于应用程序显示名称的`application``tag`. (2认同)

Pie*_*our 20

而不是使用脚本更改主strings.xml并且冒着搞乱源代码控制的风险,为什么不依赖于Android Gradle构建的标准合并行为?

我的build.gradle包含

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    release {
        res.srcDir 'variants/release/res'
    }

    debug {
        res.srcDir 'variants/debug/res'
    }
}
Run Code Online (Sandbox Code Playgroud)

所以现在我可以在中定义我的app_name字符串了variants/[release|debug]/res/strings.xml.还有其他我想改变的东西!


小智 8

您可以为每个flavor添加字符串资源文件,然后使用这些资源文件来更改您的应用程序名称.例如,在我的某个应用中,我有免费和付费版本.为了将它们重命名为"Lite"和"Pro",我创建了一个meta_data.xml文件,并将我的app_name值添加到该XML并将其从中删除strings.xml.接下来,app/src为每个flavor创建一个文件夹(参见下面的示例结构).在这些目录中,添加res/values/<string resource file name>.现在,在构建时,此文件将被复制到您的构建中,您的应用程序将被重命名.

文件结构:

app/src
   /pro/res/values/meta_data.xml
   /lite/res/values/meta_data.xml
Run Code Online (Sandbox Code Playgroud)

  • 这比在 gradle 文件中声明要好。奇迹般有效。谢谢。 (2认同)

Sag*_*gar 8

如果要以不同的方式维护应用程序名称的本地化,则可以按以下步骤实现:

1)android:label在以下<application>选项中指定AndroidManifest.xml

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

2)appLabel在应用程序级别指定默认值fo build.gradle

manifestPlaceholders = [appLabel:"@string/defaultName"]

3)如下覆盖产品风味的值:

productFlavors {
    AppFlavor1 {
        manifestPlaceholders = [appLabel:"@string/flavor1"]
    }
    AppFlavor2 {
        manifestPlaceholders = [appLabel:"@string/flavor2"]
    }

}
Run Code Online (Sandbox Code Playgroud)

4)为中的每个字符串(defaultName,flavor1,flavor2)添加字符串资源strings.xml。这将允许您本地化它们。


Jua*_*ado 5

我实际使用的另一个选项是更改每个应用程序的清单.您可以为每种风格创建清单,而不是复制资源文件夹.

sourceSets {
  main {
 }

  release {
    manifest.srcFile 'src/release/AndroidManifest.xml'
 }

  debug {
    manifest.srcFile 'src/debug/AndroidManifest.xml'
 }
}
Run Code Online (Sandbox Code Playgroud)

你必须在你的src main中有一个主要的AndroidManifest作为主体.然后你可以定义一个清单,只为每个风格定义一些选项,如(src/release/AndroidManifest.xml):

<manifest package="com.application.yourapp">
  <application android:icon="@drawable/ic_launcher">
  </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

对于调试,AndroidManifest(src/debug/AndroidManifest.xml):

<manifest package="com.application.yourapp">
  <application android:icon="@drawable/ic_launcher2">
  </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

编译器将对清单进行合并,您可以为每种风格添加一个图标.


Dro*_*ris 5

这可以在 buildTypes 下轻松完成

buildTypes {
    debug {
        buildConfigField("String", "server_type", "\"TEST\"")
        resValue "string", "app_name", "Eventful-Test"
        debuggable true
        signingConfig signingConfigs.debug_key_sign
    }

    stage {
        buildConfigField("String", "server_type", "\"STAGE\"")
        resValue "string", "app_name", "Eventful-Stage"
        debuggable true
        signingConfig signingConfigs.debug_key_sign
    }

    release {
        buildConfigField("String", "server_type", "\"PROD\"")
        resValue "string", "app_name", "Eventful"
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        //TODO - add release signing
    }
}
Run Code Online (Sandbox Code Playgroud)

只需确保从 strings.xml 中删除 app_name