Fresco: Al compilar a través de App Bundle, Fresco no encuentra "libimagepipeline.so"

Creado en 7 dic. 2018  ·  21Comentarios  ·  Fuente: facebook/fresco

Descripción

Al iniciar una actividad que usa Fresco, que se ha generado a través de Android App Bundle , no encuentra "libimagepipeline.so" y bloquea la aplicación.

Reproducción

  1. Cree una aplicación de muestra que use Fresco
  2. Generar un paquete firmado
  3. Con la herramienta Bundle, cree los APK a partir del paquete
  4. Usando Bundle Tool, instale el APK en su dispositivo
  5. Navegue a la actividad donde se inicializa Fresco
  6. Observar choque

Solución

Originalmente pensé que esto podría haber sido un problema con minify, R8 o Proguard, pero desactivé todos esos y aún observé el mismo resultado al compilar a través de App Bundle.

He probado otros componentes de mi aplicación que también usan bibliotecas nativas, pero todos funcionan como se esperaba, solo con Fresco luchando por cargar el binario respectivo.

Una solución temporal, pero no ideal, que encontré es deshabilitar la división de APK por abi usando la siguiente configuración, pero la inclusión de todos los binarios da como resultado un tamaño de APK significativamente mayor.

android {
    // Rest of your configuration here

    bundle {
        abi {
            enableSplit false
        }
    }
}

información adicional

  • Versión Fresco: 1.10.0
  • Versión de la plataforma: Samsung SM-G955F, Android 8.0.0
bug help wanted

Comentario más útil

Descubrí un problema en la biblioteca SoLoader utilizada por Fresco. He preparado relaciones públicas con una solución: facebook / soloader # 26
Esa solución hace que fresco funcione bien con el paquete de aplicaciones.
He publicado la versión parcheada de SoLoader lib. Puede usarlo en su proyecto si no puede esperar hasta que se fusione 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")

Todos 21 comentarios

¿Su mensaje de error se parece a este? N.º 2049

Sí, aproximadamente. Sin embargo, este problema, aunque está relacionado, creo que se centra más en el
falta de soporte para Android App Bundle en Fresco o SoLoader y
dividiendo binarios de esa manera.

Podría estar equivocado, pero este problema se puede reproducir en todos los dispositivos que he
probado, no solo marcas seleccionadas.

Y según las guías de envío de Fresco, no hay ninguna nota del caso de uso de
envío a través de Android App Bundles, y no podemos usar la clave splits como cuando
usa bundle la tecla splits se ignora.

El martes, 11 de diciembre de 2018, 06:40 KimiChiu, [email protected] escribió:

¿Su mensaje de error se parece a este? N.º 2049
https://github.com/facebook/fresco/issues/2049

-
Recibes esto porque eres el autor del hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/facebook/fresco/issues/2253#issuecomment-446089907 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/ABUQnQ4cZ-sWkG5b72Ea81wiQjS02yjlks5u31NxgaJpZM4ZIsuf
.

Hola @icerfish ,

Gracias por presentar este problema con todos los detalles requeridos (tal vez agregue una pasta del error si tiene tiempo). Me imagino que Fresco podría no ser totalmente compatible con los paquetes de aplicaciones y no creo que hayamos probado nunca la interacción.

Lo marcaré como un "error" y "se busca ayuda" con la esperanza de que sea algo en lo que la comunidad de código abierto pueda ayudarnos.

Hola @lambdapioneer ,

Aquí está el stacktrace:

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)

Parece similar a los problemas que están teniendo otros.

Al mirar alrededor del código base, parece que esto no es un problema con Fresco en sí, sino más bien con la biblioteca SoLoader. Publicaré el problema en ese repositorio y la carga de trabajo, lo que permitirá dedicar algo de tiempo para tratar de resolver cuál es el problema exactamente.

Hola, tuve el mismo problema al usar paquetes de aplicaciones, como se describe en https://github.com/facebook/fresco/issues/2049#issuecomment -441088387

Usar Fresco 1.11 y configurar .experiment().setNativeCodeDisabled(true) en ImagePipelineConfig de Fresco hizo que las imágenes estáticas funcionaran para mí, pero los GIF se bloquearon con un stacktrace diferente, que parecía el mismo problema de SoLoader con una biblioteca diferente. @icerfish , esto puede ayudarte si no estás usando GIF.

Descubrí un problema en la biblioteca SoLoader utilizada por Fresco. He preparado relaciones públicas con una solución: facebook / soloader # 26
Esa solución hace que fresco funcione bien con el paquete de aplicaciones.
He publicado la versión parcheada de SoLoader lib. Puede usarlo en su proyecto si no puede esperar hasta que se fusione 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")

La versión anterior de patched-soloader no funcionaba en dispositivos anteriores a Lollipop. Lo he arreglado. Usar
compile("com.avito.android:patched-soloader:0.1.1")

@ nesterov-n gracias por la gran solución, ¿algún progreso para integrarlo en fresco?

@ nesterov-n también estoy enfrentando el mismo problema. por favor avíseme ¿cuándo se integrará al fresco?

Hola @theromis y @ sailesh2
No trabajo en Facebook (es muy triste). Solo soy un usuario de Fresco, pero no podía esperar a una solución. Así que tuve que depurarlo y arreglarlo.
Actualmente, uso la versión parcheada de soloder lib para mi proyecto como describí en el comentario anterior. La versión más reciente es com.avito.android:patched-soloader:0.1.2

Mi PR para soloader lib se está revisando ahora, pero el mantenedor de soloader dice que no hay una estimación de la nueva versión de soloader lib. Por tanto, es imposible estimar cuándo utilizará Fresco esta nueva versión.

Si es urgente, puede usar mi versión parcheada. Publiqué un paquete con un fresco a la producción. Funciona bien.

No puedo entender por qué esta solución alternativa aún no está integrada en Fresco.

Hemos conseguido la solución SoLoader. Lanzaremos una nueva versión de Fresco pronto una vez que se haya lanzado la versión de SoLoader.

@oprisnik ¿cuál es la ETA para los lanzamientos? Entiendo que requiere la coordinación de 2 equipos, pero al menos un número aproximado ayudaría a muchos desarrolladores a decidir si deben aplicar la solución anterior o esperar el lanzamiento.

SoLoader v0.6.0 acaba de ser lanzado y he actualizado la dependencia Fresco (6fc071d1892166d11d1f237f10e2d9bcdf858087). Queremos esperar el lanzamiento de los Bolts con licencia del MIT (# 2257). Si ese lanzamiento tarda más de lo esperado, lo omitiremos por ahora y lo lanzaremos sin eso. En cualquier caso, la nueva versión debería estar disponible en un par de días.

No quiero ser aburrido, pero ¿no debería publicarse el fresco? Parece que este problema que señaló no ha recibido ninguna actividad durante un tiempo.

Acabamos de lanzar la versión 1.12.0 que incluye la versión fija de SoLoader.

intente agregar proguard

No elimine ningún método / clase que esté anotado con @DoNotStrip

-keep @ com.facebook.common.internal.DoNotStrip class *
-keepclassmembers class * {
@ com.facebook.common.internal.DoNotStrip *;
}

No elimine ningún método / clase que esté anotado con @DoNotOptimize

-keep @ com.facebook.soloader.DoNotOptimize clase *
-keepclassmembers class * {
@ com.facebook.soloader.DoNotOptimize *;
}

Mantener los métodos nativos

-keepclassmembers class * {
nativo;
}

-no advierte okio. *-dontwarn com.squareup.okhttp. *
-dontwarn okhttp3. *-dontwarn javax.annotation. *
-dontwarn com.android.volley.toolbox. *-dontwarn com.facebook.infer. *

@ProHzen ¿

Sí, lo resolví.

todavía está en fresco 2.0.0, :-(, sugiera una solución, solo tengo problemas con los dispositivos nexus

@ProHzen Hola, ¿puedes enviarme tu lista de confusión? Lo intenté como tú lo hiciste, pero no funcionó.
Info:
fresco: 1.13.0
classpath 'com.android.tools. compilación: gradle : 3.5.1 '

¿Fue útil esta página
0 / 5 - 0 calificaciones