web-dev-qa-db-ja.com

Android Studioビルドフレーバー-さまざまなフレーバーで同じソースファイルを作成する方法

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

デモフレーバーディレクトリを作成した私のプロジェクト構造の画像です:

enter image description here

今問題に。 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にはパッケージがありません。この写真を見てください。

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からそれは言う:

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クラスで達成したいことです。

16
j2emanue

メインフレーバーと他のフレーバーで同じクラスを使用することはできないと思います。別のフレーバーを作成してから、Helloクラスをメインフレーバーからその新しいフレーバーに移動するだけです。このルールは.Javaファイルにのみ適用されます。つまり、メインフレーバーにXMLファイルを、カスタムフレーバーに別のバージョンを含めることができますが、Javaファイルを使用してこれを行うことはできません。

ここ は、詳細な説明のある便利なリンクです。

14

3つのソースセットを作成することをお勧めします。

  • main-一般的なクラスを含みます
  • デモ-デモ固有のクラスが含まれています
  • pro-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']        
    }
}

追伸Java.srcDirsコンテンツの構文について本当にわからない-自分で再確認してください

4

クラスをオーバーライドすることはできましたが、重要なのは、クラスをメインフォルダーに含めることではありませんでした。

そのため、fullDebug(つまりメインフォルダー)ビルドバリアントは実行されません。メインフォルダーではなく、常にフレーバーを実行します。メインフォルダーは、一般的なものを保持するために使用されます。

私の場合、アメリカと他の国(demoとdemo_us)のデモがあり、2つのフレーバーが必要でした。私は常に2つのうちどちらかをビルドし、メインはビルドしません。

enter image description here

画像から、すべてのパッケージ名を同じにすることがわかります:com.example.******.myapplicationなど。それらはすべてMainActivityで同じパッケージ名を持っているので、そのパッケージ名でHello.Javaをインポートするだけで、ビルド時に適切なバリアントが選択されます。

リソースの場合、それは異なるように見え、自然にオーバーライドされますが、Javaクラスファイルはこのようにする必要があります。

2
j2emanue