-
Notifications
You must be signed in to change notification settings - Fork 246
loadDynamicLibrary
xinbaicheng edited this page Aug 10, 2016
·
3 revisions
动态库插件化是指在APK发布时并不带有所需的动态库,在应用安装后根据手机的**应用程序二进制接口(Application Binary Interface, 简称ABI)**下载对应的动态库,应用的功能并不受影响,以达到缩减APK大小的目的
本文档介绍了SDK支持动态库插件化功能的使用方法
Android手机ABI可分为 armeabi-v7a、arm64-v8a、x86、x86_64,如若应用有使用动态库且需全部支持,则需要将所有平台的动态库放入APK中,这会导致APK的变大。
为解决该问题,金山云Android播放SDK支持动态库插件化的功能。即在APK发布时不需将动态库放入APK中,在应用安装后将所需平台的动态库下载至应用文件夹下,将该动态库路径设置给播放SDK即可,一样可实现音视频的播放功能。
将所需的动态库根据平台、版本等分别压缩之后放至服务器以供应用下载对应的动态库
首先,在应用初始化时应当根据手机的平台信息以及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;
}
在获取所需Android平台之后,由应用下载对应的动态并放至相应路径,目标路径如下所示
// 需将下载的动态库放至该文件夹下
String mTargetPath = mContext.getDir("jniLibs", Activity.MODE_PRIVATE).getAbsolutePath();
// 动态库的加载路径
String libPath = mTargetPath + File.separator;
KSYLibraryManager.setLocalLibraryPath(libPath);