Android Studio build flavors - как иметь одинаковые исходные файлы в разных вариантах

мне нужно создать демо-вкус в Android studio для приложения. В моем файле 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.Ява. Оба находятся там соответствующие ароматы и печать разные вещи. Сейчас я покажу вам оба файла:

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";

    };
}

обратите внимание, как первый привет.java не имеет пакета, даже если у меня был пакет, IDE не будет компилироваться. посмотрите на это фото:

enter image description here

теперь, наконец, давайте посмотрим на mainActivity.java, чтобы увидеть, что когда я переключаю варианты сборки, он делает только тост для "im from main", но мне нужно, чтобы напечатать его из демо", если я использую вариант сборки demoDebug. Если я переключу вариант сборки на 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 is используемый.

это то, что я хочу сделать с классом Hello

3 ответов


Я думаю, что вы не можете иметь тот же класс в основном вкусе и другом вкусе. вы должны просто создать другой аромат, а затем переместить свой Hello класс от основного вкуса к этому новому вкусу. это правило только для .Java-файл. Я имею в виду, что у вас может быть xml-файл в основном вкусе и другая версия в вашем пользовательском вкусе, но вы не можете сделать это с файлами java.

здесь полезная ссылка с разъяснением.


Я бы посоветовал создать 3 комплекта источник:

  • main-который будет содержать общие классы
  • demo-содержит демонстрационные конкретные классы
  • 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']        
    }
}

P. S. Не совсем уверен насчет синтаксиса java.srcDirs содержание - пожалуйста, дважды проверьте себя


я смог переопределить классы, но ключ не должен был включать класс в мою основную папку.

таким образом, вариант сборки fullDebug (т. е. основная папка) никогда не будет запущен. Всегда запускайте flavor, а не основную папку. Основная папка будет использоваться только для хранения общих вещей в ней.

в моем случае у меня была демо для США и другой страны (demo и demo_us), и мне нужны были два вкуса. Я всегда буду строить для любого из них и не буду строить main.

enter image description here

из изображения вы можете видеть, что я сделал все мои имена пакетов одинаковыми: как com.example.******.myapplication. Поскольку все они имеют одинаковое имя пакета в MainActivity вы просто импортировать Hello.java С этим именем пакета, и он выберет правильный вариант во время сборки.

для ресурсов это выглядит по-другому, и он будет переопределять естественно, но файлы классов java должны делать это таким образом.