21

我需要在 android studio 中为应用程序创建一个演示风格。在我的应用程序级别的 gradle 文件中,我创建了另一种名为 demo 的风格,当然默认风格是 full。它看起来像这样:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 22
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "com.example.uen229.myapplication"
        minSdkVersion 17
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        demo {
            applicationId "com.buildsystemexample.app.demo"
            versionName "1.0-demo"
        }
        full {
            applicationId "com.buildsystemexample.app.full"
            versionName "1.0-full"
        }
    }

}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

这是我的项目结构的图像,我在其中创建了一个演示风味目录:

在此处输入图像描述

现在谈这个问题。我有两个名为 Hello.java 的类。两者都有各自的口味并打印不同的东西。我现在将向您展示这两个文件:

import android.util.Log;

/** this is from demo flavor directory**/

public class Hello {

    Hello(){

        Log.v("","hello from demo");
    }

    public String getName();
        return "im from demo";

    };

}

这是另一个你好:

package com.example.uen229.myapplication;

import android.util.Log;


/** this is from full or main flavor directory**/
public class Hello {


    Hello(){

        Log.v("", "hello from main");
    }

    public String getName(){

        return "im from main";

    };
}

注意第一个 hello.java 没有包,即使我有一个包,IDE 也不会编译。看看这张照片:

在此处输入图像描述

现在最后让我们看看 mainActivity.java,看看当我切换构建变体时,它只为“im from main”做祝酒,但如果我使用 demoDebug 构建变体,我需要它来打印“im from demo”。如果我切换构建 demoDebug 的变体,它仍然打印“im from main”。任何人都可以帮忙:

public class MainActivity extends ActionBarActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Hello h = new Hello();
        Toast.makeText(this, h.getName(), Toast.LENGTH_LONG).show();

    }
}

更新

从stackoverflow它说:

如果您想在两种风格中拥有同一类的不同版本,则需要在两种风格中创建它。

src/flavor1/java/com/foo/A.java

src/flavor2/java/com/foo/A.java

然后你的代码src/main/java可以做:

import com.foo.A

根据选择的风味,使用正确的版本com.foo.A

这就是我想用 Hello 类完成的

4

3 回答 3

21

我认为您不能在主要风味和其他风味上拥有相同的班级。您应该只创建另一种风味,然后将您的Hello课程从主要风味转移到新风味。此规则仅适用于 .java 文件。我的意思是你可以有一个主要风格的 xml 文件和你的自定义风格的另一个版本,但你不能用 java 文件来做到这一点。

是一个有用的链接,有进一步的解释。

于 2015-06-24T02:17:58.840 回答
4

我建议创建 3 个源集:

  • main - 将包含公共类
  • demo - 包含演示特定的类
  • pro - 包含专业版本的类

并使用以下方法声明它们:

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src/main/java']
        res.srcDirs = ['src/main/res']
        assets.srcDirs = ['src/main/assets']
    }
    pro {
        manifest.srcFile 'src/pro/AndroidManifestPro.xml'
        java.srcDirs = ['src/main/java', 'src/pro/java']
    }
    demo {
        manifest.srcFile 'src/oldlite/AndroidManifestDemo.xml'
        java.srcDirs = ['src/main/java', 'src/demo/java']        
    }
}

PS不太确定内容的语法java.srcDirs- 请仔细检查自己

于 2015-06-24T11:48:41.957 回答
3

我能够覆盖类,但关键是不要将类包含在我的主文件夹中。

所以fullDebug(即主文件夹)构建变体永远不会运行。始终运行风味而不是主文件夹。主文件夹将仅用于保存常用的东西。

就我而言,我有一个针对美国和另一个国家的演示(demo 和 demo_us),我需要两种口味。我将始终为两者中的任何一个构建,并且不会构建 main。

在此处输入图像描述

从图片中你可以看到我将所有包名都设置为相同:like com.example.******.myapplication。由于它们都具有相同的包名称,因此MainActivity您只需使用该包名称导入Hello.java,它将在构建时选择正确的变体。

对于资源,它看起来是不同的,它会自然覆盖,但 java 类文件必须这样做。

于 2015-06-24T15:58:23.257 回答