In the process of using the latest version 3.0.0 of Facebook's fresco, I discovered a very pitiful bug. When loading a jpeg image, a crash message indicating that the so was not found was reported:
Fatal Exception: java.lang.UnsatisfiedLinkError: dlopen failed: library "libnative-imagetranscoder.so" not found
at java.lang.Runtime.loadLibrary0(Runtime.java:1082)
at java.lang.Runtime.loadLibrary0(Runtime.java:1003)
at java.lang.System.loadLibrary(System.java:1661)
at com.facebook.soloader.nativeloader.SystemDelegate.loadLibrary(SystemDelegate.java:24)
at com.facebook.soloader.nativeloader.NativeLoader.loadLibrary(NativeLoader.java:52)
at com.facebook.soloader.nativeloader.NativeLoader.loadLibrary(NativeLoader.java:30)
at com.facebook.imagepipeline.nativecode.NativeJpegTranscoderSoLoader.ensure(NativeJpegTranscoderSoLoader.java:33)
at com.facebook.imagepipeline.nativecode.NativeJpegTranscoder.<init>(NativeJpegTranscoder.java:59)
at com.facebook.imagepipeline.nativecode.NativeJpegTranscoderFactory.createImageTranscoder(NativeJpegTranscoderFactory.java:43)
at com.facebook.imagepipeline.transcoder.MultiImageTranscoderFactory.getNativeImageTranscoder(MultiImageTranscoderFactory.kt:59)
at com.facebook.imagepipeline.transcoder.MultiImageTranscoderFactory.createImageTranscoder(MultiImageTranscoderFactory.kt:40)
at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:166)
at com.facebook.imagepipeline.producers.ResizeAndRotateProducer$TransformingConsumer.onNewResultImpl(ResizeAndRotateProducer.java:84)
at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:49)
at com.facebook.imagepipeline.producers.AddImageTransformMetaDataProducer$AddImageTransformMetaDataConsumer.onNewResultImpl(AddImageTransformMetaDataProducer.java:33)
at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer.onNextResult(MultiplexProducer.java:510)
at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:569)
at com.facebook.imagepipeline.producers.MultiplexProducer$Multiplexer$ForwardingConsumer.onNewResultImpl(MultiplexProducer.java:562)
at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
at com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer$EncodedMemoryCacheConsumer.onNewResultImpl(EncodedMemoryCacheProducer.java:181)
at com.facebook.imagepipeline.producers.EncodedMemoryCacheProducer$EncodedMemoryCacheConsumer.onNewResultImpl(EncodedMemoryCacheProducer.java:123)
at com.facebook.imagepipeline.producers.BaseConsumer.onNewResult(BaseConsumer.java:89)
at com.facebook.imagepipeline.producers.DiskCacheReadProducer$1.then(DiskCacheReadProducer.java:113)
at com.facebook.imagepipeline.producers.DiskCacheReadProducer$1.then(DiskCacheReadProducer.java:93)
at bolts.Task$14.run(Task.java:872)
at bolts.BoltsExecutors$ImmediateExecutor.execute(BoltsExecutors.java:105)
at bolts.Task.completeImmediately(Task.java:863)
at bolts.Task.access$000(Task.java:32)
at bolts.Task$10.then(Task.java:654)
at bolts.Task$10.then(Task.java:651)
at bolts.Task.runContinuations(Task.java:956)
at bolts.Task.trySetResult(Task.java:994)
at bolts.TaskCompletionSource.trySetResult(TaskCompletionSource.java:39)
at bolts.TaskCompletionSource.setResult(TaskCompletionSource.java:62)
at bolts.Task$4.run(Task.java:357)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at com.facebook.imagepipeline.core.PriorityThreadFactory.newThread$lambda$0(PriorityThreadFactory.kt:37)
at com.facebook.imagepipeline.core.PriorityThreadFactory.$r8$lambda$IPp7Vm9a1KDy8D4770JTjI9qOG4()
at com.facebook.imagepipeline.core.PriorityThreadFactory$$ExternalSyntheticLambda0.run(:4)
at java.lang.Thread.run(Thread.java:1012)
After various analyses, it was found: But "nativeimagetranscoder-2.6.0" is almost 700kb. Unzip the file and we can find libnative-imagetranscoder.so
https://repo1.maven.org/maven2/com/facebook/fresco/nativeimagetranscoder/2.6.0/nativeimagetranscoder-2.6.0.aar
We can view the file in maven. "nativeimagetranscoder-3.0.0" is only 7kb.
https://repo1.maven.org/maven2/com/facebook/fresco/nativeimagetranscoder/3.0.0/nativeimagetranscoder-3.0.0.aar
This shows that it was caused by forgetting to package resources when packaging and publishing in version 3.0.0. Staff from major Facebook companies also made this kind of low-level mistake.
The reason has been found, let’s take a look at the solution:
Solution 1: Downgrade the fresco version to version 2.6.0, which can work normally
Solution 2: Since version 3.0.0 cannot find the libnative-imagetranscoder.so library and version 2.6.0 can be used, then introduce libnative-imagetranscoder.so in 2.6.0:
implementation('com.facebook.fresco:nativeimagetranscoder') { version { strictly '2.6.0' } }
Solution 3: Copy the "libnative imagetranscoder.so" file under 2.6.0 to the project jniLibs directory for use
Conclusion: We still look forward to the official fixing this serious problem in time. Sadly, the fresco library has not been updated for a long time.