多维中的不同样式的applicationId

时间:2019-05-24 10:41:50

标签: android android-studio gradle

问题:根据口味设置applicationId。 更多问题:商店中已经有两个应用程序,它们都具有不同的applicationId样式。

  1. com.name.dimension1.dimension2

  2. com.name.dimension1dimension2 (不带点)

在我们的Android应用中,我们需要引入新的口味/尺寸。 尺寸:

flavorDimensions“公司”,“应用”,“服务器”

看到这一点,这就是为什么我们不能在 build.gradle 中使用 applicationIdSuffix 的原因,因为它会自动添加。 (点后)。

我们已经有了确定每种口味(thanks to that answer on Stack)的版本代码的方法

def getCurrentFlavor() {
    Gradle gradle = getGradle()
    String tskReqStr = gradle.getStartParameter().getTaskRequests().toString()
    Pattern pattern
    if (tskReqStr.contains("assemble"))
        pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
    else
        pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
    Matcher matcher = pattern.matcher(tskReqStr)
    if (matcher.find())
        return matcher.group(1).toLowerCase()
    else {
        println "NO MATCH FOUND"
        return ""
    }

更多问题:可以帮助我们设置版本代码的相同方法,不能帮助applicationId。

def getFlavorApplicationId() {
    def flavor = getCurrentFlavor()
    if (flavor.contains("company1") && flavor.contains("app1")) {
        return ext.company1app1AppId
    } else if (flavor.contains("company2") && flavor.contains("app1")) {
        return ext.company2app1AppId
    } else if (flavor.contains("company2") && flavor.contains("app2")) {
        return ext.company2app2AppId
    }
    return "nothing"
}

构建/同步应用程序时-一切正常(文件BuildConfig和生成的apk具有正确的applicationId)。 当我们尝试使用applicationId运行应用程序时,会出现问题。

Error while executing: am start -n "**non.of.those**/com.rsqtechnologies.rsqphysio.splash.SplashActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=non.of.those/com.rsqtechnologies.rsqphysio.splash.SplashActivity }
Error type 3
Error: Activity class {**non.of.those**/com.rsqtechnologies.rsqphysio.splash.SplashActivity} does not exist.
Error while Launching activity

如果我很了解,则 Android Studio 不会使用applicationId从BuildConfig甚至生成的.apk中运行该应用程序。它正在尝试在启动应用程序时生成它(当它无法从gradle任务中收集有关风味的信息时- def getCurrentFlavor()

当我在终端中使用相同的命令独自运行应用程序但正确的appId时-一切正常。

我也尝试过的事情:

有人有什么建议吗?相当复杂的问题,如果有人感兴趣,我可以分享更多详细信息。

2 个答案:

答案 0 :(得分:0)

为什么不这样尝试

productFlavors {
            app3 {
            dimension "app1"
            applicationId "com.app.test.app1"
            resValue "string", "app_name", "app1"
            versionName "2.1.0"

        }
        app2 {
            dimension "app2"
            applicationId "com.app.test.app2"
            resValue "string", "app_name", "app2"
            versionName "2.1.0"

        }
        app3 {
            dimension "app3"
            applicationId "com.app.test.app3"
            resValue "string", "app_name", "app3"
            versionName "2.1.0"

        }
    }

答案 1 :(得分:0)

使用groovy时,可以更改所有合并的风味的applicationId:

android.applicationVariants.all { variant ->
    def isApp1 = variant.name.contains('app1')
    def isApp2 = variant.name.contains('app2')

    def idAppendix = ""
    if (isApp1) idAppendix = ".withDotForApp1"
    if (isApp2) idAppendix = "noDotForApp2"

    mergedFlavor.setApplicationId(mergedFlavor.applicationId + idAppendix)
}

请注意,如果您打算使用kotlinscript,则此方法将不起作用,因为合并风味的applicationid是val并且不提供设置器。