Articles of android productflavors

如何在Gradle构建脚本(Android)中定义和使用常量?

我正在使用Gradle作为其构建系统的Android应用程序。 我的目标是使用值(包名称)作为applicationId : productFlavors { orange { applicationId “com.fruits.android.orange” // … 但也要通过BuildConfig公开它,以便Java代码可以访问它。 此访问必须来自外部风格(即,应用程序的免费版本需要知道付费版本的软件包名称,以便它可以提示用户在Play商店中进行升级)。 所以我想做那样的事情: productFlavors { orange { applicationId orangeProPackage // … buildConfigField ‘String’, ‘ORANGE_PRO_PACKAGE’, “$orangeProPackage” // ? 只有我不确定如何定义orangeProPackage以便它在整个build.gradle中可见,并且不会破坏脚本。 因为有几种不同的味道,最好是我能以某种方式将所有这些常量分组(我猜?): def proPackages = [ orange: “…” apple: “…” banana: “…” ] 然后以一种干净,描述性的方式引用它们,如proPackages.orange等。 问题是,如何实现这一目标? 这不是重复的是否可以在Gradle中声明一个可用于Java的variables? 我已经看到了这个问题(以及其他一些问题)。 我知道如何声明buildConfigFields,我已经有很多了。 我的问题是重用与buildConfigField 和 applicationId相同的值。

Android – 如何获得Flavor的ApplicationId

我正在构建一个具有不同构建变体风格的应用程序。 口味是“免费”和“付费”。 我想在我的java类上创建一些逻辑,只有在应用程序为“付费”时才会触发。 因此,我需要一种方法来在gradle构建过程中设置“applicationId”,如下所示: gradle.build productFlavors { free { applicationId “com.example.free” resValue “string”, “app_name”, “Free App” versionName “1.0-free” } paid { applicationId “com.example.paid” resValue “string”, “app_name”, “Paid App” versionName “1.0-paid” } 一旦我有了应用程序ID,我就可以这样做: if(whateverpackageid.equals(“paid”)) { // Do something or trigger some premium functionality. } 我是否正确地说,在gradle构建过程中,“applicationId”最终会在应用程序编译后成为“包名”? 如果是这样,获得“应用程序ID”或“包名称”的最佳方法是什么,以便我可以在我的java文件中实现一些与风味相关的逻辑?

buildConfigField取决于flavor + buildType

我正在尝试根据flavor + buildType定义buildConfigVariable 。 理想情况下,这就是我想要的 productFlavors { strawberry { buildConfigField “String”, “WS_API_KEY”, name + variant.buildType.name } … more flavors .. } name确实包含“strawberry”,但我不知道是否可以访问variant的buildType 。 放在Android闭包之外我可以访问BuildType和variant ,但是后来我无法调用buildConfigField android.applicationVariants.all { variant -> println “****************************” println “variant: ${variant.name}” println “flavor: ${variant.flavorName}” println “****************************” if (variant.buildType.name == ‘release’) { if (variant.flavorName == ‘strawberry’) { buildConfigField “String”, “WS_API_KEY”, ‘”strawberry_release”‘ } else […]

在build.gradle中使用CPU ABI拆分时,不考虑Android产品风格

我想根据http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits基于CPU ABI进行APK拆分,但是我想将APK拆分为一个某些产品的味道。 所以我的build.gradle文件具有以下产品风格plain和market 。 实际上我希望在建立market风味时执行APK拆分。 android { productFlavors { plain { } market { splits { abi { enable true reset() include ‘armeabi’, ‘armeabi-v7a’, ‘x86’, ‘mips’ universalApk true } } } } } 但是,当我调用gradle assemblePlainDebug和assembleMarketDebug ,它们都会生成多个APK。 上面的配置有问题吗? 我正在使用com.android.tools.build:gradle:1.2.3 。

如何使用构建types(debug vs release)来设置不同的样式和应用程序名称?

背景 在Android Studio上,您可以拥有不同的构建types,每个types都有自己的配置,类似于产品风格(如此处所示) 问题 我希望每次安装我的应用程序时,我都会立即知道它的types – 发布或调试,只需查看它即可。 为此,我想我可以使用build.gradle文件: buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’ } debug { debuggable true } } 事情是,我不知道该放什么。 我希望应用程序名称不同(并且在字符串文件中有字符串,因为它已被翻译),并且我想将应用程序中的某些内容的样式设置为不同(例如,操作栏的颜色) 。 我发现我可以使用“resValue”(在这里find它),但由于某种原因,无论我做什么,它都无法编译: 如果资源已经被声明(比如在app-name中被翻译),则说资源是重复的 如果未声明资源,我无法通过code / xml访问它。 这个问题 如何为构建types使用不同的资源值,即使它们已经存在?

产品风味:find重复的类

我有一个非常愚蠢的问题,但我几小时后就坐在我的应用程序前面,但我无法理解问题所在。 我有一个Android应用程序(用kotlin编写),我想制作两种产品风格并覆盖产品风格的类/文件: 所以我的gradle脚本是这样的: apply plugin: ‘com.android.application’ apply plugin: ‘kotlin-android’ android { … productFlavors { foo { applicationId “com.foo” } } } 我的文件结构如下: – src – androidTest – foo – java – com – example – Bar.kt – main – java – com – example – Bar.kt – test 所以基本上我想在foo产品风格中覆盖Bar.kt文件,但不知何故它不起作用:它说类Bar是重复的。 任何提示?

如何在产品风味中使用不同的启动器活动?

我正在开发一个Android库项目,在默认的src / main / AndroidManifest.xml中,MainActivity是启动器活动。 为了别的原因,我创造了产品口味。 是的,如果我想在不同的产品口味中触发/显示不同的活动炎,它是完美的。 但是,我想保留src / main /文件夹中的默认启动器活动 ,同时将另一个调味活动注册为新的启动器活动。 因此,对于不同的产品口味,我可以有不同的启动器活动,从中我仍然可以在src / main /中启动原始的“启动器”活动。 有人可以告诉我如何实现这一目标吗? 非常感谢。 笔记: 不建议将if (BuildConfig.FLAVOR.equals(“flavorName”))代码添加到原始启动器活动中。 因为我不想从别人那里修改生产代码(这是一个库项目)。 我尝试过manifestmerger和tools:replace ,但似乎它不适用于intent-filter (我注意到了intent-filter的元素合并策略总是如此)。 如果这可能有效,请您指导我如何使其工作? 谢谢。

多个dex文件定义 / BuildConfig,找不到原因:

我正在使用新的gradle构建系统,我面临以下问题: UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexException: Multiple dex files define Lcom/kibo/mobi/BuildConfig; at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594) at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552) at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533) at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170) at com.android.dx.merge.DexMerger.merge(DexMerger.java:188) at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439) at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287) at com.android.dx.command.dexer.Main.run(Main.java:230) at com.android.dx.command.dexer.Main.main(Main.java:199) at com.android.dx.command.Main.main(Main.java:103) 打印依赖项我看不到任何东西,这里是: firstDebugCompile – ## Internal use, do not manually configure ## \— KiboGradle:KiboSDK:unspecified +— KiboGradle:TextInputAPI:unspecified +— KiboGradle:VoiceImeUtils:unspecified +— com.google.android.gms:play-services:5.0.77 | \— com.android.support:support-v4:19.1.0 +— com.squareup.picasso:picasso:2.3.2 +— […]

Crashlytics(Fabric)将应用程序变体(构建types,产品风格)分开组织

这是一个自我回答的问题,可以分享我的知识。 我有一个具有多种产品风格的项目,我希望使用不同的组织为每种产品风格整合Fabric。 我尝试使用Android Studio Fabric插件集成Fabric。 它补充道 进入main源集的AndroidManifest.xml 。 我决定在应用程序变体特定的源集中重写此条目: 然后我发现Fabric Gradle插件在构建期间生成了带有fabric api secret(AKA build secret)的crashlytics.properties文件,我应该将此文件包含在源代码控制中。 但是每次构建特定的应用程序变体时都会覆盖此文件,因为api secret对于每个应用程序都是唯一的。 如何针对每种应用程序变体使用单独的组织集成Fabric?

如何自定义产品口味的APK文件名?

我在build.gradle脚本中自定义Android应用程序的APK文件的名称,如下所示: android { defaultConfig { project.ext.set(“archivesBaseName”, “MyApplication”); } } 现在我正在使用产品口味: android { productFlavors { green { applicationId “com.example.myapplication.green” } blue { applicationId “com.example.myapplication.blue” } } } 有没有办法自定义每个APK的名称? 我尝试使用archiveBaseName和baseName但没有成功。 最后我想提出以下文件: build/outputs/apk/Blue-debug-1.2.1.apk build/outputs/apk/Blue-debug-unaligned.apk build/outputs/apk/Blue-release-1.2.1.apk build/outputs/apk/Blue-release-unaligned.apk build/outputs/apk/Green-debug-1.2.1.apk build/outputs/apk/Green-debug-unaligned.apk build/outputs/apk/Green-release-1.2.1.apk build/outputs/apk/Green-release-unaligned.apk