Android Studio构建风格 - 如何以不同的风格获得相同的源文件

时间:2015-06-24 01:49:44

标签: android android-studio android-gradle android-flavors

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

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'
}

这是我的项目结构的图像,我在其中创建了一个demo flavor目录:

enter image description here

现在谈到这个问题。我有两个名为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不会编译的包。看这张照片:

enter image description here

现在最后让我们看一下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类

完成的

3 个答案:

答案 0 :(得分:10)

我认为你不能在主要风味和其他风味上有同一类。你应该创建另一种味道,然后将你的Hello类从主味转移到新的味道。此规则仅适用于.java文件。我的意思是你可以在主要风味中使用xml文件,在自定义风味中使用另一个版本,但是你不能用java文件执行此操作。

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

答案 1 :(得分:4)

我建议创建3个源集:

  • main - 包含常用类
  • 演示 - 包含特定于演示的类
  • 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']        
    }
}

P.S。我不确定java.srcDirs内容的语法 - 请仔细检查一下

答案 2 :(得分:2)

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

因此,fullDebug(即主文件夹)构建变体永远不会运行。始终运行flavor而不是主文件夹。主文件夹将用于保存其中的常见内容。

在我的情况下,我有一个美国和另一个国家的演示(演示和demo_us),我需要两种口味。我将始终为两者中的任何一个构建,并且不会构建main。

enter image description here

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

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