Fresco: Beim Erstellen über das App Bundle findet Fresco "libimagepipeline.so" nicht

Erstellt am 7. Dez. 2018  ·  21Kommentare  ·  Quelle: facebook/fresco

Beschreibung

Beim Starten einer Aktivität, die Fresco verwendet, die über das Android App Bundle generiert wurde, wird "libimagepipeline.so" nicht gefunden und die Anwendung stürzt ab.

Reproduktion

  1. Erstellen Sie eine Beispielanwendung, die Fresco verwendet
  2. Generiere ein signiertes Bundle
  3. Erstellen Sie mit dem Bundle-Tool die APKs aus dem Bundle
  4. Installieren Sie das APK mit dem Bundle-Tool auf Ihrem Gerät
  5. Navigieren Sie zu Aktivität, bei der Fresco initialisiert wird
  6. Absturz beobachten

Lösung

Ich dachte ursprünglich, dass dies ein Problem mit minify, R8 oder Proguard sein könnte, aber ich habe all diese deaktiviert und immer noch das gleiche Ergebnis beim Erstellen über das App Bundle beobachtet.

Ich habe andere Komponenten meiner App getestet, die ebenfalls native Bibliotheken verwenden, aber sie funktionieren alle wie erwartet, nur mit Fresco Schwierigkeiten, die jeweilige Binärdatei zu laden.

Eine vorübergehende, aber nicht ideale Lösung, die ich gefunden habe, besteht darin, das Aufteilen von APKs nach abi mit der folgenden Konfiguration zu deaktivieren, aber das Einschließen aller Binärdateien führt zu einer erheblich größeren APK-Größe.

android {
    // Rest of your configuration here

    bundle {
        abi {
            enableSplit false
        }
    }
}

Weitere Informationen

  • Fresko-Version: 1.10.0
  • Plattformversion: Samsung SM-G955F, Android 8.0.0
bug help wanted

Hilfreichster Kommentar

Ich habe ein Problem in der von Fresco verwendeten SoLoader-Bibliothek festgestellt. Ich habe PR mit einem Fix vorbereitet: facebook/soloader#26
Dieser Fix macht Fresko gut mit App Bundle.
Ich habe die gepatchte Version von SoLoader lib veröffentlicht. Sie können es in Ihrem Projekt verwenden, wenn Sie nicht warten können, bis PR zusammengeführt wird.

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

Alle 21 Kommentare

Sieht Ihre Fehlermeldung so aus? #2049

Ja, ungefähr. Dieses Problem konzentriert sich jedoch, obwohl es verwandt ist, mehr auf die
fehlende Unterstützung für Android App Bundle in Fresco oder SoLoader und
Binärdateien auf diese Weise aufteilen.

Ich könnte mich irren, aber dieses Problem ist auf jedem Gerät reproduzierbar, das ich habe
getestet, nicht nur ausgewählte Marken.

Und laut Fresco-Versandanleitungen gibt es keinen Hinweis auf den Anwendungsfall von
Versand über Android App Bundles, und wir können den splits Schlüssel nicht als Wann verwenden
Wenn Sie bundle die Taste splits ignoriert.

Am Di, 11. Dez. 2018, 06:40 Uhr schrieb KimiChiu, [email protected] :

Sieht Ihre Fehlermeldung so aus? #2049
https://github.com/facebook/fresco/issues/2049


Sie erhalten dies, weil Sie den Thread verfasst haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/facebook/fresco/issues/2253#issuecomment-446089907 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/ABUQnQ4cZ-sWkG5b72Ea81wiQjS02yjlks5u31NxgaJpZM4ZIsuf
.

Hallo @icerfish ,

Vielen Dank, dass Sie dieses Problem mit allen erforderlichen Details eingereicht haben (möglicherweise fügen Sie den Fehler ein, wenn Sie Zeit haben). Ich kann mir vorstellen, dass Fresco App Bundles nicht vollständig unterstützt und ich glaube nicht, dass wir das Zusammenspiel jemals getestet haben.

Ich werde dies als "Bug" und "Hilfe gesucht" markieren, in der Hoffnung, dass die Open-Source-Community uns dabei helfen kann.

Hallo @lambdapioneer ,

Hier ist der 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)

Es sieht ähnlich aus wie Probleme, die andere haben.

Wenn man sich die Codebasis ansieht, sieht es so aus, als ob dies kein Problem mit Fresco selbst ist, sondern eher der SoLoader-Bibliothek. Ich werde das Problem in diesem Repository und der Arbeitslast überschreiben, sodass Sie etwas Zeit investieren können, um herauszufinden, was genau das Problem ist.

Hallo, ich hatte das gleiche Problem bei der Verwendung von App Bundles, wie in https://github.com/facebook/fresco/issues/2049#issuecomment -441088387 beschrieben

Mit Fresco 1.11 und der Einstellung von .experiment().setNativeCodeDisabled(true) in Frescos ImagePipelineConfig funktionierten statische Bilder für mich, aber GIFs stürzten mit einem anderen Stacktrace ab, was wie das gleiche SoLoader-Problem mit einer anderen Bibliothek aussah. @icerfish , dies kann Ihnen helfen, wenn Sie keine GIFs verwenden.

Ich habe ein Problem in der von Fresco verwendeten SoLoader-Bibliothek festgestellt. Ich habe PR mit einem Fix vorbereitet: facebook/soloader#26
Dieser Fix macht Fresko gut mit App Bundle.
Ich habe die gepatchte Version von SoLoader lib veröffentlicht. Sie können es in Ihrem Projekt verwenden, wenn Sie nicht warten können, bis PR zusammengeführt wird.

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

Die vorherige Version von patched-soloader funktionierte nicht auf Pre-Lollipop-Geräten. Ich habe es behoben. Verwenden
compile("com.avito.android:patched-soloader:0.1.1")

@nesterov-n danke für die tolle Lösung. Gibt es Fortschritte bei der Integration in das Fresko?

@nesterov-n Ich stehe auch vor dem gleichen Problem. Bitte lassen Sie mich wissen, wann es in das Fresko integriert wird?

Hallo @theromis und @sailesh2
Ich arbeite nicht bei Facebook (es ist so traurig). Ich bin nur ein Fresco-Benutzer, aber ich konnte nicht auf eine Lösung warten. Also musste ich es debuggen und reparieren.
Derzeit verwende ich die gepatchte Version von soloder lib für mein Projekt, wie ich im obigen Kommentar beschrieben habe. Die neueste Version ist com.avito.android:patched-soloader:0.1.2

Meine PR für die Soloader-Lib wird gerade überprüft, aber der Soloader-Maintainer sagt, dass es keine Schätzung der neuen Version der Soloader-Lib gibt. Es ist also unmöglich abzuschätzen, wann Fresco diese neue Version verwenden wird.

Wenn es dringend ist, können Sie meine gepatchte Version verwenden. Wir haben Bundle mit Fresko zur Produktion veröffentlicht. Funktioniert gut.

Kann nicht herausfinden, warum dieser Workaround noch nicht in Fresco integriert ist.

Wir haben den SoLoader-Fix gelandet. Wir werden in Kürze eine neue Fresco-Version veröffentlichen, sobald die SoLoader-Version veröffentlicht wurde.

@oprisnik was ist die ETA für die Veröffentlichungen? Ich verstehe, dass es die Koordination von 2 Teams erfordert, aber zumindest eine grobe Zahl würde vielen Entwicklern helfen, zu entscheiden, ob sie den oben genannten Workaround anwenden oder auf die Veröffentlichung warten sollten.

SoLoader v0.6.0 wurde gerade veröffentlicht und ich habe die Fresco-Abhängigkeit (6fc071d1892166d11d1f237f10e2d9bcdf858087) aktualisiert. Wir wollen auf die vom MIT lizenzierte Bolts-Version (#2257) warten. Wenn diese Veröffentlichung länger dauert als erwartet, werden wir sie vorerst überspringen und ohne dies veröffentlichen. Auf jeden Fall sollte die neue Version in ein paar Tagen erscheinen.

Ich möchte nicht langweilig sein, aber sollte nicht ein Fresko veröffentlicht werden? Anscheinend hat dieses Problem, auf das Sie hingewiesen haben, seit einiger Zeit keine Aktivität mehr erhalten.

Wir haben gerade Version 1.12.0 veröffentlicht , die die korrigierte SoLoader-Version enthält.

versuche proguard hinzuzufügen

Entfernen Sie keine Methode/Klasse, die mit @DoNotStrip annotiert ist

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

Entfernen Sie keine Methode/Klasse, die mit @DoNotOptimize annotiert ist

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

Native Methoden beibehalten

-keepclassmembers-Klasse * {
einheimisch;
}

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

@ProHzen Hat dies den Soloader-Absturz behoben?

Ja, ich habe es gelöst.

es ist immer noch in Fresco 2.0.0, :-( , bitte schlagen Sie eine Problemumgehung vor, ich habe nur Probleme mit Nexus-Geräten

@ProHzen Hallo, kannst du mir deine Verwirrungsliste schicken? Ich habe es so versucht wie du, aber es hat nicht funktioniert.
Die Info:
Fresko: 1.13.0
Klassenpfad 'com.android.tools. bauen:gradle : 3.5.1'

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen