
在Android开发中,Android Studio用于集成第三方SDK(例如,腾讯视频云移动直播,播放器,短视频以及实时音频和视频). 通常有两种集成方法: aar集成和jar + so集成. Android集成非常成熟,有关详细信息,请参见SDK集成指南.
随着项目业务的增长,APK的大小需要尽可能的薄. 通常,您可以考虑使用加载来减少最终apk安装包的大小.
以移动实时广播5.4全功能版(LiteAVSDK_Professional_Android_5.4.6097)为例. 整个SDK的大小主要来自so文件. 这些文件是SDK正常运行所依赖的音频和视频编库,图像处理库和声学. 加工零件. 每个so库的具体作用都可以阅读.
具体转换如下:
使用jar + so进行集成,从官方网站下载SDK,解压缩LiteAVSDK_xxx.zip压缩包以获取libs目录,该目录主要包含so文件和jar文件. 上传SO文件将SDK压缩包中的so文件上传到CDN,并记录下载地址,例如. 准备开始在用户启动与SDK相关的功能之前(例如在开始播放视频之前),使用加载来提示用户“正在加载相关的功能模块”. 在下载SO文件的同时,当用户等待时,APP可以下载so文件并将其存储在应用程序目录中(例如,应用程序根目录中的files文件夹). 为了确保此过程不受操作员的DNS拦截的影响,请在下载文件后,验证so文件的完整性. 加载SO文件并等待所有这些文件就位之后,请调用TXLiveBase的setLibraryPath来设置SDK的下载目标路径,然后调用与SDK相关的功能. 之后,SDK将在这些路径下加载所需的so文件并启动相关功能.
下载,解压缩和检查完整性的过程由客户自己灵活完成,该演示将不进行演示. 我们直接从复制到内部存储开始

//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 ;
}
//下载so的外部存储目录,比如sd卡下的armeabi文件夹 oldFilePath = Environment.getExternalStorageDirectory().getPath()+"/armeabi"; //应用的根目录file文件下新建armeabi文件夹 newFilePath = getFilesDir().getAbsolutePath()+"/armeabi"; //复制到内存存储 FileUtils.copyFolder(oldFilePath, newFilePath) //sdk接口动态加载so TXLiveBase.setLibraryPath(newFilePath);
//设置在 Android Studio 的控制台打印 SDK 的相关输出。
TXLiveBase.setConsoleEnabled(true);
//获取sdk版本号
String sdkVersionStr = TXLiveBase.getSDKVersionStr();
Log.i("TAG", "sdkVersionStr: "+sdkVersionStr);
//开始推流
mLivePusher.startPusher(rtmpUrl.trim());
在正常情况下,可以成功推送流,如上所示. 如果您踏进维修区,将会遇到以下崩溃,请再次检查集成配置.
在这一点上,它被认为是完整的.
与版相比,商业企业版增加了特殊效果,例如大眼睛,瘦脸,运动贴,绿屏和其他特殊效果. 随着特权功能的发展,腾讯云小型直播团队通过与Youtu和P-picture团队合作,将这些特殊效果深深地集成到了LiteAVSDK的图像处理过程中.

如果它是集成的商业SDK,例如Mobile Live 5.4商业版(LiteAVSDK_Enterprise_Android_5.4.6097),请解压缩该SDK软件包,您会发现更多jar和so库,以及这些so库的动态加载方法,Youtu实验室有以下特殊加载要求(此处已对6.8商业版进行了优化,请参阅“ LiteAVSDK商业版6.6 +,Android集成了动态加载”).
//sdk接口动态加载so
TXLiveBase.setLibraryPath(newFilePath);
//系统接口动态加载so
loadLibrary(newFilePath, "YTCommon");
loadLibrary(newFilePath, "image_filter_common");
loadLibrary(newFilePath, "image_filter_gpu");
loadLibrary(newFilePath, "algo_rithm_jni");
loadLibrary(newFilePath, "format_convert");
loadLibrary(newFilePath, "ParticleSystem");
loadLibrary(newFilePath,"nnpack");
loadLibrary(newFilePath, "YTHandDetector");
loadLibrary(newFilePath, "GestureDetectJni");
loadLibrary(newFilePath,"YTIllumination");
loadLibrary(newFilePath,"YTFaceTrackPro");
loadLibrary(newFilePath,"algo_youtu_jni");
private static boolean loadLibrary(String path, String name) {
boolean loadSucess = false;
try {
if (!TextUtils.isEmpty(path)) {
String libName = path+"/lib"+name+".so";
File file = new File(libName);
if (file.exists()) {
Log.i("TAG", libName + " exist, " + file.length());
}
else {
Log.i("TAG", libName + " not exist");
}
file.setExecutable(true);
file.setReadable(true);
file.setWritable(true);
System.load(libName);
loadSucess = true;
}
} catch (Error e1) {
Log.i("NativeLoad","load library : "+e1.toString());
} catch (Exception e) {
Log.i("NativeLoad","load library : "+e.toString());
}
return loadSucess;
}
//设置动效Licence TXLiveBase.getInstance().setLicence(context, LicenceUrl, Key); //验证Licence TXLiveBase.getInstance().getLicenceInfo(context); //设置推流动效 mLivePusher.setMotionTmpl(params.mMotionTmplPath);
在通常情况下,您可以打开视频播放器jar版视频播放器jar版,如上所示. 如果您踏进维修区,将会遇到以下崩溃,请再次检查集成配置.
CPU体系结构
第五代ARM v5TE,使用软件浮点算法,与所有ARM设备兼容,通用性强,速度慢

使用硬件浮点算法和高级扩展功能的第七代ARM v7
第八代64位,包括AArch32,AArch64,两个执行状态分别对应于32、64bit
英特尔32位,通常用于平板电脑
英特尔64位,通常用于平板电脑
//非商业版,6.3之前的版本支持armeabi、armeabi-v7a,6.3开始支持armeabi、armeabi-v7a、arm64-v8a
//商业版,只支持armeabi
defaultConfig {
ndk {
abiFilters "armeabi"//,"armeabi-v7a","arm64-v8a","x86_64"
}
}
因此,当应用程序在64位系统上运行时,它可以区分以下三种情况:

因此,当您的项目仅指定支持armeabi时,在64位手机上运行以动态加载时,将发生崩溃. 解决方案是: 首先将32位的so文件放入安装包中,然后在运行时动态加载其他so库,以便应用程序启动32位进程,而动态加载的so库也是32位版本,不再需要在运行时闪回.
相关文章:
LiteAVSDK商业版6.6 +,Android集成了动态加载功能,因此
动态加载so库的实现方法和问题处理
Android的文件加载机制会询问源代码摘要参考资料
演示下载
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-232518-1.html
肯定是这只学生放入去的
可能