Fresco: 通过 App Bundle 构建时,Fresco 找不到“libimagepipeline.so”

创建于 2018-12-07  ·  21评论  ·  资料来源: facebook/fresco

描述

当启动一个使用 Fresco 的 Activity 时,它是通过Android App Bundle生成的,它无法找到“libimagepipeline.so”并导致应用程序崩溃。

再生产

  1. 创建一个使用 Fresco 的示例应用程序
  2. 生成签名包
  3. 使用Bundle Tool从 Bundle 构建 APK
  4. 使用捆绑工具,将 APK 安装到您的设备上
  5. 导航到初始化 Fresco 的活动
  6. 观察崩溃

解决方案

我最初认为这可能是 minify、R8 或 Proguard 的问题,但我禁用了所有这些,并且在通过 App Bundle 构建时仍然观察到相同的结果。

我已经测试了我的应用程序的其他组件也使用本机库,但它们都按预期运行,只是 Fresco 难以加载相应的二进制文件。

我发现的一个临时但并不理想的解决方案是使用以下配置禁用按abi拆分 APK,但包括所有二进制文件会导致 APK 大小显着增大。

android {
    // Rest of your configuration here

    bundle {
        abi {
            enableSplit false
        }
    }
}

附加信息

  • 壁画版本:1.10.0
  • 平台版本:三星SM-G955F,安卓8.0.0
bug help wanted

最有用的评论

我在 Fresco 使用的 SoLoader 库中发现了一个问题。 我已经准备好 PR 并修复:facebook/soloader#26
该修复使 fresco 与 app bundle 配合良好。
我已经发布了 SoLoader 库的补丁版本。 如果您不能等到 PR 合并,您可以在您的项目中使用它。

repositories {
    maven {
        url  "https://dl.bintray.com/nnesterov/maven" 
    }
}

compile('com.facebook.fresco:fresco:1.10.0') {
    exclude group: 'com.facebook.soloader', module: 'soloader'
}
compile("com.avito.android:patched-soloader:0.1.0")

所有21条评论

你的错误信息看起来像这样吗? 第2049章

是的,大致。 然而,这个问题虽然相关,但我认为更侧重于
在 Fresco 或 SoLoader 中缺乏对 Android App Bundle 的支持和
以这种方式拆分二进制文件。

我可能弄错了,但是这个问题在我使用过的每台设备上都可以重现
经过测试,而不仅仅是选择品牌。

并且根据 Fresco 运输指南,没有关于用例的说明
通过 Android App Bundles 发送,我们不能像 when 那样使用splits
你使用bundle splits键被忽略。

2018 年 12 月 11 日,星期二,06:40,KimiChiu, notifications @github.com 写道:

你的错误信息看起来像这样吗? 第2049章
https://github.com/facebook/fresco/issues/2049


您收到此消息是因为您创作了该线程。
直接回复本邮件,在GitHub上查看
https://github.com/facebook/fresco/issues/2253#issuecomment-446089907
或静音线程
https://github.com/notifications/unsubscribe-auth/ABUQnQ4cZ-sWkG5b72Ea81wiQjS02yjlks5u31NxgaJpZM4ZIsuf
.

@icerfish

感谢您提交此问题并提供所有必需的详细信息(如果您有时间,可以添加错误粘贴)。 我可以想象 Fresco 可能不完全支持应用程序包,而且我认为我们从未测试过交互作用。

我会将其标记为“错误”和“需要帮助”,希望开源社区可以帮助我们。

@lambdapioneer

这是堆栈跟踪:

FATAL EXCEPTION: FrescoIoBoundExecutor-8 Process: com.gobuzzvault.android, PID: 17499 java.lang.NoClassDefFoundError: com.facebook.imagepipeline.memory.NativeMemoryChunk at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:25) at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:13) at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:267) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferOutputStream.<init>(MemoryPooledByteBufferOutputStream.java:51) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:73) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:24) at com.facebook.imagepipeline.producers.LocalFetchProducer.getByteBufferBackedEncodedImage(LocalFetchProducer.java:87) at com.facebook.imagepipeline.producers.LocalFetchProducer.getEncodedImage(LocalFetchProducer.java:99) at com.facebook.imagepipeline.producers.LocalContentUriFetchProducer.getCameraImage(LocalContentUriFetchProducer.java:100) at com.facebook.imagepipeline.producers.LocalContentUriFetchProducer.getEncodedImage(LocalContentUriFetchProducer.java:76) at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:52) at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:48) at com.facebook.common.executors.StatefulRunnable.run(StatefulRunnable.java:43) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636) at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:51) at java.lang.Thread.run(Thread.java:764) Caused by: java.lang.UnsatisfiedLinkError: couldn't find DSO to load: libimagepipeline.so at com.facebook.soloader.SoLoader.doLoadLibraryBySoName(SoLoader.java:703) at com.facebook.soloader.SoLoader.loadLibraryBySoName(SoLoader.java:564) at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:500) at com.facebook.soloader.SoLoader.loadLibrary(SoLoader.java:455) at com.facebook.imagepipeline.nativecode.ImagePipelineNativeLoader.load(ImagePipelineNativeLoader.java:40) at com.facebook.imagepipeline.memory.NativeMemoryChunk.<clinit>(NativeMemoryChunk.java:31) at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:25) at com.facebook.imagepipeline.memory.NativeMemoryChunkPool.alloc(NativeMemoryChunkPool.java:13) at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:267) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferOutputStream.<init>(MemoryPooledByteBufferOutputStream.java:51) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:73) at com.facebook.imagepipeline.memory.MemoryPooledByteBufferFactory.newByteBuffer(MemoryPooledByteBufferFactory.java:24) at com.facebook.imagepipeline.producers.LocalFetchProducer.getByteBufferBackedEncodedImage(LocalFetchProducer.java:87) at com.facebook.imagepipeline.producers.LocalFetchProducer.getEncodedImage(LocalFetchProducer.java:99) at com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer.getThumbnail(LocalContentUriThumbnailFetchProducer.java:135) at com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer.getCameraImage(LocalContentUriThumbnailFetchProducer.java:100) at com.facebook.imagepipeline.producers.LocalContentUriThumbnailFetchProducer.getEncodedImage(LocalContentUriThumbnailFetchProducer.java:75) at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:52)  at com.facebook.imagepipeline.producers.LocalFetchProducer$1.getResult(LocalFetchProducer.java:48)  at com.facebook.common.executors.StatefulRunnable.run(StatefulRunnable.java:43)  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)  at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:51)  at java.lang.Thread.run(Thread.java:764)

它看起来与其他人遇到的问题相似。

环顾代码库,看起来这不是 Fresco 本身的问题,而是 SoLoader 库的问题。 我会将问题交叉发布到该存储库,工作负载允许花一些时间来尝试找出问题到底是什么。

嗨,我在使用应用程序包时遇到了同样的问题,如https://github.com/facebook/fresco/issues/2049#issuecomment -441088387 中所述

使用 Fresco 1.11 并在 Fresco 的 ImagePipelineConfig 中设置.experiment().setNativeCodeDisabled(true)使静态图像对我有用,但 GIF 因不同的堆栈跟踪而崩溃,这看起来与不同库的 SoLoader 问题相同。 @icerfish ,如果您不使用 GIF,这可能会对您有所帮助。

我在 Fresco 使用的 SoLoader 库中发现了一个问题。 我已经准备好 PR 并修复:facebook/soloader#26
该修复使 fresco 与 app bundle 配合良好。
我已经发布了 SoLoader 库的补丁版本。 如果您不能等到 PR 合并,您可以在您的项目中使用它。

repositories {
    maven {
        url  "https://dl.bintray.com/nnesterov/maven" 
    }
}

compile('com.facebook.fresco:fresco:1.10.0') {
    exclude group: 'com.facebook.soloader', module: 'soloader'
}
compile("com.avito.android:patched-soloader:0.1.0")

以前版本的 patched-soloader 不适用于 pre-lollipop 设备。 我已经修好了。 用
compile("com.avito.android:patched-soloader:0.1.1")

@nesterov-n 感谢您的出色修复,将其集成到壁画中有何进展?

@nesterov-n 我也面临同样的问题。 请让我知道它什么时候会被整合到 fresco 中?

@theromis和@sailesh2
我不在 Facebook 工作(太难过了)。 我只是 Fresco 用户,但我等不及要修复了。 所以我不得不调试它并修复它。
目前,我在我的项目中使用了修补版本的 soloder lib,正如我在上面的评论中所描述的。 最新版本是com.avito.android:patched-soloader:0.1.2

我现在正在审查我对 soloader lib 的 PR,但是 soloader 维护者告诉我们没有估计新的 soloader lib 版本。 所以无法估计 Fresco 什么时候会使用这个新版本。

如果紧急,您可以使用我的补丁版本。 我们发布了带有 fresco 的捆绑包以进行生产。 效果很好。

无法弄清楚为什么此解决方法尚未集成到 Fresco 中。

我们已经登陆了 SoLoader 修复程序。 SoLoader 版本发布后,我们将很快发布新的 Fresco 版本。

@oprisnik发布的预计

SoLoader v0.6.0 刚刚发布,我更新了 Fresco 依赖项(6fc071d1892166d11d1f237f10e2d9bcdf858087)。 我们要等待 MIT 许可的 Bolts 版本(#2257)。 如果该版本的发布时间比预期的要长,我们将暂时跳过它并在没有它的情况下发布。 无论如何,新版本应该会在几天内发布。

我不想沉闷,但壁画不应该发布吗? 似乎您指出的这个问题已经有一段时间没有收到任何活动了。

我们刚刚发布了版本1.12.0 ,包括固定SoLoader版本。

尝试添加 proguard

不要剥离任何用@DoNotStrip 注释的方法/类

-保持@com.facebook.common.internal.DoNotStrip 类 *
-keepclassmembers 类 * {
@com.facebook.common.internal.DoNotStrip *;
}

不要剥离任何用@DoNotOptimize 注释的方法/类

-保持@com.facebook.soloader.DoNotOptimize 类*
-keepclassmembers 类 * {
@com.facebook.soloader.DoNotOptimize *;
}

保留本地方法

-keepclassmembers 类 * {
本国的;
}

-不要警告okio。 *-不要警告 com.squareup.okhttp。 *
-不要警告 okhttp3。 *-dontwarn javax.annotation。 *
-不要警告 com.android.volley.toolbox。 *-dontwarn com.facebook.infer。 *

@ProHzen这是否修复了 soloader 崩溃?

是的,我解决了。

它仍然在 fresco 2.0.0 中,:-(,请提出解决方法,我只有 nexus 设备有问题

@ProHzen你好,你能把你的困惑清单发给我吗?我按照你的方式试过了,但没有用。
信息:
壁画:1.13.0
类路径 'com.android.tools. 构建:gradle :3.5.1'

此页面是否有帮助?
0 / 5 - 0 等级