1

我正在探索在 android 应用程序中使用 mapsfoge/graphhopper 的可能性,但无法使用 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)

我的应用程序 build.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,应用程序就可以正常运行。我还尝试从我的 gradle.build 文件中删除 mapsforge-map-android 行,因为 mapsforge 是通过 graphhopper 引入的,但仍然没有运气。

任何解决此问题的帮助将不胜感激!

4

3 回答 3

2

我如何解决问题的更新:

我无法准确追踪到底发生了什么,所以简单地理解以下内容:我的工作(尽管请注意这是根据 github 文档推荐的做事方式)。

我最终从 github 获取了最新的代码,将其编译到 jar 中(通过 shell 脚本)。这将创建一个 graphhopper-0.4-SHAPSHOT-android.jar 和 slf4j-android-1.6.1-RC1.jar,我将它们放在我项目的 libs 目录中。

注意:我认为问题可能是在 Github 上合并到当前 master 分支中的更新尚未推送到 Maven Central。您不能使用 .3 的 graphhopper 库,因为这是中央存储库中的唯一版本,所以您无法像我尝试的那样将 graphhopper 添加到您的 build.gradle 中。

于 2014-10-01T16:43:25.703 回答
1

我玩了一点,结果如下。好处是您不必重新编译源代码:

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'
}
于 2014-11-27T15:55:24.857 回答
0

我遇到了同样的问题,感谢@Blehi 的回答,我修复了它。问题主要在于 Android Studio 没有正确处理排除组。因此,对于 0.3 版的 graphhopper,这些是我的依赖项:

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'
    }
}
于 2014-12-14T09:35:54.990 回答