Graphhopper 0.3 в студии Android не компилируется: исключение Dex

Я изучаю возможность использования mapsfoge/graphhopper в приложении для Android, но не могу скомпилировать тест с помощью graphhopper.

Основываясь на исследованиях, я считаю, что проблема связана с зависимостями в graphhopper и mapsforge.

Вот исключение:

Execution failed for task ':app:dexDebug'.
Error Code:
    2
Output:

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Lcom/applantation/android/svg/ParserHelper;
    at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:594)
    at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:552)
    at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:533)
    at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:170)
    at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
    at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
    at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
    at com.android.dx.command.dexer.Main.run(Main.java:230)
    at com.android.dx.command.dexer.Main.main(Main.java:199)
    at com.android.dx.command.Main.main(Main.java:103)

Мое приложение builde.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.1.0"

    defaultConfig {
        applicationId "com.test.maptest"
        minSdkVersion 10
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.1.0'
    compile 'org.mapsforge:mapsforge-map-android:0.4.3'
    compile 'com.graphhopper:graphhopper-android:0.3'
}

Похоже, проблема связана с svg-android, на который опирается mapsforge-android. Что странно, так это то, что приложение соответствует требованиям и работает нормально, если я просто использую mapsforge-map-android. Я также попытался удалить строку mapsforge-map-android из моего файла gradle.build, так как mapsforge вводится через graphhopper, но все равно не повезло.

Любая помощь в решении этого вопроса будет высоко оценена!


person SjB    schedule 19.09.2014    source источник
comment
Вы не должны зависеть от graphhopper-android, только от graphhopper. И, возможно, исключите некоторые элементы ведения журнала и OSM, как мы делаем для нашего приложения для Android: github.com/graphhopper/graphhopper/blob/master/android/   -  person Karussell    schedule 25.09.2014
comment
Спасибо. В итоге я исправил это, загрузив последний исходный код с github, упаковав jar-файлы, а затем вставив их в свой каталог libs для включения в проект.   -  person SjB    schedule 29.09.2014


Ответы (3)


Обновление того, как я исправил проблему:

Я не смог точно отследить, что происходит, поэтому примите следующее как просто то, что есть: моя работа (хотя обратите внимание, что это рекомендуемый способ ведения дел в соответствии с документами github).

В итоге я взял последний код с github и скомпилировал его в jar-файлы (через сценарий оболочки). Это создает graphhopper-0.4-SHAPSHOT-android.jar и slf4j-android-1.6.1-RC1.jar, и я помещаю их в каталог libs моего проекта.

ПРИМЕЧАНИЕ. Я думаю, что проблема может заключаться в том, что обновления объединены в текущую основную ветку на Github, которые не были отправлены в Maven Central. Вы не можете использовать .3 библиотеки graphhopper, и поскольку это единственная версия в центральном репозитории, вы не можете просто добавить graphhopper в свой build.gradle, как я пытался.

person SjB    schedule 01.10.2014

Я немного поиграл с ним, и вот результат. Хорошо, что вам не нужно перекомпилировать исходный код:

compile 'org.mapsforge:mapsforge-map-android:0.5.0-rc1'
compile ('com.graphhopper:graphhopper:0.3') {
    exclude group: 'log4j', module: 'log4j'
    exclude group: 'org.slf4j', module: 'slf4j-log4j12'
    exclude group: 'org.slf4j', module: 'slf4j-api'
    exclude group: 'com.google.protobuf', module: 'protobuf-java'
    exclude group: 'org.openstreetmap.osmosis', module: 'osmosis-osm-binary'
    exclude group: 'org.apache.xmlgraphics', module: 'xmlgraphics-commons'
}
person Blehi    schedule 27.11.2014

У меня была такая же проблема, и благодаря ответу @Blehi я ее исправил. Проблема заключалась главным образом в том, что Android Studio неправильно обрабатывает группы исключений. Итак, для версии 0.3 графхоппера это мои зависимости:

dependencies {
    compile files('libs/mapsforge-core-0.4.3.jar')
    compile files('libs/mapsforge-map-0.4.3.jar')
    compile files('libs/mapsforge-map-android-0.4.3.jar')
    compile files('libs/mapsforge-map-reader-0.4.3.jar')
    compile files('libs/slf4j-android-1.6.1-RC1.jar')
    compile ('com.graphhopper:graphhopper:0.3') {
        exclude group: 'log4j', module: 'log4j'
        exclude group: 'org.slf4j', module: 'slf4j-log4j12'
        exclude group: 'org.slf4j', module: 'slf4j-api'
        exclude group: 'com.google.protobuf', module: 'protobuf-java'
        exclude group: 'org.openstreetmap.osmosis', module: 'osmosis-osm-binary'
        exclude group: 'org.apache.xmlgraphics', module: 'xmlgraphics-commons'
    }
}
person jurmeneta    schedule 14.12.2014