【问题标题】:Get gradle build type in product flavor在产品风味中获取 gradle 构建类型
【发布时间】:2015-07-09 13:58:25
【问题描述】:

我需要根据使用的产品风格创建不同的应用名称。

虽然这很容易通过简单地设置一个字符串资源,但我不能再这样做了,因为当应用程序上传到 hockeyapp 时,应用程序名称被设置为“@string/app_name”而不是 app_name 的值。

通过将清单中的标签设置为“${applicationName}”并使用

设置值,我取得了一些进展
manifestPlaceholders = [ applicationName : appName ];

在产品风味块中,以便在编译时设置值。

当我尝试将构建类型附加到应用程序名称时,问题就出现了。我似乎无法找到一种方法来了解产品风格中当前使用的构建类型。

为了便于阅读,这是一个精简的构建版本

android {
    buildVersionName "1.0.0

    buildTypes {
        release {
            ... nothing special
        }
        uat {
            signingConfig signingConfigs.debug
            buildType = "uat"
            applicationIdSuffix = "." + buildType
        }
        debug {
            signingConfig signingConfigs.debug
            buildType = "uat"
            applicationIdSuffix = "." + buildType
        }
    }
    productFlavors{
        flavor1{
            def appName = "app name " + buildType;
            manifestPlaceholders = [ applicationName : appName ];
            applicationId [id]
            def clientIteration = [client iteration]
            versionName buildVersionName + clientIteration
            versionCode [version code]
        }
        flavor2{
            ... same as above with different app name
        }
        flavor3{
            ... same as above with different app name
        }
    }
}

此代码运行良好,除了变量“buildType”始终是最后一个构建类型(在本例中为 debug),这意味着应用名称始终以 debug 结尾。

可能值得注意的是,我不需要在应用名称的末尾附加任何内容。

【问题讨论】:

    标签: android build gradle android-gradle-plugin build.gradle


    【解决方案1】:

    此链接http://inaka.net/blog/2014/12/22/create-separate-production-and-staging-builds-in-android/ 可能会对您有所帮助。

    如果您有两个 productFlavor(例如 Production 和 Staging)

    您应该创建两个不同的资源文件夹:

    project/app/src/production/res/values/strings.xml

    <resources>
        <string name="root_url">http://production.service.com/api</string>
    </resources>
    

    project/app/src/staging/res/values/strings.xml

    <resources>
        <string name="root_url">http://staging.service.com/api</string>
    </resources>
    

    您应该在 android {} 中添加以下代码:

    productFlavors {
    
        production {
            applicationId "com.inaka.app.production"
        }
    
        staging {
            applicationId "com.inaka.app.staging"
        }
    
    }
    

    为不同的productFlavors设置不同的图标是个好主意,只需在每个不同的资源文件夹中添加图标即可。

    【讨论】:

    • 感谢 Sibelius,指向不同的端点没有问题。我为此使用构建类型,并且产品风格用于不同的客户。这样我可以为每个客户端设置不同的环境。问题是我需要在编译时设置应用程序名称(清单中的 android:label)(不能使用资源字符串),以便在将应用程序加载到 hockeyapp 时显示正确的应用程序名称而不是 @string/app_name跨度>
    【解决方案2】:

    我知道我参加聚会有点晚了,但如果你想要根据口味不同的名字,你应该有这样的东西:

      productFlavors{
        flavour 1 {
            applicationId "your_app_id"
            resValue "string", "app_name", "Flavour 1 app name"
            .......
        }
    
        flavour 2 {
            applicationId "your_app_id"
            resValue "string", "app_name", "Flavour 2 app name"
            .......
    
        }
    }
    

    在你的 AndroidManifest.xml 中:

        android:label="@string/app_name"
    

    希望这会有所帮助。

    【讨论】:

    • 太棒了,这对一堆东西很有用,谢谢。我不知道你可以通过 gradle 创建资源。
    【解决方案3】:

    你可以像这样附加值

       android {
    
        productFlavors {
            Foo {
                 applicationId "com.myexample.foo"
                 manifestPlaceholders = [ appName:"Foo"]
            }
    
            Bar {
                 applicationId "com.myexample.bar"
                 manifestPlaceholders = [ appName:"Bar"]
            }
        }
    
        buildTypes {
            release {
                manifestPlaceholders = [ appNameSuffix:""]
            }
    
            debug {
                manifestPlaceholders = [ appNameSuffix:".Debug"]
                applicationIdSuffix ".debug"
            }
        }
    }
    

    在清单中

    <application
            android:label="${appName}${appNameSuffix}"
            ...
     </application>
    

    如果你想根据构建类型访问不同的值,你可以这样做

    buildTypes {
        debug{
            buildConfigField "String", "Your_string_key", '"yourkeydebugvalue"'
            buildConfigField "String", "SOCKET_URL", '"some text"'
            buildConfigField "Boolean", "LOG", 'true'
        }
        release {
            buildConfigField "String", "Your_string_key", '"yourkeyreleasevalue"'
            buildConfigField "String", "SOCKET_URL", '"release text"'
            buildConfigField "Boolean", "LOG", 'false'
    
        }
    }
    

    并使用构建变体访问这些值:

     if(!BuildConfig.LOG)
          // do something with the boolean value
    

    或者

    view.setText(BuildConfig.yourkeyvalue);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多