标签: android-productflavors

Android Content Provider和Gradle productFlavours

我有app应该有两种口味:免费和付费.两个版本分别完美运行.但是当我想立刻安装其中的两个时,我收到错误:[INSTALL_FAILED_CONFLICTING_PROVIDER].我试图改变android:authorities和buildConfigField值完全不同但它不会改变任何东西 - 应用程序将无法安装.我还删除了主Android Manifest中的提供者声明 - 没有.请帮我.

我的文件夹结构:

src
|- free
|   |- AndroidManifest.xml
|- main
|   |- all files and res catalogues (java, res, values etc.)
|   |- AndroidManifest.xml
|- premium
    |- AndroidManifest.cml
Run Code Online (Sandbox Code Playgroud)

我的gradle文件:

apply plugin: 'com.android.application'


android {

compileSdkVersion 19
buildToolsVersion '20.0.0'

final PROVIDER_FREE = "com.example.free.contentprovider"
final PROVIDER_PRO = "com.example.pro.contentprovider"

defaultConfig {
    minSdkVersion 14
    targetSdkVersion 20
}
buildTypes {
    release {
        minifyEnabled false // new version
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}
productFlavors {
    free {
        applicationId "com.example.free"
        versionCode 141201004 …
Run Code Online (Sandbox Code Playgroud)

java android gradle android-contentprovider android-productflavors

7
推荐指数
0
解决办法
1341
查看次数

Jacoco代码覆盖项目的多种口味和模块

正如标题所说,这就是问题所在.我有一个带有模块的android风格的应用程序.该应用程序在android-studio和TeamCity服务器中使用gradle编译.我们有自定义任务来创建看起来像这样的代码覆盖:

task codeCoverageReport(type: JacocoReport) {
// Gather execution data from all subprojects
executionData fileTree(project.rootDir.absolutePath).include("**/build/jacoco/*.exec")

//Build class & source dirs
def classExcludes =['**/R.class',
                    '**/R$*.class',
        '**/BuildConfig.class',
        '**/*$InjectAdapter*.class',
        '**/*$ModuleAdapter*.class',
        '**/*$ViewInjector*.class']
sourceDirectories = files();
classDirectories = files();
subprojects.each{
    sourceDirectories += files(it.projectDir.absolutePath + '/src/main/java')
    def path1 = it.buildDir.absolutePath + '/intermediates/classes/debug'
    def path2 = it.buildDir.absolutePath + '/classes/main'
    classDirectories += fileTree(dir: path1, excludes: classExcludes, includes: ['**/*.class'])
    classDirectories += fileTree(dir: path2, excludes: classExcludes, includes: ['**/*.class'])
}

reports {
    xml.enabled true
    html.enabled true
    html.destination "${buildDir}/reports/jacoco"
    csv.enabled false
}

doFirst …
Run Code Online (Sandbox Code Playgroud)

android module gradle jacoco android-productflavors

7
推荐指数
0
解决办法
705
查看次数

带有风味的Android主题模块

所以这有点有趣,我不确定如何在android studio中设置它.我有几个模块,我在各种应用程序中使用了一些可重用的组件,但是使用flavor将某些主题注入可重用组件会很不错.我没有为我编写的每个应用程序的每个组件创建新的风格,而是考虑使用1个主题模块,每个我编写的应用程序都有一个风味,它有颜色方案等等.这是我想要它设置的方式:

App1: dependencies
reusable lib1
reusable lib3
reusable lib4
theme - App1 flavor

App2: dependencies
reusable lib1
reusable lib2
reusable lib4
theme - App2 flavor

现在我更喜欢可重用的libs可以简单地依赖于主题而不需要知道要构建哪种风格,并且主要的应用程序proj依赖于主题可以引用该应用程序的风格(使用此答案/sf/answers/1702129341/).原因是每个可重用模块都不能在其build.gradle依赖项中使用单个应用程序,否则会破坏引用它们的其他应用程序.为每个我写的应用程序制作每个可重用模块的味道也很繁琐.有没有办法实现这样的事情?这是我试过的:

App1 build.gradle:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile project(path: ':Theme', configuration: 'app1Release')
    compile project(':Lib1')
    compile project(':Lib2')
    compile project(':Lib4')
}
Run Code Online (Sandbox Code Playgroud)

App2 build.gradle:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.android.support:appcompat-v7:22.1.1'
    compile project(path: ':Theme', configuration: 'app2Release')
    compile project(':Lib1')
    compile project(':Lib3')
    compile project(':Lib4')
}
Run Code Online (Sandbox Code Playgroud)

Lib1 build.gradle:

dependencies {
    compile …
Run Code Online (Sandbox Code Playgroud)

android gradle android-studio android-productflavors

7
推荐指数
1
解决办法
1060
查看次数

如何使用多个res.srcDirs并使用gradle覆盖一些资源

我想基于不同的productFlavor构建我的应用程序的不同版本,但需要一定程度的灵活性,这是我无法实现的.

这是我的文件夹结构:

+src
  +main
    +java
    +res
  +base
    +java
    +res
  +custom1
    +java
    +res
  +custom2
    +res
Run Code Online (Sandbox Code Playgroud)

公共代码在main(服务)上,基础ui在base(活动)上.然后定义新UI的应用程序的自定义版本在custom1(新活动)上.这个运行正常.但我需要使用基础 ui的另一个版本的应用程序(custom2),但需要更改一些res(图标,字符串或颜色).

我在build.gradle文件中尝试的是:

android{
    ...
  productFlavors {
    base {
      ...
    }
    custom1 {
      ...
    }
    custom2 {
      ...
    }
  }

  sourceSets{
    custom2{
      java.srcDirs = ['src/base/java']
      res.srcDirs = ['src/custom2/res', 'src/base/res']
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

要指定CUSTOM2将使用源代码和资源基地和资源CUSTOM2.

问题是我得到了:

Error: Duplicate resources: <project_path>/src/base/res/values-es/strings.xml:string-en/app_name, <project_path>/src/custom2/res/values-es/strings.xml:string-en/app_name
Run Code Online (Sandbox Code Playgroud)

由于app_name定义上都基地CUSTOM2,但我的目标是覆盖资源的定义在基地与的个CUSTOM2 …

android gradle android-studio build.gradle android-productflavors

7
推荐指数
1
解决办法
1万
查看次数

无法使用productFlavors在库中导入android支持v4或v7

我正在设置一个包含不同productFlavorAndroid库.图书馆有轻盈完整的味道.文件设置正确:

src/main/java/com/example/...用于轻类的
src/full/java/com/example/...完整类的主
src/light/java/com/example/...

Android Studio正确地理解了这一点,并添加了一个(full)完整的味道.

问题:依赖关系okhttp是按预期工作但不是appcompat-v7.使用一切ViewPager,FragmentActivity,RecyclerView.我已经尝试添加依赖项,fullCompile但它也没有用.Android Studio无法解析依赖关系,导入无法正常工作,除了确定okhttp,exoplayer依此类推.

我试过Invalidate Cache/Restart,clean Project,Resync gradle,没有工作.

图书馆 build.gradle

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    ...

    buildTypes {
        release {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            minifyEnabled false
        }
    }
    lintOptions {
        abortOnError false
    }

    publishNonDefault true

    productFlavors { …
Run Code Online (Sandbox Code Playgroud)

android android-support-library android-gradle-plugin android-productflavors

7
推荐指数
1
解决办法
549
查看次数

具有多种风味尺寸的Android Wear项目

问题

我们遇到了一个项目的问题,该项目具有多个(2)产品风味尺寸和磨损模块.在构建一个版本时,我们没有编译错误,手机应用程序工作,但磨损应用程序永远不会同步观看.

代码示例

手机应用模块build.gradle包含(示例和仅提取)

flavorDimensions 'brand', 'type'

productFlavors {
    nikon {
        dimension 'brand'
    }
    canon {
        dimension 'brand'
    }
    compact {
        dimension 'type'
    }
    slr {
        dimension 'type'
    }
}

dependencies {
    wearApp project(':wear')
}
Run Code Online (Sandbox Code Playgroud)

Wear app模块build.gradle包含相同的尺寸配置

publishNonDefault true

flavorDimensions 'brand', 'type'

productFlavors {
    nikon {
        dimension 'brand'
    }
    canon {
        dimension 'brand'
    }
    compact {
        dimension 'type'
    }
    slr {
        dimension 'type'
    }
}

dependencies {

}
Run Code Online (Sandbox Code Playgroud)

我们做了什么

我们检查了磨损应用程序是否在apk中通过安装在手机上并触发官方android穿戴应用程序的磨损应用程序同步选项.在日志记录中,您packageId可以获得同步观察的s 的概述:

I/WearablePkgInstaller: Setting DataItem …
Run Code Online (Sandbox Code Playgroud)

android build.gradle android-gradle-plugin android-productflavors wear-os

7
推荐指数
0
解决办法
301
查看次数

Android Studio 无法识别多维度风味的测试源目录

我对多维风格的 test 和 androidTest 源目录有疑问。

给出以下口味:

flavorDimensions "taste", "serving"

productFlavors {
    chocolate {
        flavorDimension "taste"
    }
    strawberry {
        flavorDimension "taste"
    }
    kiwi {
        flavorDimension "taste"
    }
    sample {
        flavorDimension "serving"
    }
    whole {
        flavorDimension "serving"
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Android Studio 中识别“非测试”源目录(任何风格组合)都没有问题:

src/样本、src/整个、src/巧克力、src/草莓、src/猕猴桃、src/chocolateSample、src/chocolateWhole、src/strawberrySample、src/strawberryWhole、src/kiwiSample、src/kiwiWhole

我的问题是“测试”源目录。
仅识别单维度 口味: src/testSample、src/testWhole、src/testChocolate、src/testStrawberry、src/testKiwi
多维度口味不包括: src/testChocolateSample、src/testChocolateWhole、src/testStrawberrySample、src/testStrawberryWhole、src/testKiwiSample、src/testKiwiWhole

“androidTest”等效源目录也是如此。

我的印象是 app.iml 没有正确生成。虽然我们知道我们永远不应该这样做,但如果我手动添加丢失的条目,文件夹就会被正确识别。

为什么这应该适用于非测试源目录,但适用于测试源目录却失败?这是已知问题还是 gradle 插件的限制?

我尝试对此进行研究,但只找到与测试源文件夹的单一风味维度或非测试源文件夹的多维风味相关的主题。测试源文件夹的多维风格没有任何内容。

android android-gradle-plugin android-productflavors

6
推荐指数
1
解决办法
775
查看次数

如何匹配Android Gradle项目依赖项的构建类型?

我有一个包含2个模块的项目:libraryapp

library模块当然是一个库,仅具有releasedebug构建类型。

app模块具有4种口味以及releasedebug构建类型,总共提供8种构建变体。它还声明了对library模块的依赖关系,如下所示:

compile project(path:':library', configuration:'release')

我希望能够library根据应用程序的build变体设置配置:releasebuild变体应使用release库的版本,debugbuild变体应使用debug库的版本。

显而易见的答案是列出这8个变体中的每一个,并进行适当的配置并且可以正常工作,但这并不是最佳的答案:这很丑陋,会使构建脚本过于混乱。

我已经尝试了一些方法project.configurations.all{}applicationVariants.all{},但我无法找到一个明确的方法来设置相关性配置。

有没有更清洁的方法可以做到这一点?

android gradle android-gradle-plugin android-productflavors

6
推荐指数
1
解决办法
599
查看次数

Flutter - 根据 Android 产品风格设置目标文件

目前我正在使用Flutter来构建我的应用程序。

背景

我遵循了一些关于构建不同环境条目文件的指南:
https : //iirokrankka.com/2018/03/02/separating-build-environments/
它创建main_dev.dartmain_prod.dart.

我还学会了为 iOS 和 Android 构建风味:https : //medium.com/@salvatoregiordanoo/flavoring-flutter-392aaa875f36
现在我可以--flavor <FLAVOR>在命令中使用它来构建不同的风味应用程序。

现在我在尝试结合两种技能时遇到了一个问题。


目标结果

以下是我想要实现的目标:

development风味->main_dev.dart入口文件
production风味->main_prod.dart入口文件


遇到问题

在 iOS 端,我可以在 .xcconfig 文件中定位入口文件,如下所示:

// ios/Flutter/development.xcconfig

#include "Generated.xcconfig"

FLUTTER_TARGET=lib/main_dev.dart
Run Code Online (Sandbox Code Playgroud)

我知道我可以-t lib/main_dev.dartflutter run命令后添加。
但是我想问一下是否有任何解决方案可以
在Android端的flavor config中设置flutter目标文件?

感谢任何帮助。

android android-productflavors flutter

6
推荐指数
1
解决办法
2021
查看次数

如何在BuildSrc中创建FlavorConfig?

我正在尝试创建一个 Flavor 配置以避免每个模块和库 gradle 文件中出现样板代码。

为此,我尝试转换 Piotr Zawadzki 解决方案(https://medium.com/stepstone-tech/modularizing-your-flavored-android-project-5db75c59fb0d),该解决方案使用 groovy with() 方法与包含的闭包相结合风味配置。

ext.flavorConfig = { // 1

    flavorDimensions "pricing"
    productFlavors {
        free {
            dimension "pricing"
            ext.myApplicationIdSuffix = '.free' // 2
        }
        paid {
            dimension "pricing"
            ext.myApplicationIdSuffix = '.paid'
        }
    }

    productFlavors.all { flavor -> // 3
        if (flavor.hasProperty('myApplicationIdSuffix') && isApplicationProject()) {
            flavor.applicationIdSuffix = flavor.myApplicationIdSuffix
        }
    }

}

def isApplicationProject() { // 4
    return project.android.class.simpleName.startsWith('BaseAppModuleExtension')
    // in AGP 3.1.x with library modules instead of feature modules:
    // return project.android …
Run Code Online (Sandbox Code Playgroud)

android gradle kotlin android-productflavors

6
推荐指数
1
解决办法
761
查看次数