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

时间:2014-07-21 08:27:32

标签: android gradle android-gradle

我的应用程序针对多个市场应用内结算系统提供了多种风格。

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

问题是android库可以有产品口味吗?

如果是这样,我怎样才能在应用程序的各自风格中包含不同的风格?

我搜索了很多,而且我无法找到关于这种情况的任何信息。我发现的唯一接近的是http://tools.android.com/tech-docs/new-build-system/user-guide

dependencies {
    flavor1Compile project(path: ':lib1', configuration: 'flavor1Release')
    flavor2Compile project(path: ':lib1', configuration: 'flavor2Release')
}

我将配置改为不同的东西,但它没有用!

我使用的是android studio 0.8.2。

9 个答案:

答案 0 :(得分:133)

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

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

整个项目将是这样的:

图书馆build.gradle:

apply plugin: 'com.android.library'

android {        
    ....
    publishNonDefault true
    productFlavors {
        market1 {}
        market2 {}
    }
}

项目build.gradle:

apply plugin: 'com.android.application'

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

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

现在您可以选择应用程序风格和“构建变体”面板,并相应地选择库,所有构建和运行都将根据所选的风格完成。

如果你有多个基于库的app模块,Android Studio会抱怨Variant选择冲突,没关系,只需忽略它。

enter image description here

答案 1 :(得分:34)

Ali回答有一个问题。我们在构建变体中失去了一个非常重要的维度。如果我们想要所有选项(在我的示例中低于4(2 x 2)),我们只需在主模块build.gradle 文件中添加自定义配置即可在addBorder:forView中使用所有多风味的multi-buildType。我们还必须在库模块build.gradle 文件中设置 publishNonDefault true

示例解决方案:

Lib build.gradle

Build Variants

App build.gradle

android {

    publishNonDefault true

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

答案 2 :(得分:14)

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

根据官方Android文档 - Migrate dependency configurations for local modules

  

使用变体感知依赖项解析,您不再需要为本地模块依赖项使用特定于变体的配置(例如freeDebugImplementation) - 插件会为您处理此事

     

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

dependencies {
    // This is the old method and no longer works for local
    // library modules:
    // debugImplementation project(path: ':library', configuration: 'debug')
    // releaseImplementation project(path: ':library', configuration: 'release')

    // Instead, simply use the following to take advantage of
    // variant-aware dependency resolution. You can learn more about
    // the 'implementation' configuration in the section about
    // new dependency configurations.
    implementation project(':library')

    // You can, however, keep using variant-specific configurations when
    // targeting external dependencies. The following line adds 'app-magic'
    // as a dependency to only the "debug" version of your module.

    debugImplementation 'com.example.android:app-magic:12.3'
}

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

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

implementation project(':lib')

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

答案 3 :(得分:2)

要获得AAR库上的风格,您需要在Android库模块的build.gradle文件中定义defaultPublishConfig。

有关详细信息,请参阅:Library Publication

  

图书馆出版

     

默认情况下,库仅发布其版本变体。这个变种   将被引用库的所有项目使用,无论哪个   变种他们自己建立。由于这是暂时的限制   我们正在努力消除的Gradle限制。您可以   控制哪个变体发布:

     

android {       defaultPublishConfig“debug”}

     

请注意,此发布配置名称引用了完整名称   变体名称。发布和调试仅在没有时才适用   口味。如果您想要更改默认发布的变体   使用flavor,你会写:

     

android {       defaultPublishConfig“flavor1Debug”}

答案 4 :(得分:1)

目前它是不可能的,尽管如果我没记错它想要添加的功能。 (编辑2:linklink2

编辑: 目前我正在使用defaultPublishConfig选项声明哪些库变体已发布:

android {
    defaultPublishConfig fullRelease
    defaultPublishConfig demoRelease 
}

答案 5 :(得分:1)

我知道此主题已关闭,但只是使用gradle 3.0进行更新,请参阅:https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html#variant_aware和grep matchingFallbacks以及missingDimensionStrategy。 现在,声明模块风格之间的依赖关系变得更加简单。

...在这个精确的情况下使用gradle3.0,由于风味共享相同的名称,gradle会神奇地映射它们,不需要配置。

答案 6 :(得分:1)

我还遇到了为各种选项编译模块的问题。

我发现了什么:

看起来我们不需要将publishNonDefault true添加到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')
   ...
}

此外,您可以使用Filter variants来限制构建变体。

P.S。不要忘记在settings.gradle文件中包含模块,例如:

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

答案 7 :(得分:1)

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

在图书馆的build.gradle中

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')
}

同步后,您可以在“构建变体”窗口中切换所有选项: enter image description here

答案 8 :(得分:0)

在这种情况下。如何导入特定构建的依赖项。例如:market1Common1Debug market1Common1DebugImplementation 'androidx.appcompat:1.2.0'

enter image description here