一、简介
本篇文章主要介绍集成LiteAVSDK商业版、6.6以上的版本,安卓端采用动态加载so的方式时的写法。
- 安卓端非商业版aar集成、jar集成,可以参考官方集成文档 。商业版aar集成,参考官方高级功能。
- 6.6之前的商业版,如何动态加载so,请参考上一篇文章《LiteAVSDK集成,动态加载so库》。
- 6.6版本前后动态加载so的差异:
版本 | 部分so必需在本地 | P图的so必需按顺序加载 | assets资源文件可否动态加载 |
---|---|---|---|
6.5- | Y | Y | N |
6.6 | N | N | Y |
二、动态加载so
1、下载sdk
以LiteAVSDK_Enterprise_Android_6.8.7959版本为示例,下载解压sdk如下图:(左6.8、右6.5)
代码语言:javascript复制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、本地集成jar、assets-static
如下图,导入jar,把assets-static里面的资源文件,复制到工程默认的assets静态资源文件里面。
3、复制so、assets-dynamic到应用根目录
下载、解压、校验完整性的过程,由客户自己灵活完成,demo就不给出演示了。我们直接从复制动效so和P图资源到内部存储开始。
示例demo需要把armeabi-v7a下的so文件、assets-dynamic里面的资源文件,都复制到手机sd卡下的一个文件夹里面。
代码语言:javascript复制//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 ;
}
4、动态加载so
以demo为操作示例,如下图ListView,操作步骤:
- 点击copyFolder条目,复制粘贴so、assets-dynamic,从sd卡下复制到工程包名下的文件夹。复制成功返回true。
- 点击setLibraryPath条目,调用sdk接口动态加载so。
- 点击setLicence条目,设置动效Licence。这一步会下载校验licence,请保持网络通畅、给读写权限。
- 点击getSDKVersionStr条目,获取sdk版本号、获取licence信息,能正常获取,代表前3步都正常,接下来可以体验动效了。
核心代码如下:
代码语言:javascript复制//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,重新集成。
至此算是全部完成了。
三、本地集成
如果不想用aar集成,也不需要远程加载so,只需要在工程本地集成jar,导入商业版资源文件时,有个地方需要注意:
- 6.6之后的版本,assets资源包被分包了,所以集成时不能简单的把assets-static、assets-dynamic里面的资源文件复制到工程的默认assets文件下,动效会无法识别资源。
- 正确的做法是把aar包改成zip后缀,然后解压,里面有一个完整的assets资源包,把里面文件全复制到工程assets文件夹下,就可以正常集成了
四、包增量对比
两种集成方式,不同架构的apk体积对比如下图:
五、新版本打包参数
6.6之后的版本,要配置 App 打包参数;
6.6之后的版本,要配置 App 打包参数;
6.6之后的版本,要配置 App 打包参数:如下图文所示
代码语言:javascript复制packagingOptions {
pickFirst '**/libc _shared.so'
doNotStrip "*/armeabi/libYTCommon.so"
doNotStrip "*/armeabi-v7a/libYTCommon.so"
doNotStrip "*/x86/libYTCommon.so"
doNotStrip "*/arm64-v8a/libYTCommon.so"
}
代码语言:java复制//so没有加载成功,运行会报这个crash,请校验so完整性、检查加载流程,如果只部分特殊机型出现,请收集机型反馈给我们。
//极少数海外团队开发手机系统rom,自带的C shared库有缺陷,导致无法正确加载so
java.lang.UnsatisfiedLinkError: No implementation found for void com.tencent.liteav.basic.datareport.TXCDRApi.nativeInitDataReport()
(tried Java_com_tencent_liteav_basic_datareport_TXCDRApi_nativeInitDataReport and Java_com_tencent_liteav_basic_datareport_TXCDRApi_nativeInitDataReport__)
at com.tencent.liteav.basic.datareport.TXCDRApi.nativeInitDataReport(Native Method)
at com.tencent.liteav.basic.datareport.TXCDRApi.<clinit>(SourceFile:418)
at com.tencent.liteav.basic.datareport.TXCDRApi.txReportDAU(SourceFile:73)
at com.tencent.liteav.basic.b.e.a(SourceFile:560)
at com.tencent.liteav.basic.b.e.d(SourceFile:465)
at com.tencent.liteav.basic.b.e.b(SourceFile:51)
at com.tencent.liteav.basic.b.e$1.a(SourceFile:203)
at com.tencent.liteav.basic.b.c.run(SourceFile:127)
at java.lang.Thread.run(Thread.java:784)
代码语言:java复制 //P图so找不到,会报这个crash。加上上面的打包参数,就可以解决,doNotStrip动效的so
java.lang.UnsatisfiedLinkError: No implementation found for void com.tencent.ttpic.util.youtu.YTFaceDetectorBase.nativeSetRefine(boolean)
(tried Java_com_tencent_ttpic_util_youtu_YTFaceDetectorBase_nativeSetRefine and Java_com_tencent_ttpic_util_youtu_YTFaceDetectorBase_nativeSetRefine__Z)
at com.tencent.ttpic.util.youtu.YTFaceDetectorBase.nativeSetRefine(Native Method)
at com.tencent.ttpic.openapi.util.youtu.VideoPreviewFaceOutlineDetector.setRefine(SourceFile:428)
at com.tencent.aekit.api.standard.filter.AESticker.construct(SourceFile:110)
at com.tencent.aekit.api.standard.filter.AESticker.<init>(SourceFile:101)
at com.tencent.rtmp.a.a.a(SourceFile:544)
at com.tencent.liteav.beauty.b.d(SourceFile:1146)
at com.tencent.liteav.beauty.b.c(SourceFile:1124)
at com.tencent.liteav.beauty.b.k(SourceFile:51)
at com.tencent.liteav.beauty.b$14.run(SourceFile:1340)
at com.tencent.liteav.beauty.b.a(SourceFile:1995)
at com.tencent.liteav.beauty.b.a(SourceFile:252)
at com.tencent.liteav.beauty.d.a(SourceFile:295)
at com.tencent.liteav.beauty.d.a(SourceFile:312)
at com.tencent.liteav.c.b(SourceFile:1259)
at com.tencent.liteav.b.a(SourceFile:410)
at com.tencent.liteav.b.onTextureProcess(SourceFile:370)
at com.tencent.liteav.renderer.TXCGLSurfaceView.onDrawFrame(SourceFile:491)
at com.tencent.liteav.renderer.TXCGLSurfaceViewBase$i.i(SourceFile:532)
at com.tencent.liteav.renderer.TXCGLSurfaceViewBase$i.run(SourceFile:277)
六、资源
相关文章:LiteAVSDK集成,动态加载so库
PituDemo下载(需要商业SDK解压密码)