Fresco: عند الإنشاء عبر App Bundle ، أخفق Fresco في العثور على "libimagepipeline.so"

تم إنشاؤها على ٧ ديسمبر ٢٠١٨  ·  21تعليقات  ·  مصدر: facebook/fresco

وصف

عند بدء نشاط يستخدم Fresco ، والذي تم إنشاؤه عبر Android App Bundle ، فإنه يفشل في العثور على "libimagepipeline.so" ويعطل التطبيق.

التكاثر

  1. قم بإنشاء نموذج تطبيق يستخدم فريسكو
  2. قم بإنشاء حزمة موقعة
  3. باستخدام أداة Bundle Tool ، أنشئ ملفات APK من الحزمة
  4. باستخدام أداة Bundle Tool ، قم بتثبيت APK على جهازك
  5. انتقل إلى النشاط حيث تمت تهيئة Fresco
  6. مراقبة الاصطدام

حل

اعتقدت في الأصل أن هذا قد يكون مشكلة في minify أو R8 أو Proguard ، لكنني عطلت كل هؤلاء ، وما زلت ألاحظ نفس النتيجة عند الإنشاء عبر App Bundle.

لقد اختبرت مكونات أخرى من تطبيقي تستخدم أيضًا مكتبات أصلية ، لكنها تعمل جميعًا كما هو متوقع ، فقط مع Fresco تكافح لتحميل الملف الثنائي المعني.

الحل المؤقت ، ولكن ليس مثاليًا الذي وجدته هو تعطيل تقسيم ملفات APK بمقدار abi باستخدام التكوين التالي ، ولكن تضمين جميع الثنائيات يؤدي إلى حجم APK أكبر بشكل ملحوظ.

android {
    // Rest of your configuration here

    bundle {
        abi {
            enableSplit false
        }
    }
}

معلومة اضافية

  • نسخة فريسكو: 1.10.0
  • إصدار النظام الأساسي: Samsung SM-G955F ، Android 8.0.0
bug help wanted

التعليق الأكثر فائدة

لقد اكتشفت مشكلة في SoLoader lib التي تستخدمها Fresco. لقد أعددت العلاقات العامة مع الإصلاح: facebook / soloader # 26
هذا الإصلاح يجعل اللوحة الجصية تعمل بشكل جيد مع حزمة التطبيقات.
لقد قمت بنشر النسخة المصححة من SoLoader lib. يمكنك استخدامه في مشروعك إذا كنت لا تستطيع الانتظار حتى يتم دمج العلاقات العامة.

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

ال 21 كومينتر

هل تبدو رسالة الخطأ الخاصة بك مثل هذه؟ # 2049

نعم تقريبًا. ومع ذلك ، أعتقد أن هذه المشكلة أثناء ارتباطها تركز بشكل أكبر على
عدم وجود دعم لـ Android App Bundle في Fresco أو SoLoader و
تقسيم الثنائيات بهذه الطريقة.

قد أكون مخطئًا ، لكن هذه المشكلة قابلة للتكرار على كل جهاز لدي
تم اختباره ، وليس فقط تحديد العلامات التجارية.

ووفقًا لأدلة الشحن في Fresco ، لا توجد ملاحظة بحالة استخدام
الشحن عبر حِزم تطبيقات Android ، ولا يمكننا استخدام المفتاح splits كما هو الحال عندما
تستخدم bundle يتم تجاهل المفتاح splits .

في الثلاثاء ، 11 ديسمبر 2018 ، 06:40 كتب KimiChiu ، [email protected] :

هل تبدو رسالة الخطأ الخاصة بك مثل هذه؟ # 2049
https://github.com/facebook/fresco/issues/2049

-
أنت تتلقى هذا لأنك قمت بتأليف الموضوع.
قم بالرد على هذا البريد الإلكتروني مباشرة ، وقم بعرضه على GitHub
https://github.com/facebook/fresco/issues/2253#issuecomment-446089907 ،
أو كتم الخيط
https://github.com/notifications/unsubscribe-auth/ABUQnQ4cZ-sWkG5b72Ea81wiQjS02yjlks5u31NxgaJpZM4ZIsuf
.

مرحبًا icerfish ،

شكرًا لك على تقديم هذه المشكلة بجميع التفاصيل المطلوبة (ربما أضف معجونًا من الخطأ إذا كان لديك الوقت). أستطيع أن أتخيل أن Fresco قد لا يدعم حزم التطبيقات بالكامل ولا أعتقد أننا اختبرنا التفاعل على الإطلاق.

سأضع علامة على هذا على أنه "خطأ" و "مطلوب مساعدة" على أمل أن يكون هذا شيئًا يمكن لمجتمع المصادر المفتوحة مساعدتنا فيه.

مرحبا lambdapioneer ،

هنا هو تتبع المكدس:

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)

يبدو مشابهًا للمشكلات التي يواجهها الآخرون.

من البحث حول قاعدة الشفرة ، يبدو أن هذه ليست مشكلة في Fresco نفسها ، ولكن أكثر في مكتبة SoLoader. سأقوم بإرسال المشكلة إلى هذا المستودع ، وسأتيح عبء العمل تخصيص بعض الوقت لمحاولة حل المشكلة بالضبط.

مرحبًا ، لقد واجهت نفس المشكلة عند استخدام حزم التطبيقات ، كما هو موضح في https://github.com/facebook/fresco/issues/2049#issuecomment -441088387

باستخدام Fresco 1.11 وتعيين .experiment().setNativeCodeDisabled(true) في ImagePipelineConfig من Fresco ، جعلت الصور الثابتة تعمل بالنسبة لي ، ولكن تعطلت ملفات GIF باستخدام تتبع تكديس مختلف ، والذي بدا وكأنه نفس مشكلة SoLoader مع مكتبة مختلفة. icerfish ، قد يساعدك هذا إذا كنت لا تستخدم صور GIF.

لقد اكتشفت مشكلة في SoLoader lib التي تستخدمها Fresco. لقد أعددت العلاقات العامة مع الإصلاح: facebook / soloader # 26
هذا الإصلاح يجعل اللوحة الجصية تعمل بشكل جيد مع حزمة التطبيقات.
لقد قمت بنشر النسخة المصححة من SoLoader lib. يمكنك استخدامه في مشروعك إذا كنت لا تستطيع الانتظار حتى يتم دمج العلاقات العامة.

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

لم يعمل الإصدار السابق من أداة تحميل soloader المصححة على أجهزة ما قبل المصاصة. لقد أصلحته. يستخدم
compile("com.avito.android:patched-soloader:0.1.1")

@ nesterov-n شكرا لإصلاح كبير ، أي تقدم لدمجه في الجص؟

@ nesterov-n أنا أيضا أواجه نفس المشكلة. واسمحوا لي أن أعرف متى سيتم دمجه في الجص؟

مرحبًا theromis و @ sailesh2
أنا لا أعمل في Facebook (إنه أمر محزن للغاية). أنا مجرد مستخدم فريسكو ولكني لم أستطع انتظار الإصلاح. لذلك اضطررت إلى تصحيحه وإصلاحه.
حاليًا ، أستخدم الإصدار المصحح من soloder lib لمشروعي كما هو موضح في التعليق أعلاه. أحدث إصدار هو com.avito.android:patched-soloader:0.1.2

يتم الآن مراجعة العلاقات العامة الخاصة بي إلى soloader lib ، لكن المشرف على وحدة التحميل المنفردة يخبرنا أنه لا يوجد تقدير لإصدار lib لمحمل soloader الجديد. لذلك من المستحيل تقدير متى ستستخدم Fresco هذا الإصدار الجديد.

إذا كان الأمر عاجلاً ، يمكنك استخدام الإصدار المصحح الخاص بي. نشرنا حزمة مع جدارية للإنتاج. يعمل بشكل جيد.

لا يمكن معرفة سبب عدم دمج هذا الحل البديل في Fresco حتى الآن.

لقد وصلنا إلى إصلاح SoLoader. سنصدر إصدارًا جديدًا من Fresco قريبًا بمجرد إصدار إصدار SoLoader.

oprisnik ما هو ETA للإصدارات؟ أتفهم أنه يتطلب التنسيق بين فريقين ولكن على الأقل بعض الأرقام التقريبية سيساعد العديد من المطورين في تحديد ما إذا كان ينبغي عليهم تطبيق الحل أعلاه أو انتظار الإصدار.

لقد تم إطلاق SoLoader v0.6.0 للتو وقمت بتحديث تبعية Fresco (6fc071d1892166d11d1f237f10e2d9bcdf858087). نريد انتظار إصدار البراغي المرخص من معهد ماساتشوستس للتكنولوجيا (# 2257). إذا استغرق هذا الإصدار وقتًا أطول من المتوقع ، فسنقوم بتخطيه الآن وإصداره بدون ذلك. على أي حال ، يجب أن يتم إصدار الإصدار الجديد في غضون يومين.

لا أريد أن أكون مملًا ، لكن لا ينبغي إطلاق اللوحات الجدارية؟ يبدو أن هذه المشكلة التي أشرت إليها لم تتلق أي نشاط منذ فترة.

لقد أصدرنا للتو الإصدار 1.12.0 الذي يتضمن إصدار SoLoader الثابت.

حاول إضافة البرنامج

لا تقم بإزالة أي طريقة / فئة مشروحة بعلامةDoNotStrip

-keep @ com.facebook.common.internal.DoNotStrip فئة *
فئة -keepclassmembers * {
@ com.facebook.common.internal.DoNotStrip * ؛
}

لا تقم بإزالة أي طريقة / فئة مشروحة بعلامةDoNotOptimize

-keep @ com.facebook.soloader.DoNotOptimize فئة *
فئة -keepclassmembers * {
@ com.facebook.soloader.DoNotOptimize * ؛
}

حافظ على الأساليب الأصلية

فئة -keepclassmembers * {
محلي؛
}

-لا تحذر أوكيو. *-لا تحذر com.squareup.okhttp. *
-دونتوارن okhttp3. *-لا تحذر جافاكس. *
-دونتوارن com.android.volley.toolbox. *-لا تحذر com.facebook.infer. *

ProHzen هل

نعم ، لقد قمت بحلها.

لا يزال في الهواء الطلق 2.0.0 ، :- (، يرجى اقتراح حل بديل لدي فقط مشكلة مع أجهزة nexus

ProHzen مرحبا ، هل يمكنك أن ترسل لي قائمة الارتباك الخاصة بك؟ لقد
معلومات:
الجص: 1.13.0
classpath 'com.android.tools. البناء: gradle : 3.5.1 '

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات