APK只包含指定平台的so库(abi)

APK只包含指定平台的so库(abi)

The errors:
FATAL EXCEPTION: main
Process: com.xmai.happlyll, PID: 1243
java.lang.UnsatisfiedLinkError: Couldn't load native-lib from loader dalvik.system.PathClassLoader[DexPathList[[zip file "/system/app/app-1.1.2.apk"],nativeLibraryDirectories=[/vendor/lib, /system/lib]]]: findLibrary returned null
at java.lang.Runtime.loadLibrary(Runtime.java:358)
at java.lang.System.loadLibrary(System.java:526)
at com.xmai.happlyll.app.MyApplication.<clinit>(MyApplication.java:13)
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1208)
at android.app.Instrumentation.newApplication(Instrumentation.java:990)
at android.app.Instrumentation.newApplication(Instrumentation.java:975)
at android.app.LoadedApk.makeApplication(LoadedApk.java:502)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4301)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:801)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:617)
at dalvik.system.NativeStart.main(Native Method)

android第三方 sdk是以aar形式提供的,甚至是远程aar,如果这个sdk对abi的支持比较全,可能会包含armeabi, armeabi-v7a,x86, arm64-v8a,x86_64五种abi,而你应用的其它so只支持armeabi,armeabi-v7a,x86三种,直接引用sdk的aar,会自动编译出支持5种abi的包。但是应用的其它so缺少对其它两种abi的支持,那么如果应用运行于arm64-v8a,x86_64为首选abi的设备上时,就会CRASH。

第一种:对每个要生成的渠道包进行分别配置(在app下的build.gradle文件中配置)

productFlavors {  
    necess {  
        ndk {  
            abiFilters "armeabi-v7a"  
            abiFilters "x86"  
            abiFilters "armeabi"  
        }  
    }  
    abiall {  
        ndk {  
            abiFilters "armeabi-v7a"  
            abiFilters "x86"  
            abiFilters "armeabi"  
            abiFilters "arm64-v8a"  
            abiFilters "x86_64"  
        }  
    }  
}  

像这种就是单独对渠道包配置,对应打出来的包就只包含你所需要的so库。

《APK只包含指定平台的so库(abi)》

第二种:全局配置(在app下的build.gradle文件中配置)

defaultConfig {
    ndk {
        abiFilters "armeabi", "armeabi-v7a", "arm64-v8a"
    }
}

这样生成的所有Apk就最多有armeabi, armeabi-v7a, arm64-v8a这三种平台的so库,当然要它本身就有这三个平台的so库.

    原文作者:xmaihh
    原文地址: https://www.jianshu.com/p/ff02e9de1eda
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞