Java 如何为通过gradle build变体生成的两个版本的GPS应用程序获取不同的图标?

Java 如何为通过gradle build变体生成的两个版本的GPS应用程序获取不同的图标?,java,android,android-studio,build.gradle,Java,Android,Android Studio,Build.gradle,我想让一个Android Studio AS 1.1.0项目创建两个APK文件:一个用于付费版本,一个用于免费版本的Google Play Store GPS应用程序。使用渐变构建变体。我很接近。我从一个项目上传了两个版本的免费和付费 唯一相对次要的问题是:我不能让这两个版本有不同的图标,也不能让动作栏为不同的应用显示不同的标题 因为我们处理的是口味,所以有三个AndroidManifest.xml文件:一个我可以编辑,两个gradle生成,每个口味一个。如果我编辑了这些内容,下一次生成时编辑内

我想让一个Android Studio AS 1.1.0项目创建两个APK文件:一个用于付费版本,一个用于免费版本的Google Play Store GPS应用程序。使用渐变构建变体。我很接近。我从一个项目上传了两个版本的免费和付费

唯一相对次要的问题是:我不能让这两个版本有不同的图标,也不能让动作栏为不同的应用显示不同的标题

因为我们处理的是口味,所以有三个AndroidManifest.xml文件:一个我可以编辑,两个gradle生成,每个口味一个。如果我编辑了这些内容,下一次生成时编辑内容将丢失

以下是我的AndroidManifest.xml:

我所做的工作基于列出的build.gradle文件,该文件的内容已过时,并标有////:

    buildscript {
        repositories {
            mavenCentral()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:0.5.+'  /////////(wrong version)
        }
    }
    apply plugin: 'android'

    repositories {
        mavenCentral()
    }

    android {
        compileSdkVersion 18
        buildToolsVersion "18.0.1"

        defaultConfig {
            minSdkVersion 15
            targetSdkVersion 18
        }

        productFlavors {
            production {
                packageName "be.tamere.gradlebuildtypesexample"   ////// packageName should be applicationId
            }

            staging {
                packageName "be.tamere.gradlebuildtypesexample.staging"
            }
        }
    }

    dependencies {
        compile 'com.android.support:appcompat-v7:18.0.0'
    }
我的工作也基于此关联文件结构的草图:

    +-- main
    ¦   +-- AndroidManifest.xml
    ¦   +-- ic_launcher-web.png
    ¦   +-- java
    ¦   ¦   +-- be
    ¦   ¦       +-- tamere
    ¦   ¦           +-- gradlebuildtypesexample
    ¦   ¦               +-- MainActivity.java
    ¦   +-- res
    ¦       +-- drawable-hdpi
    ¦       ¦   +-- ic_launcher.png
    ¦       +-- drawable-mdpi
    ¦       ¦   +-- ic_launcher.png
    ¦       +-- drawable-xhdpi
    ¦       ¦   +-- ic_launcher.png
    ¦       +-- drawable-xxhdpi
    ¦       ¦   +-- ic_launcher.png
    ¦       +-- layout
    ¦       ¦   +-- activity_main.xml
    ¦       +-- menu
    ¦       ¦   +-- main.xml
    ¦       +-- values
    ¦       ¦   +-- dimens.xml
    ¦       ¦   +-- strings.xml
    ¦       ¦   +-- styles.xml
    ¦       +-- values-v11
    ¦       ¦   +-- styles.xml
    ¦       +-- values-v14
    ¦           +-- styles.xml
    +-- production
    ¦   +-- java
    ¦       +-- be
    ¦           +-- tamere
    ¦               +-- gradlebuildtypesexample
    ¦                   +-- Constants.java
    +-- staging
        +-- java
        ¦   +-- be
        ¦       +-- tamere
        ¦           +-- gradlebuildtypesexample
        ¦               +-- Constants.java
        +-- res
            +-- drawable-hdpi
            ¦   +-- ic_launcher.png
            +-- drawable-mdpi
            ¦   +-- ic_launcher.png
            +-- drawable-xhdpi
            ¦   +-- ic_launcher.png
            +-- drawable-xxhdpi
            ¦   +-- ic_launcher.png
            +-- values
                +-- string.xml
我不知道在舞台上缺少符号是否重要。如果是这样,那可能就是我的分歧所在

当我尝试创建两个APK时,我最终得到了这个屏幕,这是一个好消息:

在AS内部,我看到了这一点,这是个好消息:

在Windows 7资源管理器中,我看到:

以下是我的内部结构:

这与链接中显示的结构相对应。特别要注意的是,免费版本中没有res文件夹。main中的res文件夹包含免费版本的图标。pro中的res文件夹包含pro版本的图标

如何为两个不同的APK获取不同的图标

为什么两个版本的操作栏中的标题都显示为完全限定的包名

有没有办法编辑生成的AndroidManifest.xml文件?或者让每种口味都有自己的可编辑AndroidManifest.xml

我无法使这两个版本具有不同的图标,也无法使操作栏为不同的应用程序显示不同的标题

步骤1:选择一个免费的或付费的,作为您在主/源集中拥有的。出于这个答案的目的,我假设自由的一个在main/中

步骤2:编辑main/res/values/strings.xml以获得所需的免费版本的app_名称资源,因为您正在清单中使用app_名称字符串资源

步骤3:创建一个paid/res/values/strings.xml,其中定义了app_name,其中包含了付费应用的显示名称所需的值

第4步:决定是使用mipmap还是drawables作为启动器图标。您似乎有mipmap目录,但您的清单引用了一个可绘制的资源。为了回答这个问题,我假设你会选择Mipmap

第五步:决定你要称之为启动器图标的内容。你的应用程序目前没有生成,它会出现,因为你的清单引用了一个kc_图标,但你的目录列表显示了ic_启动器。特别是,您希望该名称不是指免费或付费。我在这里假设你使用ic_发射器

步骤6:按照上面的方法重新组织图标和清单,并在主源集中使用免费版本的图标

步骤7:创建付费/res/mipmap-*/目录,并将ic_启动器图标的付费版本放在其中

因为我们处理的是口味,所以有三个AndroidManifest.xml文件:一个我可以编辑,两个gradle生成,每个口味一个。如果我编辑了这些内容,下一次生成时编辑内容将丢失

当然欢迎您在免费和付费的源集中使用AndroidManifest.xml文件。它们将与main、Gradle设置和任何依赖项的清单合并

话虽如此,你在这里不需要这个。有一个清单,指向标签和图标的一组资源。在主源集中有一个版本的标签和图标;将另一个放在产品风味的源集中,例如,按照上面的步骤付费

为什么两个版本的操作栏中的标题都显示为完全限定的包名

据推测,这就是app_name字符串资源值的值。如果不喜欢,请更改字符串资源

有没有办法编辑生成的AndroidManifest.xml文件

不是合并的

或者让每种口味都有自己的可编辑AndroidManifest.xml


见上文。同样,这不是解决您问题的正确方法。

下面是一张我在@commonware上被卡住的图片,非常清楚:

每个应用程序都有不同的应用程序名称:

Gradle通过ProductFlavors块声明消除歧义:

apply plugin: 'com.android.application'

android
{
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig
    {
        applicationId "com.dslomer64.kakurocombosbuildvariants"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes
    {
        release
        {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


    productFlavors
    {
        pro
        {
            applicationId "com.dslomer64.kakurocombosbuildvariants.pro"
        }
        free
        {
            applicationId "com.dslomer64.kakurocombosbuildvariants.free"
        }
    }
}

dependencies
{
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
}
下面是对这两种变体的MyActivity.java引用:

public class MyActivity extends Activity {

  boolean FREE = Free.FREE;
根据每个变量中FREE值的设置方式,变量为FREE-FREE=true或pro-FREE=false。以下是这两个变体类,它们在各自的文件中都被命名为Free:

在KakuroCombosbuild中 \app\src\free\java\com\dslomer64\kakurocombosbuildvariants\free.java:

在KakuroCombosBuildVariants\app\src\pro\java\com\dslomer64\KakuroCombosBuildVariants\Free.java中:


我使用了Android的Ribbonizer插件,由FUJI Goro编写

这是一个ribbonizer作为Android的Gradle插件,它会自动为启动器图标添加一个功能区


@公共软件哇。多好的回答啊。我需要花一段时间来检查我混乱中的大量文件和内容,并将你所说的应用于其中,但我敢打赌你已经告诉了我我所需要的。当我开始工作时,你的答案就是。谢谢你费力地回答了我冗长的问题。我不确定是否应该包含链接中的结构和gradle构建,因为它不是我的,可能会混淆,但你似乎已经完成了。@Commonware一个关闭,一个关闭。我没有编辑原始帖子,而是提供了一个答案,以便于显示我在app_名称方面的情况,但仍然没有解决。在我最终修复app_name之后,我将以某种方式取消我的答案。@commonware 2关闭,0结束。我没有把app_名称的引用放在活动中,而是放在应用程序中。没问题!谢谢
apply plugin: 'com.android.application'

android
{
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig
    {
        applicationId "com.dslomer64.kakurocombosbuildvariants"
        minSdkVersion 15
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes
    {
        release
        {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }


    productFlavors
    {
        pro
        {
            applicationId "com.dslomer64.kakurocombosbuildvariants.pro"
        }
        free
        {
            applicationId "com.dslomer64.kakurocombosbuildvariants.free"
        }
    }
}

dependencies
{
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
}
public class MyActivity extends Activity {

  boolean FREE = Free.FREE;
package com.dslomer64.kakurocombosbuildvariants;

public class Free
{
  public static final boolean FREE = true;
}
package com.dslomer64.kakurocombosbuildvariants;

public class Free
{
  public static final boolean FREE = false;
}