Android

最近更新时间:2024-05-31 14:41:22

我的收藏
为了减少包体大小,您可将 SDK 所需的 so 库、模型资源改为联网下载,只需要在 SDK 初始化之前下载好这些文件即可。对于滤镜和动效资源,建议在用户点击使用时,点击一项下载一项。

Demo工程: TEBeauty_Download_Example

从 github clone 出 demo工程,根据 TEBeauty_Download_Example/readme 文档配置和运行TEBeauty_Download_Example,以了解动态下载的整体流程。

动态下载 so 库和模型资源

如果您复用 Demo 中的下载代码
如果您自己做下载
1. 将 demo 工程 com.tencent.demo.download 目录下的代码拷贝到您的工程。
2. 下载SDK,解压,然后从"SDK"目录找到.zip格式的压缩包,再次解压,您将看到如下文件:

20240516-205143@2x


3. 将 download_assets.zip, arm64-v8a.zip, armeabi-v7a.zip 上传到您的服务器,得到下载地址。计算出这3个 zip 文件的 MD5。将这3个下载地址和 MD5 填在 ResDownloadConfig.java 里对应的常量上。
4. 参见TEMenuActivity.java里的代码,通过 ResDownloadUtil.getValidLibsDirectory 检查 so 库是否已经下载好,如果没下载好,则调用 ResDownloadUtil.checkOrDownloadFiles 启动下载,下载成功后得到so库的路径sdkLibraryDirectory,然后调用 XmagicApi.setLibPathAndLoad(sdkLibraryDirectory) 加载so库。
String validLibsDirectory = ResDownloadUtil.getValidLibsDirectory(this, libraryMD5); if (validLibsDirectory == null) { ResDownloadUtil.checkOrDownloadFiles(this, ResDownloadUtil.FILE_TYPE_LIBS, libraryURL, libraryMD5, new TEDownloadListener() { @Override public void onDownloadSuccess(String directory) {
sdkLibraryDirectory = directory; } @Override public void onDownloading(int progress) { } @Override public void onDownloadFailed(int errorCode) { } }); } else { sdkLibraryDirectory = validLibsDirectory; }
5. 参见TEMenuActivity.java里的代码,通过 ResDownloadUtil.getValidAssetsDirectory 检查模型资源是否已经下载好,如果没下载好,则调用 ResDownloadUtil.checkOrDownloadFiles 启动下载,模块内部会把这些资源下载、整理、拷贝到 AppConfig.resPathForSDK目录 ,在 new XmagicApi 时传给 SDK。
String validAssetsDirectory = ResDownloadUtil.getValidAssetsDirectory(this, ResDownloadConfig.DOWNLOAD_MD5_ASSETS); if (TextUtils.isEmpty(validAssetsDirectory)) { ResDownloadUtil.checkOrDownloadFiles(this, ResDownloadUtil.FILE_TYPE_ASSETS, ResDownloadConfig.DOWNLOAD_URL_ASSETS, ResDownloadConfig.DOWNLOAD_MD5_ASSETS, new TEDownloadListener() { @Override public void onDownloadSuccess(String directory) { } @Override public void onDownloading(int progress) { } @Override public void onDownloadFailed(int errorCode) { } }); } else { }
6. Demo 中默认是开启断点续传功能的(ResDownloadUtil.java ENABLE_RESUME_FROM_BREAKPOINT 属性为true),可以确保在下载异常中断后,下次继续从中断点接着下载。如果您也想开启断点续传,请确保您的下载服务器支持断点续传能力。 检测方法:
判断服务器是否支持断点续传,看Web服务器是否支持Range请求即可。测试方法是在命令行中执行curl命令:
curl -i --range 0-9 https://您的服务器地址/待下载的文件名
例如:
curl -i --range 0-9 https://mediacloud-76607.gzc.vod.tencent-cloud.com/TencentEffect/Android/2.4.1.119/xmagic_S1-04_android_2.4.1.119.zip
如果返回的内容有Content-Range 字段,则表示服务器支持断点续传。
1. 下载SDK,解压,然后从"SDK"目录找到 .zip 格式的压缩包,再次解压,您将看到如下文件。assets 里的模型文件和 jniLibs 里的 so 文件可以动态下载。libs 里的 aar 则需要内置到包里。

20240516-205143@2x


2. 下载完 so 文件并解压后,调用XmagicApi.setLibPathAndLoad(/path/to/so/files) 加载 so 库。



注意:
强烈建议您将 so 下载到 App 的私有目录,而不是外部存储,以防 so 被清理软件误删。同时,建议您根据用户手机的 CPU 类型按需下载 v8a 或 v7a 的 so,以加快下载速度,这里可以参考 Demo 工程的 TEMenuActivity 的做法。
3. 对于 download_assets.zip 包里的文件,下载完成后,解压,然后调用下面的代码让 SDK 把文件拷贝到正确的目录(AppConfig.resPathForSDK所指向的目录),代码中的downloadedDirectory是您解压后的文件所在目录。
addAiModeFiles返回的错误码-2表示文件拷贝过程中失败了,可能是手机空间不足或 IO 异常,可尝试重新拷贝或重新下载。
private static boolean organizeAssetsDirectory(String downloadedDirectory) { for (String path : XmagicResourceUtil.AI_MODE_DIR_NAMES) { if (XmagicApi.addAiModeFiles(downloadedDirectory + File.separator + path, AppConfig.resPathForSDK) == -2) { return false; } } return true; }
注意:
当 SDK 版本更新时,对应的 so 和 assets 可能会发生变化,为确保兼容性,您需要重新下载这些文件。建议参见 Demo 中的方式,利用 MD5 进行校验 。

滤镜和动效资源下载

每个滤镜都是一张 png 格式的图片,每个动效都是一个文件夹,对于滤镜和动效资源,建议在用户点击使用时,点击一项下载一项。下载成功后,调用 SDK 的 XmagicApi.setEffect接口,将滤镜路径或动效文件夹的路径设置给 SDK 即可。
滤镜和动效资源可以保存在手机任意目录,我们建议您保存在 app 私有目录,防止被误清理。