Articles of android productflavors

多个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

我可以一次build立所有我的gradlebuild立风味吗?

我有几个构build口味的应用程序。 我想一次构build所有不同风格的apks,并在我的/输出文件夹中find它们。 我不想select每种口味,并单独构build它。 我怎样才能做到这一点?

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

我正在使用Gradle作为构build系统的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的风味和资源文件

我有Android的gradle构build问题。 长话短说,我创造了两种口味: productFlavors{ abcDemoFree{ } abcDemo{ } } 每种口味都有他自己的活动(Settings.java)和layout(settings_layout.xml)。 从主要两个文件被删除,所以Settings.java和settings_layout.xml只存在于口味。 abcDemoFree – java – Settings.java – res – settings_layout.xml abcDemo – java – Settings.java – res – settings_layout.xml Android Studio创build了4个构build变体: abcDemoFreeDebug abcDemoFreeRelease abcDemoDebug abcDemoRelease 一切正常,我可以创buildapk与行为,我期待从每一个风味。 问题是,当我切换到一个buildVariant,例如abcDemoDebug,android studio从另一个味道的资源文件报告错误,在我的例子从abcDemoFreeDegub / res / settings_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" </LinearLayout> 这些线 xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" […]

Gradle获取当前的特定任务的味道

我正在尝试处理google-services.json和不同的风格。 该文件说,我们需要在根文件夹中的文件。 我有一个任务,可以很容易地从风格文件夹复制文件到根文件夹: task CopyToRoot(type: Copy) { def appModuleRootFolder = '.' def srcDir = 'src' def googleServicesJson = 'google-services.json' outputs.upToDateWhen { false } def flavorName = android.productFlavors.flavor1.name description = "Switches to $flavorName $googleServicesJson" delete "$appModuleRootFolder/$googleServicesJson" from "${srcDir}/$flavorName/" include "$googleServicesJson" into "$appModuleRootFolder" } 然后,在afterEvaluate我的力量 afterEvaluate { processFlavor1DebugGoogleServices.dependsOn CopyToRoot processFlavor1ReleaseGoogleServices.dependsOn CopyToRoot } 这只适用于1种风味(静态定义)。 如何为每一个味道做到这一点? 我有四种口味。 如何获得正在编译的当前风味? [ […]

用resConfig强制Android风格的语言环境

我正在尝试使用Android构build系统中的resConfig和resConfigs。 Android Studio版本1.2.2 Gradle版本1.2.3 OSX 10.10.3 我与我的项目有这两个选项的问题,所以我开始与android studio新的空白项目。 我附加了我的build.gradle,我只在其中添加了resConfigs“en”,“fr” android { defaultConfig { … resConfigs "en", "fr" … } } 并定义了2个基本口味 productFlavors { fr { resConfig "fr" } en { resConfig "en" } } 然后我创build了2个strings.xml文件,并编译了hello_world的默认标签 /src/main/res/values/strings.xml(默认) /src/main/res/values-en/strings.xml /src/main/res/values-fr/strings.xml 有了这个,我希望在MyApplication / app / build / intermediates / res / en / debug中只能看到3个值文件夹,因为我在resConfigs中只定义了“en”和“fr” /值/ /值恩/ /值-FR / […]

如何在Gradle构build文件中的其他地方访问buildConfigField

我试图在我的productFlavor块中设置一个buildConfigField,然后在我的gradle构build文件中的其他地方引用该字段,以便在为我的apk构build名称时可以使用此值。 例如 productFlavors{ flavor1{ buildConfigField "String", "APP_FLAVOR_NAME", '"MyApp-Flavor1"' } flavor2{ buildConfigField "String", "APP_FLAVOR_NAME", '"MyApp-Flavor2"' } 如何在我的build.gradle脚本的其他地方访问APP_FLAVOR_NAME? 我也在努力弄清楚如何在buildscript中引用flavor name作为构buildapk名称的另一个选项。 我怎样才能做到这一点?

每个变体的Android Gradle自定义任务

我有一个使用Gradle构build的Android应用程序,其中包含BuildTypes和Product Flavors(变体)。 我可以例如运行这个命令来build立一个特定的apk: ./gradlew testFlavor1Debug ./gradlew testFlavor2Debug 我必须在每个变体的build.gradle中创build一个自定义任务,例如: ./gradlew myCustomTaskFlavor1Debug 我为此创build了一个任务: android.applicationVariants.all { variant -> task ("myCustomTask${variant.name.capitalize()}") { println "*** TEST ***" println variant.name.capitalize() } } 我的问题是,这个任务被称为所有的变种,而不是我正在运行的唯一一个。 输出: ./gradlew myCustomTaskFlavor1Debug *** TEST *** Flavor1Debug *** TEST *** Flavor1Release *** TEST *** Flavor2Debug *** TEST *** Flavor2Release 预期产出: ./gradlew myCustomTaskFlavor1Debug *** TEST *** Flavor1Debug 我怎样才能定义一个自定义任务,dynamic,每个变体,然后用正确的变体来调用它?