美文网首页
react-native项目中Android端gif奔溃

react-native项目中Android端gif奔溃

作者: tianxiaozz2012 | 来源:发表于2017-10-24 19:14 被阅读0次

    将项目中的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 查看当前项目的依赖情况,从而解决依赖冲突问题。

    相关文章

      网友评论

          本文标题:react-native项目中Android端gif奔溃

          本文链接:https://www.haomeiwen.com/subject/fdijottx.html