將項(xiàng)目中的react-native版本從0.45升級(jí)到了0.48后,發(fā)現(xiàn)Android端在顯示gif時(shí)奔潰了,而ios端沒有這個(gè)情況。
出錯(cuò)信息為:
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)
發(fā)現(xiàn)是fresco的某個(gè)類文件找不到,而在react-native中為了支持gif,在android的build.gradle文件中,已經(jīng)添加了對(duì)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文件,也能找到對(duì)應(yīng)的class文件,但卻發(fā)現(xiàn)好像有多個(gè)版本 0.14.1? 1.3等。
為了確定,在Android項(xiàng)目的Project視圖下,打開External Libraries文件夾,也的確發(fā)現(xiàn)了多個(gè)library,原因確定了項(xiàng)目中有多個(gè)fresco的版本,
為了弄清是哪些項(xiàng)目引用了fresco,參考了http://www.itdecent.cn/p/87d679f596fa這個(gè)文章后,進(jìn)入命令行,進(jìn)入android目錄
cd android
./gradlew -q app:dependencies 查看當(dāng)前項(xiàng)目的依賴情況,發(fā)現(xiàn)一個(gè)名為react-native-image-picker的模塊,依賴了fresco,且版本為1.3,為了避免沖突,將主模塊的build.gradle文件的fresco版本號(hào)由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'
測(cè)試后,gif奔潰問題解決。
總結(jié):
1 通過(guò)Android Studio的文件追蹤(Command + B), 查看class文件是否缺失。
2 通過(guò)命令行./gradlew -q app:dependencies 查看當(dāng)前項(xiàng)目的依賴情況,從而解決依賴沖突問題。