21

Androidスタジオでアプリのデモフレーバーを作成する必要があります。私のアプリレベルの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";

    };

}

そして、これが他の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";

    };
}

最初の 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 から次のように述べています。

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 クラスで実現したいことです

4

3 に答える 3

21

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

hereは、詳細な説明を含む便利なリンクです。

于 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) のデモがあり、2 つのフレーバーが必要でした。私は常にどちらか一方をビルドし、メインはビルドしません。

ここに画像の説明を入力

画像からわかるように、すべてのパッケージ名を同じにしました: like com.example.******.myapplication. それらはすべて同じパッケージ名を持っているため、そのパッケージ名でMainActivityインポートするだけHello.javaで、ビルド時に正しいバリアントが選択されます。

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

于 2015-06-24T15:58:23.257 に答える