Я унаследовал не очень хорошо поддерживаемое / документированное приложение для Android, и мне нужно добавить простой вид продукта, чтобы разрешить управление версиями в нашем приложении, в частности, версию, которая не отслеживает местоположение, и ту, которая делает (как, например, наше приложение уже делает).
Вот структура файла моего проекта:
Я добавил разновидности продукта в файл приложения build.gradle, как указано в документации разработчика Android. Вот файл уровня приложения build.gradle:
apply plugin: 'com.android.library'
apply plugin: 'com.novoda.bintray-release'
android {
flavorDimensions "version"
compileSdkVersion 27
defaultConfig {
minSdkVersion 14
targetSdkVersion 27
versionCode 1
versionName version
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
productFlavors {
nonLocationTracking {
dimension "version"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
manifestPlaceholders = [appName: "@string/app_name_non_location"]
}
locationTracking {
dimension "version"
minSdkVersion 14
targetSdkVersion 27
versionCode 1
manifestPlaceholders = [appName: "@string/app_name_location"]
}
}
lintOptions {
abortOnError false
}
publishNonDefault true
}
configurations {
javadocDeps
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:support-annotations:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.mcxiaoke.volley:library:1.0.19'
implementation 'com.google.android.gms:play-services-ads:15.0.1'
}
publish {
userOrg = '****'
groupId = 'com.****.android'
artifactId = '****'
publishVersion = '2.0.0'
desc = 'survata sdk'
website = 'https://github.com/****/****-android-public-sdk'
}
После этого я получаю эту ошибку компиляции:
org.gradle.initialization.ReportedException:
org.gradle.internal.exceptions.LocationAwareException: Execution failed for
task ':survata-sample:compileDebugJavaWithJavac'
, за которым следует эта трассировка стека, которая указывает на импортированные зависимости, которые не могут быть разрешены:
/Users/alexg/git/****-android-public-sdk
****-sample/src/main/java
com/****/demo/ui/SurveyDebugOption.java
error: cannot find symbol class Survey
error: cannot find symbol class SurveyOption
error: cannot find symbol variable super
error: method does not override or implement a method from a supertype
com/survata/demo/ui/DemoFragment.java
error: cannot find symbol class Survey
error: cannot find symbol class Survey
error: cannot find symbol class SurveyOption
error: cannot find symbol class Survey
error: package Survey does not exist
Этот SDK (откуда взялся вышеупомянутый build.gradle) загружается в пример приложения, которое также существует в этой папке проекта, как показано на скриншоте структуры файла выше. Конкретная проблема заключается в том, что после создания вариантов продукта в build.gradle вышеприведенного sdk пример приложения больше не может разрешать импортированные зависимости, которые приходят из импортированного sdk.
Вот пример файла build.gradle приложения:
apply plugin: 'com.android.application'
def computeVersionCode = { ->
def stdout = new ByteArrayOutputStream()
exec {
commandLine 'git', 'rev-list', 'HEAD', '--count'
standardOutput = stdout
}
return stdout.toString().trim().toInteger();
}
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.****.demo"
minSdkVersion 15
targetSdkVersion 27
versionCode computeVersionCode()
versionName "1.0"
renderscriptTargetApi 20
renderscriptSupportModeEnabled true
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
signingConfigs {
debugConfig {
storeFile file("debug.jks")
storePassword "****"
keyAlias "com.****.android"
keyPassword "****"
}
releaseConfig {
storeFile file("release.jks")
storePassword "****"
keyAlias "com.****.android"
keyPassword "****"
}
}
buildTypes {
debug {
signingConfig signingConfigs.debugConfig
}
release {
signingConfig signingConfigs.releaseConfig
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
implementation 'com.android.support:design:27.1.1'
implementation 'com.android.support:preference-v7:27.1.1'
implementation 'com.google.guava:guava:23.0'
implementation 'com.squareup:seismic:1.0.2'
implementation 'net.hockeyapp.android:HockeySDK:3.7.0'
implementation 'jp.wasabeef:blurry:1.0.5'
implementation project(path: ':****-sdk', configuration: 'default')
testImplementation 'junit:junit:4.12'
}
У меня сложилось впечатление, что файлы в / main могут использоваться любым продуктом, который не переопределяет этот код. Я ошибаюсь по этому поводу? Может кто-нибудь сказать мне, что я делаю не так, и как я могу настроить свои варианты продукта так, чтобы они использовали зависимости в / main?
* Примечание: замените название моей организации и замените его на ****