Articles of android productflavors

我可以一次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,每个变体,然后用正确的变体来调用它?

在Android Studio中testing不同风味的包

我在androidstudio中的应用程序上尝试口味。 我必须为这些风味编写不同的testing类,因为我有不同的风味类文件。 但我不知道是否有任何选项来指定build.gradle中的每个味道的testing包。 这是我的build.gradle供参考。 我使用AndroidStudio的0.4.6版本。 apply plugin: 'android' android { compileSdkVersion 19 buildToolsVersion "19.0.1" defaultConfig { minSdkVersion 8 targetSdkVersion 19 testPackageName "com.example.tests" } productFlavors { Paid { packageName "com.example.paid" } Free { packageName "com.example.free" } } sourceSets { main { java.srcDirs = ['src/main/java'] res.srcDirs = ['src/main/res'] } Paid { java.srcDirs = ['src/Paid/java'] res.srcDirs = ['src/Paid/res'] […]

如何在Android Studio中使用不同应用程序名称的风格?

在我的应用程序级build.gradle,我有以下风味: productFlavors { originalFlavour{ } freeFlavour{ } } 事情是build立两种口味,我得到相同的应用程序名称。 相反,我想为每种口味有不同的应用名称。 只要添加一个后缀将是有用的。 希望有人能帮助我。 提前致谢 编辑 : 应用程序/ SRC /主/ AndroidManifest.xml中 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="z.fncapps.etsiipod" > <uses-permission android:name="android.permission.CALL_PHONE" android:required="false" /> <uses-feature android:name="android.hardware.telephony" android:required="false"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <!– actvities declared here –> </application> </manifest> 应用程序/ SRC / freeFlavour / AndroidManifest.xml中 <uses-permission android:name="android.permission.CALL_PHONE" android:required="false" […]

Android Wear项目有3个版本,3个buildTypes和2个applicationIdSuffixes

尝试将wearApp风格和构buildtypes与applicationIdSuffixes结合后构build我的项目时,出现以下错误消息: Error:Execution failed for task ':app:handleFirstCustomerTestMicroApk'. > The main and the micro apps do not have the same package name. 从我的应用程序/ build.gradle: buildTypes { debug { applicationIdSuffix '.debug' debuggable true embedMicroApp = true } customerTest { applicationIdSuffix '.customertest' debuggable true embedMicroApp = true } release { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' minifyEnabled true embedMicroApp = true } […]