Fresco: Ao compilar por meio do App Bundle, o Fresco não consegue encontrar "libimagepipeline.so"

Criado em 7 dez. 2018  ·  21Comentários  ·  Fonte: facebook/fresco

Descrição

Ao iniciar uma atividade que usa Fresco, que foi gerada por meio do Android App Bundle , ele não consegue encontrar "libimagepipeline.so" e trava o aplicativo.

Reprodução

  1. Crie um aplicativo de amostra que usa o Fresco
  2. Gere um pacote assinado
  3. Usando a ferramenta Bundle, crie os APKs a partir do Bundle
  4. Usando a ferramenta Bundle, instale o APK no seu dispositivo
  5. Navegue até a atividade onde o Fresco é inicializado
  6. Observar colisão

Solução

Originalmente, pensei que isso pudesse ser um problema com o minify, R8 ou Proguard, mas desativei todos eles e ainda observei o mesmo resultado ao compilar por meio do App Bundle.

Eu testei outros componentes do meu aplicativo que também usam bibliotecas nativas, mas todos eles operam conforme o esperado, apenas com o Fresco lutando para carregar o respectivo binário.

Uma solução temporária, mas não ideal, que encontrei é desativar a divisão de APKs em abi usando a seguinte configuração, mas incluir todos os binários resulta em um tamanho de APK significativamente maior.

android {
    // Rest of your configuration here

    bundle {
        abi {
            enableSplit false
        }
    }
}

Informações adicionais

  • Versão Fresco: 1.10.0
  • Versão da plataforma: Samsung SM-G955F, Android 8.0.0
bug help wanted

Comentários muito úteis

Eu descobri um problema no SoLoader lib usado pelo Fresco. Eu preparei PR com uma correção: facebook / soloader # 26
Essa correção faz com que o fresco funcione bem com o pacote de aplicativos.
Publiquei a versão corrigida do SoLoader lib. Você pode usá-lo em seu projeto se não puder esperar até que o PR seja mesclado.

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 comentários

Sua mensagem de erro é parecida com esta? # 2049

Sim, aproximadamente. No entanto, este problema, embora relacionado, eu acho que se concentra mais no
falta de suporte para Android App Bundle no Fresco ou SoLoader e
dividir binários dessa maneira.

Posso estar enganado, mas esse problema pode ser reproduzido em todos os dispositivos que
testado, não apenas marcas selecionadas.

E de acordo com os guias de remessa Fresco, não há nenhuma observação do caso de uso de
envio via Android App Bundles, e não podemos usar a chave splits como quando
você usa bundle a chave splits é ignorada.

Na terça-feira, 11 de dezembro de 2018, 06:40 KimiChiu, [email protected] escreveu:

Sua mensagem de erro é parecida com esta? # 2049
https://github.com/facebook/fresco/issues/2049

-
Você está recebendo isso porque é o autor do tópico.
Responda a este e-mail diretamente, visualize-o no GitHub
https://github.com/facebook/fresco/issues/2253#issuecomment-446089907 ,
ou silenciar o tópico
https://github.com/notifications/unsubscribe-auth/ABUQnQ4cZ-sWkG5b72Ea81wiQjS02yjlks5u31NxgaJpZM4ZIsuf
.

Olá @icerfish ,

Obrigado por preencher este problema com todos os detalhes necessários (talvez adicione uma pasta do erro se tiver tempo). Posso imaginar que o Fresco pode não ser totalmente compatível com pacotes de aplicativos e não acho que já testamos a interação.

Vou marcar isso como um "bug" e "desejo de ajuda", esperando que seja algo com que a comunidade de código aberto possa nos ajudar.

Olá @lambdapioneer ,

Aqui está o rastreamento de pilha:

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)

É semelhante aos problemas que outras pessoas estão tendo.

Olhando ao redor da base de código, parece que este não é um problema com o Fresco em si, mas mais com a biblioteca SoLoader. Vou postar o problema nesse repositório, e a carga de trabalho permite dedicar algum tempo para tentar resolver qual é o problema exatamente.

Olá, tive o mesmo problema ao usar pacotes de apps, conforme descrito em https://github.com/facebook/fresco/issues/2049#issuecomment -441088387

Usar Fresco 1.11 e definir .experiment().setNativeCodeDisabled(true) no ImagePipelineConfig do Fresco fez com que as imagens estáticas funcionassem para mim, mas os GIFs travaram com um rastreamento de pilha diferente, que parecia o mesmo problema de SoLoader com uma biblioteca diferente. @icerfish , isso pode ajudá-lo se você não estiver usando GIFs.

Eu descobri um problema no SoLoader lib usado pelo Fresco. Eu preparei PR com uma correção: facebook / soloader # 26
Essa correção faz com que o fresco funcione bem com o pacote de aplicativos.
Publiquei a versão corrigida do SoLoader lib. Você pode usá-lo em seu projeto se não puder esperar até que o PR seja mesclado.

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")

A versão anterior do patched-soloader não funcionava em dispositivos pré-pirulito. Eu consertei. Usar
compile("com.avito.android:patched-soloader:0.1.1")

@nesterov-n obrigado pela ótima correção, algum progresso para integrá-lo ao fresco?

@ nesterov-n também estou enfrentando o mesmo problema. por favor, deixe-me saber quando ele será integrado ao fresco?

Olá @theromis e @ sailesh2
Eu não trabalho no Facebook (é tão triste). Sou apenas um usuário do Fresco, mas não podia esperar por uma correção. Então eu tive que depurar e consertar.
Atualmente, eu uso a versão corrigida do soloder lib para meu projeto, conforme descrito no comentário acima. A versão mais recente é com.avito.android:patched-soloader:0.1.2

Meu PR para o lib do soloader está sendo revisado agora, mas o mantenedor do soloader diz que não há estimativa de um novo lançamento do lib do soloader. Portanto, é impossível estimar quando o Fresco usará esta nova versão.

Se for urgente, você pode usar minha versão corrigida. Publicamos pacote com afresco para produção. Funciona bem.

Não consigo descobrir por que essa solução alternativa ainda não está integrada ao Fresco.

Conseguimos a correção SoLoader. Vamos lançar uma nova versão Fresco em breve, assim que a versão SoLoader for lançada.

@oprisnik qual é o ETA dos lançamentos? Eu entendo que requer a coordenação de 2 equipes, mas pelo menos um número aproximado ajudaria muitos desenvolvedores a decidir se deveriam aplicar a solução alternativa acima ou esperar pelo lançamento.

SoLoader v0.6.0 acaba de ser lançado e eu atualizei a dependência Fresco (6fc071d1892166d11d1f237f10e2d9bcdf858087). Queremos aguardar o lançamento dos Bolts licenciados pelo MIT (# 2257). Se essa versão demorar mais do que o esperado, vamos ignorá-la por enquanto e lançar sem ela. Em qualquer caso, a nova versão deve sair em alguns dias.

Não quero ser enfadonho, mas não deveria ser lançado fresco? Parece que o problema que você apontou não recebe nenhuma atividade há algum tempo.

Acabamos de lançar a versão 1.12.0 que inclui a versão corrigida do SoLoader.

tente adicionar proguard

Não retire nenhum método / classe que esteja anotado com @DoNotStrip

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

Não retire nenhum método / classe que esteja anotado com @DoNotOptimize

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

Manter métodos nativos

-keepclassmembers class * {
nativo;
}

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

@ProHzen Isso corrigiu a falha do soloader?

Sim, resolvi.

ainda está no fresco 2.0.0, :-( sugira uma solução alternativa, só tenho problemas com dispositivos Nexus

@ProHzen Olá, você pode me enviar sua lista de confusão? Tentei do jeito que você fez, mas não funcionou.
Info:
afresco: 1.13.0
classpath 'com.android.tools. construir: gradle : 3.5.1 '

Esta página foi útil?
0 / 5 - 0 avaliações