Gradle项目依赖MultiDex

3

我有两个 .aar 文件需要作为依赖项添加到我的项目中。我导入了这些项目并按照以下步骤进行操作,结果非常顺利。

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

然而,我添加了许多其他库,不得不使用MultiDex库来支持64K方法以上的应用程序

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
}

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


@Tasos 是的,multiDexEnabled truedefaultConfig 中,同时 MultiDex.install(this); 被添加到 Application 类的 attachBaseContext() 方法中。我能够运行应用程序并执行许多任务。只有在调用这些库中的方法时才会崩溃。 - ᴛʜᴇᴘᴀᴛᴇʟ
我看到了 - 好的,这里有支持,看看你能否从Zoom获取帮助 https://support.zoom.us/hc/en-us - Tasos
尝试比较apk文件的内容(只需解压缩多dex版本和正在运行的版本)-在两个版本中都有libzoom_stlport.so(在lib文件夹下)吗? - Alex Lipov
libzoom_stlport.so 在非 multidex 版本中存在,但在 multidex 版本中不存在。我在另一个项目中进行了这个测试,该项目甚至不需要 multidex(它只有三个库。两个 zoom 库和一个用于 multidex)。 - ᴛʜᴇᴘᴀᴛᴇʟ
@th3pat3l 这个问题解决了吗?这是设备特定的吗? - AJay
显示剩余7条评论
2个回答

5
很抱歉,你所拥有的ZoomSDK不支持64位Android。同时,你需要在应用程序中禁用64位库,只支持所提到的框架以便以32位模式构建。
请将以下内容添加到应用程序的主模块的build.gradle文件中:
android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

来自Zoom论坛

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


1
我们只需要添加 abiFilters "armeabi-v7a",就可以解决 zoom 库的问题。 - AJay
Zoom SDK 现在支持 64 位设备吗? - Malwinder Singh
目前看起来还不行,因为我不得不实现相同的答案。 - Mark Lapasa

0
对于x86,可以通过英特尔ARM二进制翻译器(Houdini)进行支持。但是您的应用程序不应包含其他针对x86的本机二进制文件。
为了使应用程序在x86上运行,应用程序中的所有二进制文件都应针对ARM进行目标设置,二进制翻译器将把它们翻译成支持x86的文件。
如果您的应用程序包含其他针对x86的二进制文件,则应删除这些文件,仅保留ARM目标。因为在x86设备上,如果一个应用程序具有针对x86的二进制文件,它也应该具有针对ARM的文件。因为Zoom Android SDK不包含任何x86二进制文件,所以其他文件也不能具有针对x86的二进制文件,以便SDK运行。
ARM二进制翻译器在运行时工作,而不是在编译时。
您只需要将以下内容添加到主gradle文件即可。
android {
    defaultConfig {
        ndk {
            abiFilters "armeabi-v7a"
        }
    }
}

gradle.properties文件中添加以下行

android.useDeprecatedNdk = true

2
为什么android.useDeprecatedNdk = true对我有效,而不需要其他操作? - rubenwardy
@rubenwardy 酷,我也会尝试。你只需使用这些参数进行尝试。 - AJay
Zoom SDK现在支持64位设备吗? - Malwinder Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接