为了减少包体增量,自版本V4.4.2后,sample代码中带有下发so逻辑,接入形式发生变化
通过aar加载
需要在创建licenseWrapper对象前调用 BytedLicenseWrapper.loadLib()
通过so加载
需要在创建licenseWrapper对象前,利用System.load()
传入so库所在路径来加载sdk
示例代码
try { BytedLicenseWrapper.loadLib(); } catch (UnsatisfiedLinkError e) { ExternalLibraryLoader externalLibraryLoader = new ExternalLibraryLoader(new SdCardLibrarySource(mContext)); externalLibraryLoader.loadLib(); } this.licenseWrapper = new com.bytedance.labcv.licenselibrary.BytedLicenseWrapper(parames, this.httpProvider);
详情可见加载SDK的Step2章节。
sample通过将so库放置在sdcard存储中来模拟下发过程以及加载sdk的过程,不提供线上下发环境。
注意
版本4.4.2开始,安卓端sdk加载方式发生变更。如果通过aar加载sdk,无需额外操作;如果通过so来加载sdk,则需要在调用任何sdk相关接口,包括鉴权和创建renderManager对象前,利用System.load()
传入so库所在路径来加载sdk,demo中通过USE_SO_LIB
开关来控制是否启用该加载方式。实例代码如下:
if (USE_SO_LIB) { ExternalLibraryLoader externalLibraryLoader = new ExternalLibraryLoader(new SdCardLibrarySource(context)); externalLibraryLoader.loadLib(); }
实现so库的顺序加载。
示例代码如下:
package com.bytedance.labcv.core.external_lib; import android.util.Log; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ExternalLibraryLoader { static String TAG = "ExternalLibraryLoader"; static private ArrayList<String> loadedLibraryNames = new ArrayList<>(); public ExternalLibraryLoader() { } public void loadLib() { List<String> list = Arrays.asList("c++_shared", "effect"); if (!onLoadNativeLibs(list)) { Log.e(TAG, "dynamically load library failed!"); } } public boolean onLoadNativeLibs(List<String> list) { for (int i = 0; i < list.size(); i++) { if (!load(list.get(i))) { return false; } } return true; } private boolean load(String libraryName) { if (loadedLibraryNames.contains(libraryName)) { return true; } try { String targetLibraryName = String.format(Locale.US, "lib%s.so", libraryName); File soFile = new File(ApplicationSingleton.application.getFilesDir().getAbsolutePath() + File.separator + "external_libs/jni/arm64-v8a/" + targetLibraryName); if (soFile.exists()) { System.load(soFile.getAbsolutePath()); } loadedLibraryNames.add(libraryName); return true; } catch (UnsatisfiedLinkError e) { e.printStackTrace(); return false; } finally { } } }