标签: android-productflavors

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

我正在开发一个Android库项目,在默认的src/main/AndroidManifest.xml中,MainActivity是启动器活动.

为了别的原因,我创造了产品口味.是的,如果我想在不同的产品口味中触发/显示不同的活动炎,它是完美的.不过,我想保持默认的启动活动的src/main /文件夹,而登录其他口味的活动为新的发射活动.因此,对于不同的产品风格,我可以有不同的启动器活动,从中我仍然可以在src/main /中启动原始的"启动器"活动.

有人可以告诉我如何实现这一目标吗?非常感谢.

笔记:

  1. if (BuildConfig.FLAVOR.equals("flavorName"))不希望向原始启动器活动添加代码.因为我不想从别人那里修改生产代码(这是一个库项目).

  2. 我试过manifestmergertools:replace,但好像它不工作intent-filter(我注意到,对于意图过滤器的元素融合政策总是).

<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />

如果这可能有效,请您指导我如何使其工作?谢谢.

android android-manifest android-intent android-productflavors

22
推荐指数
2
解决办法
9147
查看次数

Android studio gradle flavor维度构建变量无法正常工作

我有一个应用程序的两个维度,然后调用绿色和蓝色.只有这两个维度,但无限数量的产品口味.这是我在gradle中设置它的方式

flavorDimensions "green", "blue"

productFlavors {

    one {
        applicationId "com.app.green.one"
        versionCode 1
        versionName "1.0.0.1";
        flavorDimension = "green"
    }
    two {
        applicationId "com.app.blue.two"
        versionCode 6
        versionName "1.0.1";
        flavorDimension = "blue"
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在我同步gradle之后,在构建变体选项卡中,我看到的是oneTwoDebug和oneTwoRelease,我应该看到greenOneDebug greenOneRelease,blueTwoDebug,blueTwoRelease

从理论上讲,我想将它扩展为类似的东西

one {
    applicationId "com.app.green.one"
    versionCode 1
    versionName "1.0.0.1";
    flavorDimension = "green"
}
two {
    applicationId "com.app.blue.two"
    versionCode 6
    versionName "1.0.1";
    flavorDimension = "blue"
}
three {
    applicationId "com.app.green.three"
    versionCode 1
    versionName "1.0.0.1";
    flavorDimension = "green"
}
four {
    applicationId "com.app.blue.four"
    versionCode 6
    versionName "1.0.1";
    flavorDimension = …
Run Code Online (Sandbox Code Playgroud)

gradle android-studio build.gradle android-gradle-plugin android-productflavors

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

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

我正在使用Gradle作为其构建系统的Android应用程序.

我的目标是使用值(包名称)作为applicationId:

productFlavors {
   orange {
      applicationId "com.fruits.android.orange"
      // ...
Run Code Online (Sandbox Code Playgroud)

但也要通过它来公开它,BuildConfig以便Java代码可以访问它.

此访问必须来自外部风格(即,应用程序的免费版本需要知道付费版本的软件包名称,以便它可以提示用户在Play商店中进行升级).

所以我想做那样的事情:

productFlavors {
   orange {
      applicationId orangeProPackage
      // ...


buildConfigField 'String', 'ORANGE_PRO_PACKAGE', "$orangeProPackage" // ?
Run Code Online (Sandbox Code Playgroud)

只有我不确定如何定义,orangeProPackage以便它在整个build.gradle中可见,并且不会破坏脚本.

因为有几种不同的味道,最好是我能以某种方式将所有这些常量分组(我猜?):

def proPackages = [
        orange: "..."
        apple: "..."
        banana: "..."
]
Run Code Online (Sandbox Code Playgroud)

然后以干净和描述性的方式引用它们等proPackages.orange.

问题是,如何实现这一目标?

这不是重复的是否可以在Gradle中声明一个可用于Java的变量?

我已经看到了这个问题(以及其他一些问题).我知道如何声明buildConfigFields,我已经有很多了.我的问题是重用与a buildConfigField applicationId.相同的价值.

groovy android build gradle android-productflavors

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

buildConfigField取决于flavor + buildType

我试图定义一个buildConfigVariable取决于香精 + buildType.理想情况下,这就是我想要的

productFlavors {
    strawberry {
        buildConfigField "String", "WS_API_KEY", name + variant.buildType.name
    }
    ... more flavors ..
}
Run Code Online (Sandbox Code Playgroud)

name确实包含"strawberry",但我不知道是否可以访问variantbuildType.

放置在Android闭包之外我可以访问BuildType变体,但后来我无法调用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 {
            buildConfigField "String", "WS_API_KEY", '"chocolate_release"'
        }
    } else if(variant.buildType.name == 'debug') {
        if …
Run Code Online (Sandbox Code Playgroud)

android android-gradle-plugin android-productflavors

15
推荐指数
1
解决办法
9655
查看次数

Android-Studio(或一般IDEA)重构多个源集

处理多个源集重构问题的好方法是什么?例如,不同的风格 - 或现在单元测试和集成测试.您只能有一个被认为是重命名的活动源集 - 因此其他源集最终可能会被破坏.你有什么策略来解决这个问题?也许有一个我缺少的帮助插件 - 或者其他一些可能有帮助的技巧.

android intellij-idea android-studio android-productflavors

15
推荐指数
1
解决办法
314
查看次数

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

背景

在Android Studio中,可以有不同的生成类型,每一种都有自己的配置,类似于产品的味道(如图所示这里)

问题

我希望每次我的应用程序安装在某个地方时,我都会立即知道它的类型 - 发布或调试,只需查看它即可.

为此,我想我可以使用build.gradle文件:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
    debug {
        debuggable true
    }
}
Run Code Online (Sandbox Code Playgroud)

事情是,我不知道该放什么.我希望应用程序名称不同(并且在字符串文件中有字符串,因为它已被翻译),并且我想将应用程序中某些内容的样式设置为不同(例如,操作栏的颜色) .

我发现我可以使用"resValue"(在这里找到它),但由于某种原因,无论我做什么,它都无法编译:

  • 如果资源已经被声明(比如在app-name中被翻译),则说资源是重复的
  • 如果资源未声明,我无法通过code/xml访问它.

这个问题

如何为构建类型使用不同的资源值,即使它们已经存在?

android android-resources android-studio android-productflavors android-build-type

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

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

我想根据http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits根据CPU ABI进行APK拆分,但是我想将APK拆分为一个某些产品的味道.

所以我的build.gradle文件有以下产品风格plainmarket.实际上我想在构建market风味时执行APK拆分.

android {
    productFlavors {
        plain {
        }
        market {
            splits {
                abi {
                    enable true
                    reset()
                    include 'armeabi', 'armeabi-v7a', 'x86', 'mips'
                    universalApk true
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,当我调用gradle assemblePlainDebugassembleMarketDebug,他们都产生了多个APK.上面的配置有问题吗?

我正在使用com.android.tools.build:gradle:1.2.3.

android apk android-gradle-plugin android-productflavors

15
推荐指数
1
解决办法
1713
查看次数

Android Studio:具有两个以上风味尺寸(风味组)的产品风味组合

我正在使用Android Studio(v 2.1,gradle plugin v 2.1.0)开发Android应用程序.我的应用程序有各种版本,它们共享许多通用代码,所以我决定使用flavor大小和产品风格来定制代码和资源的时间和地点.只要我只有两个风味尺寸,这就行了罚款.举个例子,我app.gradle

…
flavorDimensions "fruit", "color"

productFlavors {

    apple {
        dimension "fruit"
    }
    pear {
        dimension "fruit"
    }

    red {
        dimension "color"
    }
    yellow {
        dimension "color"
    }
}
…
Run Code Online (Sandbox Code Playgroud)

我的src文件夹是

src/
    appleRed/
    appleYellow/
    pearRed/
    pearYellow/
Run Code Online (Sandbox Code Playgroud)

每个都有我的代码的自定义版本.再次,作为一个例子

src/
    appleRed/java/com/example/ExampleFragment.java
    appleYellow/java/com/example/ExampleFragment.java
    pearRed/java/com/example/ExampleFragment.java
    pearYellow/java/com/example/ExampleFragment.java
Run Code Online (Sandbox Code Playgroud)

当然,没有实例ExampleFragmentsrc/main.

在开发期间的某个时刻,我必须包含应用程序的免费付费版本.我认为这可以通过添加一个新的名为味尺寸可以轻松实现version,并命名为两类产品的口味freepaid:

 …
flavorDimensions "fruit", "color”, “version”

productFlavors {

    apple {
        dimension "fruit"
    }
    pear { …
Run Code Online (Sandbox Code Playgroud)

android android-studio android-gradle-plugin android-productflavors android-flavordimension

15
推荐指数
1
解决办法
4571
查看次数

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

我有一个使用Gradle构建的Android应用程序,其中包含BuildTypes和Product Flavors(变体).我可以运行此命令来构建一个特定的apk:

./gradlew testFlavor1Debug
./gradlew testFlavor2Debug
Run Code Online (Sandbox Code Playgroud)

我必须在每个变体的build.gradle中创建一个自定义任务,例如:

./gradlew myCustomTaskFlavor1Debug
Run Code Online (Sandbox Code Playgroud)

我为此创建了一个任务:

android.applicationVariants.all { variant ->
    task ("myCustomTask${variant.name.capitalize()}") {
        println "*** TEST ***"
        println variant.name.capitalize()
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是所有变种都调用了这个任务,而不是我正在运行的唯一变种.输出:

./gradlew myCustomTaskFlavor1Debug

*** TEST ***
Flavor1Debug
*** TEST ***
Flavor1Release
*** TEST ***
Flavor2Debug
*** TEST ***
Flavor2Release
Run Code Online (Sandbox Code Playgroud)

预期产量:

./gradlew myCustomTaskFlavor1Debug

*** TEST ***
Flavor1Debug
Run Code Online (Sandbox Code Playgroud)

如何定义自定义任务,动态,每个变体,然后使用正确的变体调用它?

groovy android gradle android-productflavors

14
推荐指数
1
解决办法
4190
查看次数

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"
    }
Run Code Online (Sandbox Code Playgroud)

一旦我有了应用程序ID,我就可以这样做:

    if(whateverpackageid.equals("paid")) {
      // Do something or trigger some premium functionality.
    } 
Run Code Online (Sandbox Code Playgroud)

我是否正确地说,在gradle构建过程中,"applicationId"最终会在应用程序编译后成为"包名"?如果是这样,获得"应用程序ID"或"包名称"的最佳方法是什么,以便我可以在我的java文件中实现一些与味道相关的逻辑?

android gradle android-productflavors

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