Skip to content

loadDynamicLibrary

xinbaicheng edited this page Aug 10, 2016 · 3 revisions

动态库插件化

动态库插件化是指在APK发布时并不带有所需的动态库,在应用安装后根据手机的**应用程序二进制接口(Application Binary Interface, 简称ABI)**下载对应的动态库,应用的功能并不受影响,以达到缩减APK大小的目的
本文档介绍了SDK支持动态库插件化功能的使用方法

1. 背景

Android手机ABI可分为 armeabi-v7a、arm64-v8a、x86、x86_64,如若应用有使用动态库且需全部支持,则需要将所有平台的动态库放入APK中,这会导致APK的变大。
为解决该问题,金山云Android播放SDK支持动态库插件化的功能。即在APK发布时不需将动态库放入APK中,在应用安装后将所需平台的动态库下载至应用文件夹下,将该动态库路径设置给播放SDK即可,一样可实现音视频的播放功能。

2. 使用方法

将所需的动态库根据平台、版本等分别压缩之后放至服务器以供应用下载对应的动态库

2.1 获取手机的平台信息

首先,在应用初始化时应当根据手机的平台信息以及build.gradle里的abiFilters设置确需要当下载的动态库
Android Studio工程的build.gradle里的abiFilters属性表明了应用所支持的应用程序二进制接口
如下所示,该设置表示只支持 armeabi-v7a,则所有手机只能下载armeabi-v7a平台的动态库

android.ndk {
    abiFilters "armeabi-v7a"
}

下面的例子是按照手机的自身的ABI特性选择相应的平台

String platform = null;
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    platform = getSupportedAbiAfterLollip();
else
    platform = getSupportedAbiBeforeLollip();

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private String getSupportedAbiAfterLollip() {
    String ret = null;
    String[] support = Build.SUPPORTED_ABIS;
    for(int i = 0; i < support.length; i++)
    {
        switch (support[i])
        {
            case "armeabi":
            case "armeabi-v7a":
                ret = "armeabi-v7a";
                break;
            case "arm64-v8a":
                ret = "arm64-v8a";
                return ret;
            case "x86":
                ret = "x86";
                return ret;
        }
    }
    return ret;
}

private String getSupportedAbiBeforeLollip()
{
    String ret = null;
    switch(Build.CPU_ABI2)
    {
        case "armeabi":
        case "armeabi-v7a":
            ret = "armeabi-v7a";
            break;
        case "arm64-v8a":
            ret = "arm64-v8a";
            return ret;
        case "x86":
            ret = "x86";
            break;
    }
    return ret;
}

2.2 设置动态库路径

在获取所需Android平台之后,由应用下载对应的动态并放至相应路径,目标路径如下所示

// 需将下载的动态库放至该文件夹下
String mTargetPath = mContext.getDir("jniLibs", Activity.MODE_PRIVATE).getAbsolutePath();
// 动态库的加载路径
String libPath = mTargetPath + File.separator;
KSYLibraryManager.setLocalLibraryPath(libPath);
Clone this wiki locally