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'
}
и вот изображение моей структуры проекта, в котором я создал каталог демо-вкуса:
теперь к вопросу. У меня есть два класса с именем 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 не будет компилироваться. посмотрите на это фото:
теперь, наконец, давайте посмотрим на 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.
из изображения вы можете видеть, что я сделал все мои имена пакетов одинаковыми: как com.example.******.myapplication
. Поскольку все они имеют одинаковое имя пакета в MainActivity
вы просто импортировать Hello.java
С этим именем пакета, и он выберет правильный вариант во время сборки.
для ресурсов это выглядит по-другому, и он будет переопределять естественно, но файлы классов java должны делать это таким образом.