Варианты Gradle для Android с настраиваемыми исходными наборами - как должны выглядеть файлы Gradle?
У меня есть старый проект Eclipse, который я перенес в android studio и настроил на использование ароматов. Казалось, что он работал нормально, пока я не начал пытаться использовать разные файлы Java между моими вкусами.
Моя настройка проекта такова:
ProjectRoot
+- acitonbarsherlock
+- facebook
+- myLib1
+- myProject
+- src
+- commonFiles
+- flavor1
+- flavor2
+- res
+- flavor1
+- flavor2
Внутренности внутреннего файла myProject для Android выглядят так:
android {
compileSdkVersion 17
buildToolsVersion "18.0.1"
signingConfigs {
...
}
productFlavors {
flavor2 {
}
flavor1 {
}
}
sourceSets{
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/commonFiles/java']
resources.srcDirs = ['src/commonFiles/java']
aidl.srcDirs = ['src/commonFiles/java']
renderscript.srcDirs = ['src/commonFiles/java']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
flavor2 {
manifest.srcFile 'AndroidManifest-flavor2.xml'
res.srcDirs = ['res-flavor2', 'res']
java.srcDirs = ['src/flavor2/java','src/commonFiles/java']
resources.srcDirs = ['src/flavor2/java','src/commonFiles/java']
aidl.srcDirs = ['src/flavor2/java','src/commonFiles/java']
renderscript.srcDirs = ['src/flavor2/java','src/commonFiles/java']
}
flavor1 {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/flavor1/java','src/commonFiles/java']
resources.srcDirs = ['src/flavor1/java','src/commonFiles/java']
aidl.srcDirs = ['src/flavor1/java','src/commonFiles/java']
renderscript.srcDirs = ['src/flavor1/java','src/commonFiles/java']
res.srcDirs = ['res-flavor1','res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
С моей настройкой, подобной этой, gradle жалуется на невозможность найти классы, которые я пытаюсь унаследовать от commonFiles в flav1 или flavour2.
Из различных других тем, на которые я смотрел здесь, я вижу других, даже не определяющих исходные наборы, и я чувствую, что то, что я делаю в них, возможно, слишком много.
Кто-нибудь экспериментировал с этим раньше и знает, как это нужно правильно настроить?
6 ответов
Я думаю, вам лучше не определять обычай sourceSets
но с использованием конфигурации Gradle по умолчанию. Я использовал для создания пользовательских наборов исходных кодов, пока не понял, что соглашения, ну, в общем, удобно.
Вы хотите что-то вроде этого:
+ src
+ main // this is your common code
+ java
+ res
+ flavor1
+ java
+ res
+ flavor2
+ java
+ res
Затем вы можете просто удалить закрытие исходных кодов из вашего build.gradle
ПРИМЕЧАНИЕ: для gradle
конфигурации, ресурсы объединены или переопределены, тогда как все java
код помещается в тот же путь к классу. Например, AndroidManifest.xml
файлы для каждого аромата должны иметь только отличия от main
файл манифеста. Имея актив, например, ic_launcher
в аромате перекрывает ic_launcher
из основного, если такой файл существует. Тем не менее, имея файл HomeActivity.java
в обоих main
и аромат не возможен и выдаст дубликат ошибки файла.
Вы можете использовать обычай sourceSets
а также flavours
(или же buildTypes
) если хотите.
Например, вы можете установить их в своем файле Gradle следующим образом:
productFlavors {
flavor2 {
}
flavor1 {
}
}
sourceSets{
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src/commonFiles/java']
resources.srcDirs = ['src/commonFiles/java']
aidl.srcDirs = ['src/commonFiles/java']
renderscript.srcDirs = ['src/commonFiles/java']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
flavor1 {
java.srcDirs = ['src-flavor1']
res.srcDirs = ['res-flavor1']
...
}
}
Этот способ работает для меня. наслаждаться
sourceSets {
main {
manifest.srcFile 'src/AndroidManifest.xml'
java.srcDirs = ['src/java']
resources.srcDirs = ['srs/others']
res.srcDirs = ['src/res']
assets.srcDirs = ['src/assets']
jniLibs.srcDirs = ['jniLibs']
}
development{
res.srcDirs += ['development/src/res']
}
standford{
res.srcDirs += ['standford/src/res']
}
commercial{
res.srcDirs += ['commercial/src/res']
}
}
productFlavors {
development{
flavorDimensions "default"
}
standford{
flavorDimensions "default"
}
commercial{
flavorDimensions "default"
}
}
Вот как выглядит мой Gradle:
productFlavors {
// Still keeping the productFlavors closure in case we decide to add flavors later
normal {
applicationId 'com.akshat'
}
qa {
applicationId 'com.akshat.qa'
}
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jni.srcDirs = [] // Set empty since we use our own ndkBuild task
jniLibs.srcDirs = ['libs']
}
normal {
java.srcDirs = ['src_normal']
}
qa{
java.srcDirs = ['src_qa']
}
А вот как выглядит моя структура каталогов:
MyApplication
- res
- libs
- jni
- src
-com/akshat/
- src_qa
- com/akshat/util/FlavorConst.java
- src_normal
- com/akshat/util/FlavorConst.java
Вы можете код, как в примере ниже, я беру
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
res.srcDirs = ['res']
java.srcDirs = ['src', '../3party/Alohalytics/src/android/java', 'ttsearch/jni/out']
assets.srcDirs = ['assets', 'flavors/mwm-ttf-assets']
jniLibs.srcDirs = ['libs', 'jniLibs', 'ttsearch/libs']
}
flavor {
manifest.srcFile 'flavor'
assets.srcDirs = ['flavor/assets']
res.srcDirs = ['flavor/res']
res.srcDirs = ['flavor/res']
....
}
}
Вариант с пользовательскими наборами источников имеет проблему. Например, если мы хотим изменить только несколько строк для некоторых вариантов, у нас есть структура xxx/res-paid/values/strings.xml с двумя строками, которые используются в файле манифеста. в этом случае у нас есть ошибка привязки android для файла манифеста. Так что вариант с кастомными исходниками не работает, как должен. Возможно, я сообщу об этом в Google и Gradle.