Android Gradle中基于多味库的多味应用

Android Gradle中基于多味库的多味应用,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,我的应用程序在应用程序计费系统的多个市场中具有多种风格 我有一个库,它共享我所有项目的基本代码。所以我决定将这些支付系统作为产品风格添加到这个库中 问题是android库能有产品风格吗 如果是这样,我如何在应用程序的不同风格中包含不同的风格 我搜索了很多,但是我找不到关于这个场景的任何信息。我发现的唯一相似之处是: 我改变了配置,以不同的东西,但它没有工作 我正在使用android studio 0.8.2。目前这是不可能的,尽管如果我没记错的话,这是他们想要添加的功能。(编辑2:,) 编辑:

我的应用程序在应用程序计费系统的多个市场中具有多种风格

我有一个库,它共享我所有项目的基本代码。所以我决定将这些支付系统作为产品风格添加到这个库中

问题是android库能有产品风格吗

如果是这样,我如何在应用程序的不同风格中包含不同的风格

我搜索了很多,但是我找不到关于这个场景的任何信息。我发现的唯一相似之处是:

我改变了配置,以不同的东西,但它没有工作


我正在使用android studio 0.8.2。

目前这是不可能的,尽管如果我没记错的话,这是他们想要添加的功能。(编辑2:,)

编辑: 目前,我正在使用
defaultPublishConfig
选项声明发布了哪个库变量get:

android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease 
}

最后,我发现了如何做到这一点,我将在这里向面临同样问题的其他人解释:

关键部分是在library build.gradle中将publishNonDefault设置为true,然后必须按照用户指南的建议定义依赖项

整个项目将是这样的:

库构建。渐变:

apply plugin: 'com.android.library'

android {        
    ....
    publishNonDefault true
    productFlavors {
        market1 {}
        market2 {}
    }
}
apply plugin: 'com.android.application'

android {
    ....
    productFlavors {
        market1 {}
        market2 {}
    }
}

dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}
项目构建。渐变:

apply plugin: 'com.android.library'

android {        
    ....
    publishNonDefault true
    productFlavors {
        market1 {}
        market2 {}
    }
}
apply plugin: 'com.android.application'

android {
    ....
    productFlavors {
        market1 {}
        market2 {}
    }
}

dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}
现在,您可以选择AppFlavor和BuildVariants面板,相应地选择库,所有构建和运行都将基于所选的flavor完成

如果你有多个基于库的应用程序模块,Android Studio会抱怨变量选择冲突,没关系,忽略它


答案有一个问题。我们在构建变体中丢失了一个非常重要的维度。如果我们想拥有所有选项(在我下面的示例中为4(2 x 2)),我们只需在主模块build.gradle文件中添加自定义配置,就可以在
构建变体中使用所有多风格多构建类型。我们还必须在library module build.gradle文件中设置publishNonDefault true

示例解决方案:

Lib build.gradle

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}
android {

    buildTypes {
        debug {
        }
        release {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}

configurations {
    freeDebugCompile
    paidDebugCompile
    freeReleaseCompile
    paidReleaseCompile
}

dependencies {

    freeDebugCompile project(path: ':lib', configuration: 'freeDebug')
    paidDebugCompile project(path: ':lib', configuration: 'paidDebug')
    freeReleaseCompile project(path: ':lib', configuration: 'freeRelease')
    paidReleaseCompile project(path: ':lib', configuration: 'paidRelease')

}
App build.gradle

android {

    publishNonDefault true

    buildTypes {
        release {
        }
        debug {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}
android {

    buildTypes {
        debug {
        }
        release {
        }
    }
    productFlavors {
        free {
        }
        paid {
        }
    }
}

configurations {
    freeDebugCompile
    paidDebugCompile
    freeReleaseCompile
    paidReleaseCompile
}

dependencies {

    freeDebugCompile project(path: ':lib', configuration: 'freeDebug')
    paidDebugCompile project(path: ':lib', configuration: 'paidDebug')
    freeReleaseCompile project(path: ':lib', configuration: 'freeRelease')
    paidReleaseCompile project(path: ':lib', configuration: 'paidRelease')

}

要使这些风格在AAR库上工作,需要在Android库模块的build.gradle文件中定义defaultPublishConfig

有关详细信息,请参阅:

图书馆出版物

默认情况下,库只发布其版本变体。这种变体 将由引用库的所有项目使用,无论是哪一个项目 他们自己建造的变体。这是由于以下原因造成的临时限制: 我们正在努力消除的渐变限制。你可以 控制发布哪个变量:

android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease 
}
安卓{ defaultPublishConfig“调试”}

请注意,此发布配置名称引用了完整的 变体名称。发布和调试仅在没有 口味。如果要在 使用flavors,您可以编写:

安卓{ defaultPublishConfig“flavor1Debug”}


我知道这个主题已经结束了,但只是对gradle 3.0的更新,请参见:和grep
matchingFallbacks
missingDimensionStrategy
。 现在,声明模块风格之间的依赖关系变得更加简单


…在gradle3.0的这种情况下,由于口味共享相同的名称,gradle会神奇地映射它们,不需要配置。

Android插件3.0.0及更高版本的更新

根据Android官方文档-

有了变量感知依赖项解析,您不再需要为本地模块依赖项使用特定于变量的配置,例如freeDebugImplementation,插件会为您解决这一问题

您应该按照以下方式配置依赖项:

所以在阿里的回答中,改变

dependencies {
    ....
    market1Compile project(path: ':lib', configuration: 'market1Release')
    market2Compile project(path: ':lib', configuration: 'market2Release')
}


插件将自动处理特定于变体的配置。希望它能帮助其他人将Android Studio插件升级到3.0.0及更高版本。

我在编译各种选项的模块时也遇到了问题

我发现:

看起来我们不需要将
publishnondefaulttrue
添加到lib的
build.gradle
文件中,因为gradle 3.0.1

反编译类
BaseExtension
后发现:

public void setPublishNonDefault(boolean publishNonDefault) {
   this.logger.warn("publishNonDefault is deprecated and has no effect anymore. All variants are now published.");
}
而不是:

dependencies {
...
   Compile project(path: ':lib', configuration: 'config1Debug')
}
我们应该利用:

dependencies {
...
   implementation project(':lib')
}
唯一重要的是将
configurations{…}
部分添加到
build.gradle

因此,应用程序的
build.gradle
文件的最后一个变体是:

buildTypes {
   debug {
      ...
   }

   release {
      ...
   }
}

flavorDimensions "productType", "serverType"
productFlavors {
   Free {
      dimension "productType"
      ...
   }
   Paid {
      dimension "productType"
      ...
   }
   Test {
      dimension "serverType"
      ...
   }
   Prod {
      dimension "serverType"
      ...
   }
}

configurations {
   FreeTestDebug
   FreeTestRelease
   FreeProdDebug
   FreeProdRelease
   PaidTestDebug
   PaidTestRelease
   PaidProdDebug
   PaidProdRelease
}

dependencies {
   implementation fileTree(dir: 'libs', include: ['*.jar'])
   implementation project(':lib')
   ...
}
此外,还可以使用来限制生成变体

注意:不要忘记在
设置.gradle
文件中包含模块,如:

include ':app'
include ':lib'
project(':lib').projectDir = new File('app/libs/lib')

我的Android插件是3.4.0,我发现它现在不需要配置。你只需要确保应用程序中的flavorDimensions和productFlavors在库中包含一个具有相同flavorDimensions和productFlavors的productFlavor。对于示例:

在我图书馆的建筑中

apply plugin: 'com.android.library'

android {        
    ....
    flavorDimensions "mylibFlavor"

    productFlavors {
        market1
        market2
    }
}
应用程序的build.gradle:

apply plugin: 'com.android.application'

android {
    ....
    flavorDimensions "mylibFlavor", "appFlavor"
    productFlavors {
        market1 {
            dimension "mylibFlavor"
        }
        market2 {
            dimension "mylibFlavor"
        }
        common1 {
            dimension "appFlavor"
        }
        common2 {
            dimension "appFlavor"
        }
    }
}

dependencies {
    ....
    implementation project(path: ':mylibrary')
}
同步后,您可以在“生成变体”窗口中切换所有选项:
在这种情况下。如何导入特定生成的依赖项。例如:market1Common1Debug Market1Common1Debugine实现“androidx.appcompat:1.2.0”


所以,每次我要编译应用程序时,我都必须在库的build.gradle中更改它?嗯,是的……每次你都想用不同的风格编译应用程序。实际上,当我为库模块定义风格时,在应用程序模块中找不到继承的R包。是否将gradle文件同步为?@Delblanco这看起来像是体力劳动,而且非常脆弱(开发人员很懒,忘记修改build.gradle文件)。感谢分享,现在我可以摆脱defaultPublishConfig解决方案。以1.1.0运行时,上述解决方案似乎仍然有效,然而