Android studio for app)でデモフレーバーを作成する必要があります。アプリレベルの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'
}
デモフレーバーディレクトリを作成した私のプロジェクト構造の画像です:
今問題に。 Hello.Javaという2つのクラスがあります。どちらもそれぞれのフレーバーにあり、異なるものを印刷します。ここで、両方のファイルを示します。
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";
};
}
そして、これがもう1つのHelloです。
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";
};
}
IDEコンパイルできないパッケージがある場合でも、最初のhello.Javaにはパッケージがありません。この写真を見てください。
最後に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からそれは言う:
2つのフレーバーに同じクラスの異なるバージョンが必要な場合は、両方のフレーバーで作成する必要があります。
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クラスで達成したいことです。
メインフレーバーと他のフレーバーで同じクラスを使用することはできないと思います。別のフレーバーを作成してから、Hello
クラスをメインフレーバーからその新しいフレーバーに移動するだけです。このルールは.Javaファイルにのみ適用されます。つまり、メインフレーバーにXMLファイルを、カスタムフレーバーに別のバージョンを含めることができますが、Javaファイルを使用してこれを行うことはできません。
ここ は、詳細な説明のある便利なリンクです。
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']
}
}
追伸Java.srcDirs
コンテンツの構文について本当にわからない-自分で再確認してください
クラスをオーバーライドすることはできましたが、重要なのは、クラスをメインフォルダーに含めることではありませんでした。
そのため、fullDebug(つまりメインフォルダー)ビルドバリアントは実行されません。メインフォルダーではなく、常にフレーバーを実行します。メインフォルダーは、一般的なものを保持するために使用されます。
私の場合、アメリカと他の国(demoとdemo_us)のデモがあり、2つのフレーバーが必要でした。私は常に2つのうちどちらかをビルドし、メインはビルドしません。
画像から、すべてのパッケージ名を同じにすることがわかります:com.example.******.myapplication
など。それらはすべてMainActivity
で同じパッケージ名を持っているので、そのパッケージ名でHello.Java
をインポートするだけで、ビルド時に適切なバリアントが選択されます。
リソースの場合、それは異なるように見え、自然にオーバーライドされますが、Javaクラスファイルはこのようにする必要があります。