Ошибка компиляции; Почему мой продукт не может разрешить зависимости, которые были импортированы в / main? - PullRequest
0 голосов
/ 08 января 2019

Я унаследовал не очень хорошо поддерживаемое / документированное приложение для Android, и мне нужно добавить простой вид продукта, чтобы разрешить управление версиями в нашем приложении, в частности, версию, которая не отслеживает местоположение, и ту, которая делает (как, например, наше приложение уже делает).

Вот структура файла моего проекта: enter image description here

Я добавил разновидности продукта в файл приложения 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?

* Примечание: замените название моей организации и замените его на ****

...