标签: android-productflavors

不同构建变体中的不同代码

我的应用程序中有两个构建变体,一个是标准应用程序版本,第二个是自定义应用程序.

productFlavors {
        customConfig {
            minSdkVersion 14
            applicationId 'es.com.custom'
            targetSdkVersion 22
            versionCode 3
            versionName '3.0.0'
        }
        standard {
            minSdkVersion 14
            applicationId 'es.com.standard'
            targetSdkVersion 22
            versionCode 3
            versionName '3.0.0'
        }
Run Code Online (Sandbox Code Playgroud)

对于自定义,我必须实现新功能,但仅用于自定义,因此标准版本将不提供这些新功能.我不确定我该做什么.

1.-两个类,一个具有标准要求,一个具有定制要求
2.-在标准类中执行以下操作:

  if (getPackageName()==customConfig )
    // do the custom things
    else
    //do the standard things
Run Code Online (Sandbox Code Playgroud)

android android-productflavors android-build-flavors

8
推荐指数
1
解决办法
3026
查看次数

安卓摇篮。如何将 Flavors 与 buildTypes 结合起来

我正在开发一个白色品牌的应用程序。

我们创建每个客户不同的风味并且每个客户都DebugProductionAPI的,所以我试图建立起来的摇篮。

我该怎么做?

这是我尝试过的:

buildTypes {
    debug {
        // some configurations
    }
    release {
        // some configurations
    }
}

flavorDimensions "client"
productFlavors {
    company1{
        dimension "client"
        buildConfigField("String", "BASE_URL", "\"https://app.company1/devApi/\"")
    }

    company2 {
        dimension "client"
        buildConfigField("String", "BASE_URL", "\"https://app.company2/devApi/\"")
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:我希望能够为BASE_URL每个 Flavor 和 Buildtype定义一个不同的。

风味公司1,BuildType调试

https://app.company1.com/devApi/
Run Code Online (Sandbox Code Playgroud)

Flavor company1, BuildType 发布

https://app.company1.com/prodApi/
Run Code Online (Sandbox Code Playgroud)

风味公司2,BuildType调试

https://dev.company2.com/api/
Run Code Online (Sandbox Code Playgroud)

Flavor company2, BuildType 发布

https://prod.company2.com/api/
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin android-productflavors android-build-type

8
推荐指数
1
解决办法
3720
查看次数

尝试使用风味时 Flutter 应用程序构建失败

我正在尝试在我的应用程序中使用风味。我遵循了各种指南,但每次都因同样的问题而无法构建。(因为基本上每个博客文章和 SE 问题都引用相同的文章和资源,所以我不会再这样做了)

为了调试,我决定简化问题并启动一个新项目(正常示例项目),并添加风味,每种风味只有一个元素:应用程序。这有效。各种其他更复杂的属性,例如使用 res/values/strings.xml 作为应用程序标签也可以正常工作。

然后,我使用我的应用程序尝试了最简单的风味设置,其中的grade.build如下所示,然后很快就失败并出现相同的错误。

flavorDimensions "app"
productFlavors {
    dev {
        dimension "app"
    }
    qa {
        dimension "app"
        applicationId "com.example.app1"
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:我还使用单独的入口点来实现运行时配置。这按预期工作并且已经使用了一段时间。

johan@komp:~/AndroidStudioProjects/parent_lite$ flutter run --flavor qa -t lib/main-qa.dart
Using hardware rendering with device Android SDK built for x86. If you get graphics artifacts, consider enabling software rendering with "--enable-software-rendering".
Launching lib/main-qa.dart on Android SDK built for x86 in debug mode...
Initializing gradle...                                              0.4s
Resolving dependencies...                                           1.2s
Running Gradle task 'assembleQaDebug'...                                
Running Gradle task 'assembleQaDebug'... Done                       1.1s …
Run Code Online (Sandbox Code Playgroud)

build android-productflavors flutter android-build-flavors

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

java.lang.NoSuchMethodError:没有静态方法“myMethod”

我有一个扩展方法:

fun StoresClientFragment?.onClickButtonBack(){
   this?.listener?.onStoresFragmentClickBtnMenu()
}
Run Code Online (Sandbox Code Playgroud)

应用程序安装没有任何错误;但是当在运行时调用该方法时,它会给出以下错误:

java.lang.NoSuchMethodError:类 Lcom/app/common_client/commons/CommonsAppTypeGroupKt 中没有静态方法 onClickButtonBack (Lcom/app/common_client/ui/fragment /stores/StoresClientFragment;) V;或其超类(“com.app.common_client.commons.CommonsAppTypeGroupKt”的声明出现在 /data/app/com.myapp.client-DWp0y3iNC3tsmBZkowlpfw==/base.apk!classes2.dex 中)。

我启用了多重索引

在 build.gradle 中

android {
    defaultConfig {
        multiDexEnabled = true
    }
}

dependencies {
   implementation 'androidx.multidex:multidex:2.0.1'
}
Run Code Online (Sandbox Code Playgroud)

在应用程序类中

class ApplicationClient : MultiDexApplication(){
}
Run Code Online (Sandbox Code Playgroud)

在清单中

<application
        android:name=".commons.application.ApplicationClient"
Run Code Online (Sandbox Code Playgroud)

注意:我正在使用产品风格和模块,该方法位于某些产品风格共享的 src 中

sourceSets {
         flavorA {
             java.srcDirs + = "src/sharedFolder/java" //here is 'onClickButtonBack' method
         }
         flavorB {
             java.srcDirs + = "src/sharedFolder/java"
         }
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-studio android-productflavors android-module

8
推荐指数
2
解决办法
2万
查看次数

ProductFlavors main ~ Gradle 错误:具有相同键的多个条目:main=[] 和 main=[]

当我将 gradle 版本增加到gradle-7.3.3from时gradle-7.2,我收到一个 gradle 同步错误,内容是Multiple entries with same key: main=[] and main=[].

当我将 ProductFlavors 名称更改为mainCore或其他名称时main,gradle 同步时不会出现错误。

我想知道如何继续使用mainproductFlavor。有任何想法吗?

构建.gradle(应用程序):
    .....
flavorDimensions "mode", "client"
        productFlavors {
            /////// Distribution Modes ///////
            main {
                dimension "mode"
                versionName generateVersionName()
                manifestPlaceholders = [
                        app_label: "@string/app_name",
                        appIcon: "@mipmap/ic_launcher",
                        appIconRound: "@mipmap/ic_launcher_round"
                ]
            }
            beta {
                dimension "mode"
                applicationIdSuffix ".beta"
                manifestPlaceholders = [
                        app_label: "@string/app_name",
                        appIcon: "@mipmap/ic_launcher_beta",
                        appIconRound: "@mipmap/ic_launcher_beta_round"
                ]
            } .....
Run Code Online (Sandbox Code Playgroud)

android gradle android-productflavors

8
推荐指数
0
解决办法
1075
查看次数

Gradle预处理资产

我想在构建阶段对资产做一些事情.这是我的gradle脚本.

project.afterEvaluate{
    prepareDependencies.dependsOn("generateMyAssets")
}

task generateMyAssets() {
    copy {

        from('/') {
            include '**/*.html'
            filter {
                line -> line.replaceAll(/(<img src=\")(?!(.*:.*))/, '<img src="assets:')
            }
        }

        into 'assetsRegxped/'
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果有味道,如何灵活检索资产文件夹的名称(路径).另外我怎么才能改变构建版本?

android gradle gradlew android-productflavors

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

如何使用多个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万
查看次数

Android,Gradle,产品口味和清单

build.gradle,我有产品口味设置:

productFlavors
{
    AlternateFlavour
    {
        applicationId "com.myapp.alternateflavour"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在sourceSets部分中,我为这些风格使用不同的资源,资产和清单目录:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }

    AlternateFlavour {
        manifest.srcFile 'manifest-tmp/AlternateFlavour/AndroidManifest.xml'
        java.srcDirs = ['src']
        res.srcDirs = ['res-tmp/AlternateFlavour']
        assets.srcDirs = ['assets-tmp/AlternateFlavour']
        }
   }
Run Code Online (Sandbox Code Playgroud)

好到目前为止.

在那个由部分自动生成的风味使用的清单中,我有:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.myapp"
    android:versionCode="1010001"
    android:versionName="V1.1.0.1" >
Run Code Online (Sandbox Code Playgroud)

但在根项目的原始清单中如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.myapp.myapp"
    android:versionCode="1010000"
    android:versionName="V1.1.0.DEBUG" >
Run Code Online (Sandbox Code Playgroud)

这会导致Gradle失败:

Error:
    Attribute manifest@versionCode value=(1010001) from AndroidManifest.xml:4:5-28
    is also present at AndroidManifest.xml:4:5-28 value=(1010000).
Attributes of <manifest> …
Run Code Online (Sandbox Code Playgroud)

android gradle android-build android-productflavors android-build-flavors

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

Gradle/android:单个ndk构建多种口味?

我有一个build.gradle文件设置与以下(我显然排除了为简洁起见无关紧要的部分):

android { defaultConfig { ndk { abiFilters 'armeabi', 'armeabi-v7a', 'x86' } }
productFlavors {
    flavor1 { ... }
    flavor2 { ... }
    flavor3 { ... }
    flavor4 { ... }
    flavor5 { ... }
}
buildTypes {
    debug {
        externalNativeBuild { ndkBuild { cFlags '-DDEBUG' } }
        ...
    }
    release {
        externalNativeBuild { ndkBuild { cFlags '-DRELEASE' } }
        ...
    }
}
externalNativeBuild {
    ndkBuild {
       path 'jni/Android.mk'
    }
}
Run Code Online (Sandbox Code Playgroud)

工作,但它编译每个flavor + buildType的本机代码.所以不仅调试和发布,而且还有flavor1Debug,flavor2Release等,这需要永远

我如何告诉gradle只为两种构建类型执行externalNativeBuild,并将它们用于所有类型?

android gradle android-ndk android-gradle-plugin android-productflavors

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

在一次 Sonarquebe 分析中涵盖所有 gradle 风格

是否可以对所有口味进行一次声纳分析?我有一个多风格的 Android 项目,其中不同风格文件夹中的某些文件有不同的实现。这些文件在风味测试文件夹中有相应的测试。所以在示例中我的 src 结构是:

/main/java/../ConfigurationService.kt
/flavor1/java/../ConfigurationService.kt
/flavor2/java/../ConfigurationService.kt
/test/java/../ConfigurationServiceTests.kt
/testFlavor1/java/../ConfigurationServiceTests.kt
/testFlavor2/java/../ConfigurationServiceTests.kt
Run Code Online (Sandbox Code Playgroud)

现在我可以使用,sonarqube.androidVariant但这会让我一次只能配置一个变体,所以如果我想检查第二种风格的分析,我需要使用不同的设置再次运行该任务,而这在 Gitlab CI 中无法显示多个变体分析。我能够在运行声纳之前配置单独的 jacoco 任务来生成所有类型的覆盖率报告。然后我尝试将源目录添加到 sonarplugin,如下所示:

sonarqube {
    properties {
            //standard plugin configuration
            android.libraryVariants.each { variant ->
                if (variant.buildType.name != "debug") return //we run sonar only on debug
                def variantName = variant.name
                def flavorName = variant.flavorName
                properties["sonar.sources"] += "./src/${flavorName}/"
                properties["sonar.tests"] += "./src/test${flavorName.capitalize()}"
                // and so on for binaries, jacoco report paths etc.
            }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这最终会出现错误:

ConfigurationService.kt can't be indexed twice. Please check that inclusion/exclusion patterns …
Run Code Online (Sandbox Code Playgroud)

gradle sonarqube android-productflavors android-build-flavors

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