Fresco: java.lang.UnsatisfiedLinkErrorは、ロードするDSOを見つけることができませんでした:libimagepipeline.so

作成日 2018年03月23日  ·  9コメント  ·  ソース: facebook/fresco

情報:

ロードするDSOが見つかりませんでした:libimagepipeline.so
com.facebook.soloader.SoLoader.void doLoadLibraryBySoName(java.lang.String、int、android.os.StrictMode $ ThreadPolicy).. ..
03-23 19:21:55.955 17814 17931 Eアート:dlopen( "/ data / data / xxx / lib-main / libimagepipeline.so"、RTLD_LAZY)失敗:dlopen失敗: "/ data / data / xxx / lib-main /libimagepipeline.so "は32ビットではなく64ビットです
03-23 19:21:55.955 17814 17931 E SoLoader:ロードできませんでした:libimagepipeline.so

詳細

com.facebook.soloader.SoLoader.void doLoadLibraryBySoName(java.lang.String、int、android.os.StrictMode $ ThreadPolicy)(SoLoader.java:522)
com.facebook.soloader.SoLoader.void loadLibraryBySoName(java.lang.String、java.lang.String、java.lang.String、int、android.os.StrictMode $ ThreadPolicy)(SoLoader.java:420)
com.facebook.soloader.SoLoader.void loadLibrary(java.lang.String、int)(SoLoader.java:370)
com.facebook.soloader.SoLoader.void loadLibrary(java.lang.String)(SoLoader.java:335)
com.facebook.imagepipeline.nativecode.ImagePipelineNativeLoader.void load()(ImagePipelineNativeLoader.java:42)
com.facebook.imagepipeline.memory.NativeMemoryChunk.void()(NativeMemoryChunk.java:33)
com.facebook.imagepipeline.memory.NativeMemoryChunkPool.com.facebook.imagepipeline.memory.NativeMemoryChunk alloc(int)(NativeMemoryChunkPool.java:58)
com.facebook.imagepipeline.memory.NativeMemoryChunkPool.void free(java.lang.Object)(NativeMemoryChunkPool.java:20)

_parent _ ## 1 ## _ parent_

_child _ ## java.lang.Object alloc(int)## _ child_

com.facebook.imagepipeline.memory.BasePool.java.lang.Object get(int)(BasePool.java:257)
com.facebook.imagepipeline.memory.NativePooledByteBufferOutputStream.void(com.facebook.imagepipeline.memory.NativeMemoryChunkPool、int)(NativePooledByteBufferOutputStream.java:51)
com.facebook.imagepipeline.memory.NativePooledByteBufferFactory.com.facebook.imagepipeline.memory.NativePooledByteBuffer newByteBuffer(java.io.InputStream、int)(NativePooledByteBufferFactory.java:98)
com.facebook.imagepipeline.memory.NativePooledByteBufferFactory.com.facebook.common.memory.PooledByteBufferOutputStream newOutputStream(int)(NativePooledByteBufferFactory.java:26)

_parent _ ## 4 ## _ parent_

_child _ ## com.facebook.common.memory.PooledByteBufferOutputStream newOutputStream()## _ child_

_child _ ## com.facebook.common.memory.PooledByteBuffer newByteBuffer(java.io.InputStream、int)## _ child_

_child _ ## com.facebook.common.memory.PooledByteBuffer newByteBuffer(byte [])## _ child_

_child _ ## com.facebook.common.memory.PooledByteBuffer newByteBuffer(java.io.InputStream)## _ child_

com.facebook.imagepipeline.producers.LocalFetchProducer.com.facebook.imagepipeline.image.EncodedImage getByteBufferBackedEncodedImage(java.io.InputStream、int)(LocalFetchProducer.java:89)

_parent _ ## 2 ## _ parent_

_child _ ## com.facebook.imagepipeline.image.EncodedImage getEncodedImage(com.facebook.imagepipeline.request.ImageRequest)## _ child_

_child _ ## java.lang.String getProducerName()## _ child_

com.facebook.imagepipeline.producers.LocalFetchProducer.com.facebook.imagepipeline.image.EncodedImage getEncodedImage(java.io.InputStream、int)(LocalFetchProducer.java:101)
com.facebook.imagepipeline.producers.LocalFileFetchProducer.com.facebook.imagepipeline.image.EncodedImage getEncodedImage(com.facebook.imagepipeline.request.ImageRequest)(LocalFileFetchProducer.java:34)
com.facebook.imagepipeline.producers.LocalFetchProducer $ 1.com.facebook.imagepipeline.image.EncodedImage getResult()(LocalFetchProducer.java:54)
com.facebook.imagepipeline.producers.LocalFetchProducer $ 1.java.lang.Object getResult()(LocalFetchProducer.java:50)
com.facebook.common.executors.StatefulRunnable.void run()(StatefulRunnable.java:45)
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:587)
com.facebook.imagepipeline.core.PriorityThreadFactory $ 1.void run()(PriorityThreadFactory.java:53)
java.lang.Thread.run(Thread.java:818)

duplicate

最も参考になるコメント

反応をファック

全てのコメント9件

https://github.com/facebook/fresco/issues/2049と重複している可能性があり

はい、これは#2049(特にhttps://github.com/facebook/fresco/issues/2049#issuecomment-367235216)の複製のようです。 @ jyh149129 、ここで問題を閉じて、そこでの議論に集中します:)

ありがとう@gengjiawen!

反応をファック

解決策はどこにありますか? Fresco依存関係の1.13.0バージョンで問題に直面しています。 私を助けてください。

/ data / data / yourpackage / libと/ data / data / yourpackage / lib-mainのcpu_abiが異なるため、このバグが発生した理由を見つけたと思います。
そして、なぜそれが違うのですか? ExtractFromZipSoSource.ensureDsos()に欠陥があったためです。
どんな欠陥? 32ビットと64ビットの両方のsoライブラリがある場合、AndroidOSはあなたが64ビットアプリであると見なすという仮定がありました。 しかし、OPPO R7sm(Android 5.1.1 ColorOS:V3.0_170510_beta)ではルールが破られました。

私はコードを変更することでOPPOのバグを修正しました。後でプルリクエストを行い、皆さんの助けになることを期待しています。

素晴らしい、@ artemisiaを調査してくれてありがとう!

@artemisiaあなたのPRを見たいです!このバグは私を大いに混乱させます...

すみません、私の英語は下手です。

デバイス:モバイルデバイス:OPPC R7sm(AndroLinkid 5.1.1)
調査結果:
armeabi-v7aとarm64-v8aがapkに存在する場合、通常はarm64-v8aが読み込まれます。 しかし、OPPOR7smはarmeabi-v7aがロードされています。

パスデータ/アプリ/を確認します/ lib /。 検索はarmであり、arm64ではありません。 通常はarm64である必要があります

soloaderを初期化すると、data / app /を解凍します/.apk。 / lib-main。このフローは、デバイスサポートabi(ExtractFromZipSoSource.javaのZipUnpacker.ensureDsos())をチェックします。データ/アプリ/を確認してください/ lib / arm / apkファイルの.soおよび* /。so(ApkSoSource.javaのApkUnpacker.shouldExtract())。
ファイルは同じではありません。 data / data /にコピーします/ lib-main。

getsupportedAbisは["arm64-v8a"、 "armeabi-v7a"、 "armeabi"]です。 * .soファイルを順番に確認します。
ただし、data / app // lib /はOPPCR7smのarmであるため、常にarm64-v8aosファイルをdata / data /にコピーしてください。/ lib-main。

* .soにつながるのは、32ビットの問題ではなく64ビットの問題です。

私の解決策:

SoLoaderライブラリを変更します。 チェックデータ/アプリ/を追加/ lib /はarmまたはarm64です。

ファイル:
ExtractFromZipSoSource.java

    ...
    final ZipDso[] ensureDsos() {
      if (mDsos == null) {
        Set<String> librariesAbiSet = new LinkedHashSet<>();
        HashMap<String, ZipDso> providedLibraries = new HashMap<>();
        Pattern zipSearchPattern = Pattern.compile(mZipSearchPattern);
        String[] supportedAbis = SysUtil.getSupportedAbis();
        Enumeration<? extends ZipEntry> entries = mZipFile.entries();

+        // Fixed couldn't find DSO to load:  "xxx.os"  is 64-bit instead of 32-bit
+       File sysLibPath =  new File(mContext.getApplicationInfo().nativeLibraryDir);
+       String sysLibAbi = sysLibPath.getPath().substring(sysLibPath.getPath().lastIndexOf("/")+1);
+       if(sysLibAbi.equalsIgnoreCase("arm")) {
+         // sys lib is load armeabi-v7a, this exception case
+         ArrayList<String> newSupportedAbis = new ArrayList();
+         for(String abi : supportedAbis) {
+           if(abi.equalsIgnoreCase("arm64-v8a")) {
+               //skip arm64-v8a
+               continue;
+           }
+
+           newSupportedAbis.add(abi);
+         }
+
+         supportedAbis = newSupportedAbis.toArray(new String[newSupportedAbis.size()]);
+       }


        while (entries.hasMoreElements()) {
          ZipEntry entry = entries.nextElement();
          Matcher m = zipSearchPattern.matcher(entry.getName());
    ...

反応をファック

ウェルカムフラッター

このページは役に立ちましたか?
0 / 5 - 0 評価