Fresco: java.lang.UnsatisfiedLinkError рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдПрд╕рдУ рдирд╣реАрдВ рдвреВрдВрдв рд╕рдХрд╛: libimagepipeline.so

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдорд╛рд░реНрдЪ 2018  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/fresco

рдЬрд╛рдирдХрд╛рд░реА:

  • рдлреНрд░реЗрд╕реНрдХреЛ рд╕рдВрд╕реНрдХрд░рдг:1.8.1
  • рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдо рд╕рдВрд╕реНрдХрд░рдг: рд╡рд┐рд╡реЛ рдПрдВрдбреНрд░реЙрдЗрдб 5.1.1, рд╕реАрдкреАрдпреВ: arm64-v8a

рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбреАрдПрд╕рдУ рдирд╣реАрдВ рдорд┐рд▓рд╛: libimagepipeline.so
com.facebook.soloader.SoLoader.void doLoadLibraryBySoName(java.lang.String,int,android.os.StrictMode$ThreadPolicy)...
03-23 тАЛтАЛ19:21:55.955 17814 17931 рдИ рдХрд▓рд╛: 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 рдИ рд╕реЛрд▓реЛрдбрд░: рд▓реЛрдб рдирд╣реАрдВ рд╣реЛ рд╕рдХрд╛: 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 рдЖрд╡рдВрдЯрди (int) (NativeMemoryChunkPool.java:58)
com.facebook.imagepipeline.memory.NativeMemoryChunkPool.void free(java.lang.Object)(NativeMemoryChunkPool.java:20)

_рдЕрднрд┐рднрд╛рд╡рдХ_##1##_рдЕрднрд┐рднрд╛рд╡рдХ_

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

_рдЕрднрд┐рднрд╛рд╡рдХ_##4##_рдЕрднрд┐рднрд╛рд╡рдХ_

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

_рдЕрднрд┐рднрд╛рд╡рдХ_##2##_рдЕрднрд┐рднрд╛рд╡рдХ_

_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 (рдереНрд░реЗрдб.рдЬрд╛рд╡рд╛:818)

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднрд╛рдбрд╝ рдореЗрдВ рдЬрд╛рдУ

рд╕рднреА 9 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╕рдВрднрд╡рддрдГ https://github.com/facebook/fresco/issues/2049 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ

рд╣рд╛рдВ, рдпрд╣ #2049 рдХрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд▓рдЧрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ https://github.com/facebook/fresco/issues/2049#issuecomment-367235216)ред @jyh149129 , рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдпрд╣рд╛рдВ рдЪрд░реНрдЪрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдВрдж рдХрд░ рд░рд╣рд╛ рд╣реВрдВ :)

рдзрдиреНрдпрд╡рд╛рдж @gengjiawen!

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рднрд╛рдбрд╝ рдореЗрдВ рдЬрд╛рдУ

рд╕рдорд╛рдзрд╛рди рдХрд╣рд╛рдВ рд╣реИ? рдореБрдЭреЗ рдлреНрд░реЗрд╕реНрдХреЛ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ 1.13.0 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред рдХреГрдкрдпрд╛ рдореЗрд░реА рдорджрдж рдХрд░реЗрдВред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдпрд╣ рдмрдЧ рдХреНрдпреЛрдВ рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐ /data/data/yourpackage/lib рдФрд░ /data/data/yourpackage/lib-main рдХрд╛ cpu_abi рдЕрд▓рдЧ рд╣реИред
рдФрд░ рдпрд╣ рдЕрд▓рдЧ рдХреНрдпреЛрдВ рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ ExtractFromZipSoSource.ensureDsos() рдореЗрдВ рдХреЛрдИ рдЦрд░рд╛рдмреА рдереАред
рдХреНрдпрд╛ рджреЛрд╖? рдПрдХ рдзрд╛рд░рдгрд╛ рдереА рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдУрдПрд╕ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рдЖрдк 64-рдмрд┐рдЯ рдРрдк рдереЗ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ 32-рдмрд┐рдЯ рдФрд░ 64-рдмрд┐рдЯ рджреЛрдиреЛрдВ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдереЗред рд▓реЗрдХрд┐рди, OPPO R7sm (Android 5.1.1 ColorOS: V3.0_170510_beta) рдкрд░ рдирд┐рдпрдо рддреЛрдбрд╝рд╛ рдЧрдпрд╛ред

рдореИрдВрдиреЗ рдХреЛрдб рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдХреЗ рдЕрдкрдиреЗ OPPO рдкрд░ рдмрдЧ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ рд╣реИ, рдореИрдВ рдЖрдкрдХреЗ рд▓реЛрдЧреЛрдВ рдХреА рдорджрдж рдХрд░рдиреЗ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реБрдП рдмрд╛рдж рдореЗрдВ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рдХрд░реВрдВрдЧрд╛ред

рдмрд╣реБрдд рдмрдврд╝рд┐рдпрд╛, @artemisia рдХреА рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

@artemisia рдЖрдкрдХреЗ рдкреАрдЖрд░ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИ, рдпрд╣ рдмрдЧ рдореБрдЭреЗ рдмрд╣реБрдд рднреНрд░рдорд┐рдд рдХрд░рддрд╛ рд╣реИ ...

рдорд╛рдл рдХрд░рдирд╛ рдореЗрд░реА рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдмреБрд░реА рд╣реИред

рдбрд┐рд╡рд╛рдЗрд╕: рдореЛрдмрд╛рдЗрд▓ рдбрд┐рд╡рд╛рдЗрд╕: OPPC R7sm (AndroLinkid 5.1.1)
рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо:
рдЬрдм рдПрдкреАрдХреЗ рдореЗрдВ armeabi-v7a nad arm64-v8a рдореМрдЬреВрдж рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЖрдо рддреМрд░ рдкрд░ arm64-v8a рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди OPPO R7sm рд▓реЛрдбреЗрдб armeabi-v7a рд╣реИред

рдореИрдВ рдкрде рдбреЗрдЯрд╛/рдРрдк//рд▓рд┐рдм/. рдлрд╛рдЗрдВрдб рдЖрд░реНрдо рд╣реИ, рдЖрд░реНрдо 64 рдирд╣реАрдВ рд╣реИред рдЖрдо рддреМрд░ рдкрд░ arm64 . рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП

рдЬрдм init soloader, рдбреЗрдЯрд╛/рдРрдк/рдЕрдирдЬрд╝рд┐рдк рдХрд░реЗрдЧрд╛/ .apk. /рд▓рд┐рдм-рдореЗрди.рдпрд╣ рдкреНрд░рд╡рд╛рд╣ рдбрд┐рд╡рд╛рдЗрд╕ рд╕рдорд░реНрдерди abi (ZipUnpacker.ensureDsos () ExtractFromZipSoSource.java рдкрд░) рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛,рдФрд░ рдбреЗрдЯрд╛/рдРрдк//lib/рдЖрд░реНрдо/ .so рдФрд░ */.so рдХреА apk рдлрд╝рд╛рдЗрд▓ (ApkUnpacker. shouldExtract() ApkSoSource.java рдкрд░)ред
рдлрд╛рдЗрд▓реЗрдВ рд╕рдорд╛рди рдирд╣реАрдВ рд╣реИрдВред рдбреЗрдЯрд╛/рдбреЗрдЯрд╛/рдореЗрдВ рдХреЙрдкреА рд╣реЛ рдЬрд╛рдПрдЧрд╛/рд▓рд┐рдм-рдореЗрди.

рдкреНрд░рд╛рдкреНрдд рд╕рдорд░реНрдерд┐рддрдПрдмрд┐рд╕ ["arm64-v8a", "armeabi-v7a", "armeabi"] рд╣реИред *.so рдлрд╝рд╛рдЗрд▓ рдХреА рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХрд░реЗрдВред
рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛/рдРрдк//lib/ OPPC R7sm рдкрд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрд╢рд╛ arm64-v8a рдУрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбреЗрдЯрд╛/рдбреЗрдЯрд╛//рд▓рд┐рдм-рдореЗрди.

рд▓реЗрдб рдЯреВ *.so 32-рдмрд┐рдЯ рдЗрд╢реНрдпреВ рдХреЗ рдмрдЬрд╛рдп 64-рдмрд┐рдЯ рд╣реИред

рдореЗрд░рд╛ рд╕рдорд╛рдзрд╛рдия╝Ъ

рд╕реЛрд▓реЛрдбрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реЗрдВред рдЪреЗрдХ рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реЗрдВ/рдРрдк//lib/ рдЖрд░реНрдо рдпрд╛ рдЖрд░реНрдо64 рд╣реИред

рдлрд╝рд╛рдЗрд▓:
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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

qiiyue picture qiiyue  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

836154942 picture 836154942  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

stephen-workpop picture stephen-workpop  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

rafaelekol picture rafaelekol  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

satyarths picture satyarths  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ