【问题标题】:gradle project dependency with MultiDex使用 MultiDex 的 gradle 项目依赖
【发布时间】:2017-07-29 11:25:42
【问题描述】:

我有两个.aar 文件需要作为依赖项添加到我的项目中。我导入了项目并执行了以下操作,效果很好。

dependencies {
    compile project(':zoomcommonlib')
    compile project(':zoomsdk')
}

但是,我添加了许多其他库,我不得不使用MultiDex library to support apps over 64K methods

dependencies {
    compile 'com.android.support:multidex:1.0.1'
    compile project(':zoomcommonlib')
    compile project(':zoomsdk')
    compile 'com.google.android.gms:play-services-maps:10.2.0'
    compile 'com.google.android.gms:play-services-location:10.2.0'
    .....
}

是的,MultiDex 设置正确,因为我可以毫无问题地构建应用程序并运行它。

问题:当我尝试使用这些特定项目时,应用程序崩溃了。关注日志:

18790-18790/com.mypackage.name E/UncaughtException: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mypackage.name-1/base.apk", zip file "/data/app/com.mypackage.name-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mypackage.name-1/lib/arm64, /data/app/com.mypackage.name-1/base.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_dependencies_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_0_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_1_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_2_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_3_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_4_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_5_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_6_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_7_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_8_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_9_apk.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libzoom_stlport.so"
       at java.lang.Runtime.loadLibrary0(Runtime.java:984)
       at java.lang.System.loadLibrary(System.java:1530)
       at com.zipow.cmmlib.AppContext.<clinit>(AppContext.java:31)
       at com.zipow.cmmlib.AppContext.initialize(AppContext.java:64)
       at us.zoom.sdk.ZoomSDK.initialize(ZoomSDK.java:225)
       at us.zoom.sdk.ZoomSDK.initialize(ZoomSDK.java:184)
       at com.mypackage.name.SectionListActivity.getInitializedZoomSDK(SectionListActivity.java:857)
       at com.mypackage.name.SectionListActivity.access$1500(SectionListActivity.java:88)
       at com.mypackage.name.SectionListActivity$8.onClick(SectionListActivity.java:812)
       at android.view.View.performClick(View.java:5637)
       at android.view.View$PerformClick.run(View.java:22429)
       at android.os.Handler.handleCallback(Handler.java:751)
       at android.os.Handler.dispatchMessage(Handler.java:95)
       at android.os.Looper.loop(Looper.java:154)
       at android.app.ActivityThread.main(ActivityThread.java:6119)
       at java.lang.reflect.Method.invoke(Native Method)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
18790-18899/com.mypackage.name D/FA: Logging event (FE): _ae, Bundle[{_o=crash, _sc=SectionListActivity, _si=7450316610930895524, timestamp=1488996958198, fatal=1}]
18790-18899/com.mypackage.name V/FA: Using measurement service
18790-18899/com.mypackage.name V/FA: Connecting to remote service

                                                                  --------- beginning of crash
18790-18790/com.mypackage.name E/AndroidRuntime: FATAL EXCEPTION: main
      Process: com.mypackage.name, PID: 18790
      java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.mypackage.name-1/base.apk", zip file "/data/app/com.mypackage.name-1/split_lib_dependencies_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_0_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_1_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_2_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_3_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_4_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_5_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_6_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_7_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_8_apk.apk", zip file "/data/app/com.mypackage.name-1/split_lib_slice_9_apk.apk"],nativeLibraryDirectories=[/data/app/com.mypackage.name-1/lib/arm64, /data/app/com.mypackage.name-1/base.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_dependencies_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_0_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_1_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_2_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_3_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_4_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_5_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_6_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_7_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_8_apk.apk!/lib/arm64-v8a, /data/app/com.mypackage.name-1/split_lib_slice_9_apk.apk!/lib/arm64-v8a, /system/lib64, /vendor/lib64]]] couldn't find "libzoom_stlport.so"
      at java.lang.Runtime.loadLibrary0(Runtime.java:984)
      at java.lang.System.loadLibrary(System.java:1530)
      at com.zipow.cmmlib.AppContext.<clinit>(AppContext.java:31)
      at com.zipow.cmmlib.AppContext.initialize(AppContext.java:64)
      at us.zoom.sdk.ZoomSDK.initialize(ZoomSDK.java:225)
      at us.zoom.sdk.ZoomSDK.initialize(ZoomSDK.java:184)
      at com.mypackage.name.SectionListActivity.getInitializedZoomSDK(SectionListActivity.java:857)
      at com.mypackage.name.SectionListActivity.access$1500(SectionListActivity.java:88)
      at com.mypackage.name.SectionListActivity$8.onClick(SectionListActivity.java:812)
      at android.view.View.performClick(View.java:5637)
      at android.view.View$PerformClick.run(View.java:22429)
      at android.os.Handler.handleCallback(Handler.java:751)
      at android.os.Handler.dispatchMessage(Handler.java:95)
      at android.os.Looper.loop(Looper.java:154)
      at android.app.ActivityThread.main(ActivityThread.java:6119)
      at java.lang.reflect.Method.invoke(Native Method)
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

据我了解,这些项目依赖项在启用 MultiDex 的情况下无法正确添加。我是否缺少项目依赖项的一些配置?

我还在build.gradle 文件中尝试了以下内容。

dexOptions {
    preDexLibraries = false
}

似乎对它没有影响。每次都会崩溃。

【问题讨论】:

  • 你在gradledeveloper.android.com/studio/build/multidex.html987654322@的defaultConfig下有没有(multiDexEnabled true)
  • @Tasos 是的,multiDexEnabled truedefaultConfig 中,并且`MultiDex.install(this);` 被添加到Application 类的attachBaseContext() 中。我能够运行该应用程序并执行许多任务。只有当我从这些库中调用方法时它才会崩溃
  • 看起来 dex 正在运行,但是您遇到了这个错误——找不到“libzoom_stlport.so”——所以它看起来好像缺少一个文件
  • 但是当我删除 multidex 和其他一些依赖项时,它工作正常。我还创建了一个只有这两个依赖项的新项目,它也可以正常工作。添加multidex库后它才停止工作
  • 我明白了——这里有支持,看看你能不能从zoomsupport.zoom.us/hc/en-us得到帮助

标签: android android-gradle-plugin android-multidex


【解决方案1】:

很遗憾,您拥有的 ZoomSDK 不支持 64 位 Android。同时,您需要在您的应用程序中disable the use of 64bit libraries 并且仅支持上述框架,因此它以 32 位模式构建。

将以下内容添加到应用主模块的 build.gradle 中:

android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

来自Zoom forum

我们现在只支持 32 位库。要在 64 位设备上工作,您应该 不使用其他 64 位库(来自其他项目或其他第三方 开发工具包)。 Android 操作系统可以在 64 位设备上支持 32 位库,如果您 项目中没有其他 64 位库

【讨论】:

  • 我们只需要添加abiFilters "armeabi-v7a"就可以解决zoom库的问题
  • zoom sdk 现在支持 64 位设备了吗?
  • 此时,看起来仍然没有,因为我必须实现相同的答案,
【解决方案2】:

对于 x86,可以通过 Intel ARM 二进制转换器支持 (胡迪尼)。但您的应用不应包含其他针对 x86 的原生 二进制文件。

  1. 为了让应用程序在 x86 上运行,应用程序中的所有二进制文件都应以 ARM 为目标,二进制翻译器会将它们翻译成 支持 x86。

  2. 如果您的应用程序包含其他以 x86 为目标的二进制文件,则应删除这些文件以仅保留 ARM 目标。因为在 x86 上 设备,如果应用程序在 x86 上有二进制文件,它也应该 有针对ARM的文件。因为 Zoom Android SDK 没有 包含任何 x86 二进制文件,因此其他文件也不能有二进制文件 该目标在 x86 上,以便 SDK 运行。

  3. ARM 二进制翻译器在运行时工作,而不是在编译时工作。

您只需将以下内容添加到主 gradle 文件中

android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

并在gradle.properties 文件中添加以下行

android.useDeprecatedNdk = true

【讨论】:

  • 为什么android.useDeprecatedNdk = true 对我有用
  • @rubenwardy 酷我也会试试。你只用这个参数试试。
  • zoom sdk 现在支持 64 位设备了吗?
猜你喜欢
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-04
相关资源
最近更新 更多