将项目中的react-native版本从0.45升级到了0.48后,发现Android端在显示gif时奔溃了,而ios端没有这个情况。
出错信息为:
1java.lang.NoClassDefFoundError:Failed resolution of: Lcom/facebook/imagepipeline/memory/PooledByteBuffer;
2com.facebook.imagepipeline.animated.factory.AnimatedImageFactoryImpl.decodeGif(AnimatedImageFactoryImpl.java:84)
3......
4Caused by:
5java.lang.ClassNotFoundException:Didn't find class "com.facebook.imagepipeline.memory.PooledByteBuffer" on path: DexPathList[[zip file "/data/app/mobi.bigeye.bigeyeandroid-1/base.apk"],nativeLibraryDirectories=[/data/app/mobi.bigeye.bigeyeandroid-1/lib/arm, /data/app/mobi.bigeye.bigeyeandroid-1/base.apk!/lib/armeabi-v7a, /vendor/lib, /system/lib]]
6dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
7java.lang.ClassLoader.loadClass(ClassLoader.java:511)
8java.lang.ClassLoader.loadClass(ClassLoader.java:469)
9com.facebook.imagepipeline.animated.factory.AnimatedImageFactoryImpl.decodeGif(AnimatedImageFactoryImpl.java:84)
10com.facebook.imagepipeline.decoder.DefaultImageDecoder.decodeGif(DefaultImageDecoder.java:145)
11com.facebook.imagepipeline.decoder.DefaultImageDecoder$1.decode(DefaultImageDecoder.java:65)
12com.facebook.imagepipeline.decoder.DefaultImageDecoder.decode(DefaultImageDecoder.java:126)
13com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.doDecode(DecodeProducer.java:240)
14com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.access$200(DecodeProducer.java:112)
15com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder$1.run(DecodeProducer.java:145)
16com.facebook.imagepipeline.producers.JobScheduler.doJob(JobScheduler.java:207)
17com.facebook.imagepipeline.producers.JobScheduler.access$000(JobScheduler.java:27)
18com.facebook.imagepipeline.producers.JobScheduler$1.run(JobScheduler.java:78)
19java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
20java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
21com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
22java.lang.Thread.run(Thread.java:833)
发现是fresco的某个类文件找不到,而在react-native中为了支持gif,在android的build.gradle文件中,已经添加了对fresco的引用
// For animated GIF support
compile'com.facebook.fresco:animated-gif:0.14.1'
// For WebP support, including animated WebP
compile'com.facebook.fresco:animated-webp:0.14.1
compile'com.facebook.fresco:webpsupport:0.14.1'
在Android Studio追踪class文件,也能找到对应的class文件,但却发现好像有多个版本 0.14.1 1.3等。
为了确定,在Android项目的Project视图下,打开External Libraries文件夹,也的确发现了多个library,原因确定了项目中有多个fresco的版本,
为了弄清是哪些项目引用了fresco,参考了http://www.jianshu.com/p/87d679f596fa这个文章后,进入命令行,进入android目录
cd android
./gradlew -q app:dependencies 查看当前项目的依赖情况,发现一个名为react-native-image-picker的模块,依赖了fresco,且版本为1.3,为了避免冲突,将主模块的build.gradle文件的fresco版本号由0.14.1改为1.3,改后的
// For animated GIF support
compile'com.facebook.fresco:animated-gif:1.3.0'
// For WebP support, including animated WebP
compile'com.facebook.fresco:animated-webp:1.3.0'
compile'com.facebook.fresco:webpsupport:1.3.0'
测试后,gif奔溃问题解决。
总结:
1 通过Android Studio的文件追踪(Command + B), 查看class文件是否缺失。
2 通过命令行./gradlew -q app:dependencies 查看当前项目的依赖情况,从而解决依赖冲突问题。