LiteAVSDK商业版6.6+,安卓动态加载so集成
- 2019 年 11 月 20 日
- 筆記
一、简介
以动态加载so的方式,集成LiteAVSDK商业版(安卓6.6+版本),是本篇文章的重点。
1、安卓端非商业版aar集成、jar集成参考官方集成文档 2、6.6之前的商业版,如何动态加载so,参考上一篇文章《LiteAVSDK集成,动态加载so库》。 其中提到动态加载so的方式中“优图实验室有如下特殊加载要求”,优图实验室在6.6版本上性能重构时,也修改了这个僵化的集成 方式。同时优化了可远程加载的P图资源,使本地集成时,只需要放入小部分资源文件,可进一步缩小apk体积。
二、动态加载so
1、下载sdk
以LiteAVSDK_Enterprise_Android_6.8.7959版本为示例,下载解压sdk如下图

1、商业版6.4之前的版本只支持armeabi架构。2019-05-15 2、商业版6.5增加支持armeabi-v7a架构。2019-06-12 3、商业版6.6增加支持arm64-v8a架构。2019-08-06 4、从商业版6.6开始,assets进行了分包,其中assets-static需要放到工程本地,assets-dynamic资源可以远程加载。
2、工具类的写法。
下载、解压、校验完整性的过程,由客户自己灵活完成,demo就不给出演示了。我们直接从复制动效so和P图资源到内部存储开始。
示例demo需要把armeabi-v7a下的so文件、assets-dynamic里面的资源文件,都复制到手机sd卡下的一个文件夹里面。
//FileUtils类 public static boolean copyFolder (String oldPath , String newPath){ File newFile = new File(newPath); if(!newFile.exists()){ if(!newFile.mkdirs()){ Log.e("TAG","无法创建路径"); return false; } } File oldFile = new File(oldPath); String[] files = oldFile.list(); Log.i("TAG", "files.length: "+files.length); File temp; for(String file : files){ if(oldPath.endsWith(File.separator)){ temp = new File(oldFile + file); }else{ temp = new File(oldPath + File.separator + file); } if(temp.isDirectory()){ copyFolder(oldPath + "/"+file , newPath + "/" + file); }else if(!temp.exists()){ Log.e("TAG", "copyFolder: oldFile not exist"); return false; }else if(!temp.isFile()){ Log.e("TAG", "copyFolder: oldFile not file"); return false; }else if(!temp.canRead()){ Log.e("TAG", "copyFolder: oldFile cannot read"); return false; }else{ try { FileInputStream fileInputStream = new FileInputStream(temp); FileOutputStream fileOutputStream = new FileOutputStream(newPath + "/" +temp.getName()); byte[] buffer = new byte[1024]; int byteRead; while ((byteRead = fileInputStream.read(buffer))!=-1){ fileOutputStream.write(buffer,0,byteRead); } fileInputStream.close(); fileOutputStream.flush(); fileOutputStream.close(); } catch (Exception e) { e.printStackTrace(); } File fileile = new File(newPath + "/" +temp.getName()); fileile.setWritable(true); fileile.setReadable(true); fileile.setExecutable(true); } } return true ; }
3、本地集成jar、assets-static
如下图,导入jar,把assets-static里面的资源文件,复制到工程默认的assets静态资源文件里面。

4、demo操作示例
如下图ListView,操作步骤:
①、点击copyFolder,复制粘贴so、assets-dynamic,从sd卡下复制到工程包名下的文件夹。复制成功返回true。
②、点击setLibraryPath,调用sdk接口动态加载so。
③、点击setLicence,设置动效Licence。这一步会下载校验licence,请保持网络通畅、给读写权限。
④、点击getSDKVersionStr,获取sdk版本号、获取licence信息,能正常获取,代表前4步都正常,接下来可以体验动效了。

//MainActivity //下载so的外部存储目录,比如sd卡下的armeabi-v7a文件夹 oldFilePath = Environment.getExternalStorageDirectory().getPath()+"/armeabi-v7a"; //应用的根目录file文件下新建armeabi-v7a文件夹 newFilePath = getFilesDir().getAbsolutePath()+"/armeabi-v7a"; //复制到内存存储 FileUtils.copyFolder(oldFilePath, newFilePath) //sdk接口动态加载so TXLiveBase.setLibraryPath(newFilePath); //初始化sdk,设置直播、短视频licence TXLiveBase.setConsoleEnabled(true); TXLiveBase.getInstance().setLicence(getApplicationContext(), licenceUrl, licenseKey); TXUGCBase.getInstance().setLicence(getApplicationContext(), licenceUrl, licenseKey); //获取sdk版本号 String sdkVersionStr = TXLiveBase.getSDKVersionStr(); //获取licence信息 String licenceInfo = TXUGCBase.getInstance().getLicenceInfo(getApplication());
5、验证
点击ListView的摄像头推流,进入推流页面,开启推流,体验高级美颜。
PituDemo直接引入集成视频云终端团队封装的module,module里面的直播、短视频等功能点、api写法,可以参考官网文档。

建议把高级美颜都体验一遍,尤其是人脸识别的大眼、瘦脸、头部挂件等特效,正常都ok的。如果动效crash,请对比PituDemo,重新集成。
至此算是全部完成了。
三、本地集成商业版jar+so+assets
如果不想用aar集成,也不需要远程加载so,只需要在工程本地集成jar,导入商业版资源文件时,有个地方需要注意:
通过上面可以了解到,6.6之后的版本,assets资源包被分包了,所以集成时不能简单的把assets-static、assets-dynamic里面的资源文件复制到工程的默认assets文件下,动效会无法识别资源。
正确的做法是把aar包改成zip后缀,然后解压,里面有一个完整的assets资源包,把里面文件全复制到工程assets文件夹下,就可以正常集成了

五、资源
相关文章:LiteAVSDK集成,动态加载so库