当启动一个使用 Fresco 的 Activity 时,它是通过Android App Bundle生成的,它无法找到“libimagepipeline.so”并导致应用程序崩溃。
我最初认为这可能是 minify、R8 或 Proguard 的问题,但我禁用了所有这些,并且在通过 App Bundle 构建时仍然观察到相同的结果。
我已经测试了我的应用程序的其他组件也使用本机库,但它们都按预期运行,只是 Fresco 难以加载相应的二进制文件。
我发现的一个临时但并不理想的解决方案是使用以下配置禁用按abi
拆分 APK,但包括所有二进制文件会导致 APK 大小显着增大。
android {
// Rest of your configuration here
bundle {
abi {
enableSplit false
}
}
}
你的错误信息看起来像这样吗? 第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
-保持@com.facebook.common.internal.DoNotStrip 类 *
-keepclassmembers 类 * {
@com.facebook.common.internal.DoNotStrip *;
}
-保持@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 设备有问题
最有用的评论
我在 Fresco 使用的 SoLoader 库中发现了一个问题。 我已经准备好 PR 并修复:facebook/soloader#26
该修复使 fresco 与 app bundle 配合良好。
我已经发布了 SoLoader 库的补丁版本。 如果您不能等到 PR 合并,您可以在您的项目中使用它。