我需要在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目录:
现在谈到这个问题。我有两个名为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类
完成的答案 0 :(得分:10)
我认为你不能在主要风味和其他风味上有同一类。你应该创建另一种味道,然后将你的Hello
类从主味转移到新的味道。此规则仅适用于.java文件。我的意思是你可以在主要风味中使用xml文件,在自定义风味中使用另一个版本,但是你不能用java文件执行此操作。
here是一个有用的链接,可以进一步解释。
答案 1 :(得分:4)
我建议创建3个源集:
并使用:
声明它们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。
从图像中可以看出,我的所有包名都是相同的:如com.example.******.myapplication
。由于它们在MainActivity
中都具有相同的包名称,因此您只需使用该包名称导入Hello.java
,它将在构建时选择正确的变体。
对于资源,它看起来有所不同,它会自然地覆盖,但java类文件必须这样做。