diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FURenderer.java b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FURenderer.java
index 2c5855435..19ff7db23 100644
--- a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FURenderer.java
+++ b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FURenderer.java
@@ -55,8 +55,8 @@ public class FURenderer extends IFURenderer {
private FURenderKit mFURenderKit;
/* AI道具*/
- private String BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor_lite.bundle";
- private String BUNDLE_AI_HUMAN = "model" + File.separator + "ai_human_processor.bundle";
+ public static String BUNDLE_AI_FACE = "model" + File.separator + "ai_face_processor_lite.bundle";
+ public static String BUNDLE_AI_HUMAN = "model" + File.separator + "ai_human_processor.bundle";
/* GL 线程 ID */
private Long mGlThreadId = 0L;
diff --git a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FileUtils.java b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FileUtils.java
index ae38e1cf0..c868cbf1b 100644
--- a/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FileUtils.java
+++ b/FaceUnity/src/main/java/com/yunbao/faceunity/utils/FileUtils.java
@@ -314,6 +314,35 @@ public class FileUtils {
return null;
}
+ public static String copyAssetsFile(Context context, String assetsPath, String fileName, String saveFileDir) {
+ File fileDir = new File(saveFileDir);
+ if (!fileDir.exists()) {
+ fileDir.mkdirs();
+ }
+ File file = new File(fileDir, fileName);
+ if (file.exists()) {
+ return file.getAbsolutePath();
+ }
+ try {
+ InputStream inputStream = context.getAssets().open(assetsPath);
+ FileOutputStream fos = new FileOutputStream(file);
+ BufferedInputStream bis = new BufferedInputStream(inputStream);
+ BufferedOutputStream bos = new BufferedOutputStream(fos);
+ byte[] byteArray = new byte[1024];
+ int bytes = bis.read(byteArray);
+ while (bytes > 0) {
+ bos.write(byteArray, 0, bytes);
+ bos.flush();
+ bytes = bis.read(byteArray);
+ }
+ bos.close();
+ fos.close();
+ return file.getAbsolutePath();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
/**
* 获取Uri文件绝对路径
@@ -522,6 +551,7 @@ public class FileUtils {
/**
* 遍历一个文件夹获取改文件夹下所有文件名
+ *
* @param path
* @return
*/
@@ -563,7 +593,7 @@ public class FileUtils {
* @param path String
* @return Boolean
*/
- public static Boolean checkIsVideo(Context context,String path) {
+ public static Boolean checkIsVideo(Context context, String path) {
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
try {
retriever.setDataSource(context, Uri.fromFile(new File(path)));
diff --git a/FaceUnity/src/test/java/com/yunbao/faceunity/ExampleUnitTest.java b/FaceUnity/src/test/java/com/yunbao/faceunity/ExampleUnitTest.java
index abfb46d38..f8313752a 100644
--- a/FaceUnity/src/test/java/com/yunbao/faceunity/ExampleUnitTest.java
+++ b/FaceUnity/src/test/java/com/yunbao/faceunity/ExampleUnitTest.java
@@ -1,8 +1,5 @@
package com.yunbao.faceunity;
-import org.junit.Test;
-
-import static org.junit.Assert.*;
/**
* Example local unit test, which will execute on the development machine (host).
@@ -10,8 +7,5 @@ import static org.junit.Assert.*;
* @see Testing documentation
*/
public class ExampleUnitTest {
- @Test
- public void addition_isCorrect() {
- assertEquals(4, 2 + 2);
- }
+
}
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index 25df1f9a5..971615fa1 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -92,6 +92,11 @@ android {
exclude 'lib/armeabi-v7a/libmmlic.so'
exclude 'lib/armeabi-v7a/libMNN_CL.so'
exclude 'lib/armeabi-v7a/libMNN_Express.so'
+ //美颜
+ exclude 'lib/armeabi-v7a/libCNamaSDK.so'
+ exclude 'lib/arm64-v8a/libCNamaSDK.so'
+ exclude 'lib/armeabi-v7a/libfuai.so'
+ exclude 'lib/arm64-v8a/libfuai.so'
}
compileOptions {
@@ -138,7 +143,10 @@ android {
'Resources/*',
'Asset/*',
'image_effect_shaders/*',
- 'internal/*'
+ 'internal/*',
+ //美颜基础组件
+ 'model/ai_face_processor_lite.bundle',
+ 'graphics/face_beautification.bundle'
]))
}
}
@@ -200,9 +208,9 @@ android {
signingConfig signingConfigs.release
}
debug {
- minifyEnabled true
- shrinkResources true
- zipAlignEnabled true
+ minifyEnabled false
+ shrinkResources false
+ zipAlignEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
diff --git a/app/src/main/java/com/shayu/phonelive/AppContext.java b/app/src/main/java/com/shayu/phonelive/AppContext.java
index 9ad90e49c..6f01511ef 100644
--- a/app/src/main/java/com/shayu/phonelive/AppContext.java
+++ b/app/src/main/java/com/shayu/phonelive/AppContext.java
@@ -11,9 +11,9 @@ import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
+import android.os.Process;
import android.text.TextUtils;
import android.util.Log;
-import android.os.Process;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -26,6 +26,7 @@ import com.google.firebase.FirebaseApp;
import com.google.firebase.analytics.FirebaseAnalytics;
import com.google.firebase.crashlytics.FirebaseCrashlytics;
import com.shayu.phonelive.utils.LogUtils;
+import com.shayu.phonelive.utils.PluginManager;
import com.tencent.imsdk.v2.V2TIMGroupMemberInfo;
import com.tencent.imsdk.v2.V2TIMManager;
import com.tencent.imsdk.v2.V2TIMSimpleMsgListener;
@@ -248,6 +249,7 @@ public class AppContext extends CommonAppContext {
configSPApp();
//初始化美颜SDK
// FaceManager.initFaceUnity(this);
+ PluginManager.getInstance().loadAnchorPlugin();
}
/**
@@ -289,7 +291,7 @@ public class AppContext extends CommonAppContext {
.setMainCrashHandler((t, e) -> {
Log.e("ApplicationError", "主线程异常");//此处log只是展示,当debug为true时,主类内部log会打印异常信息
e.printStackTrace();
- AppManager.runDebugCode(()->{
+ AppManager.runDebugCode(() -> {
//闪退后finish所有Activity并且杀死进程
for (WeakReference activity : activities) {
if (activity != null && activity.get() != null) {
diff --git a/app/src/main/java/com/shayu/phonelive/utils/PluginManager.java b/app/src/main/java/com/shayu/phonelive/utils/PluginManager.java
new file mode 100644
index 000000000..0747df080
--- /dev/null
+++ b/app/src/main/java/com/shayu/phonelive/utils/PluginManager.java
@@ -0,0 +1,221 @@
+package com.shayu.phonelive.utils;
+
+import static com.yunbao.faceunity.utils.FURenderer.BUNDLE_AI_FACE;
+import static com.yunbao.faceunity.utils.FaceUnityConfig.BUNDLE_FACE_BEAUTIFICATION;
+
+import android.content.Context;
+import android.os.Build;
+import android.util.Log;
+
+import com.yunbao.common.CommonAppContext;
+import com.yunbao.common.utils.DownloadUtil;
+import com.yunbao.common.utils.StringUtil;
+import com.yunbao.faceunity.utils.FileUtils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.util.Arrays;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import dalvik.system.BaseDexClassLoader;
+import dalvik.system.DexClassLoader;
+import dalvik.system.PathClassLoader;
+
+/**
+ * 插件加载器
+ */
+public class PluginManager {
+ private static PluginManager manager;
+ private static final String TAG = "插件管理器";
+ private String anchorPluginDownloadUrl = "http://192.168.137.1:12345/shares/ce47aa99-3e73-4a79-8a2f-e17a2d527953";
+
+ private PluginManager() {
+ }
+
+ public static PluginManager getInstance() {
+ if (manager == null) {
+ manager = new PluginManager();
+ }
+ return manager;
+ }
+
+ /**
+ * 设置主播插件下载地址
+ */
+ public void setAnchorPluginDownloadUrl(String anchorPluginDownloadUrl) {
+ this.anchorPluginDownloadUrl = anchorPluginDownloadUrl;
+ }
+
+ /**
+ * 加载主播插件
+ */
+ public void loadAnchorPlugin() {
+ new Thread(() -> {
+ try {
+ if (Arrays.asList(CommonAppContext.sInstance.getAssets().list("")).contains("anchorPlugin.apk")) {
+ FileUtils.copyAssetsFile(CommonAppContext.sInstance,"anchorPlugin.apk","anchorPlugin.apk",CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download");
+ }
+ Log.d(TAG,"解压assets下的文件");
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ File sdk = new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download" + File.separator + "anchorPlugin.apk");
+ if (!sdk.exists()) {
+ if (StringUtil.isEmpty(anchorPluginDownloadUrl)) {
+ Log.e(TAG, "主播下载地址为空");
+ return;
+ }
+ downloadAnchorSdk();
+ return;
+ }
+ String outDir = CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin";
+ loadFaceSo(sdk, outDir);
+ loadFaceBundle(sdk, outDir);
+ getAnchorPluginVersion();
+ }).start();
+ }
+
+ /**
+ * 加载美颜so文件
+ *
+ * @param plugin 插件apk文件
+ * @param outDir 解压路径
+ */
+ private void loadFaceSo(File plugin, String outDir) {
+ unzip(plugin.getAbsolutePath(), outDir, ".so");
+ String[] abis = Build.SUPPORTED_ABIS;
+ String abi = Arrays.asList(abis).contains("arm64-v8a") ? "arm64-v8a" : "armeabi-v7a";
+ File plugins = new File(outDir + File.separator + "lib" + File.separator + abi);
+ loadSo(plugins, "libfuai");
+ loadSo(plugins, "libCNamaSDK");
+ }
+
+ /**
+ * 设置美颜Bundle文件
+ *
+ * @param plugin 插件apk文件
+ * @param outDir 解压路径
+ */
+ private void loadFaceBundle(File plugin, String outDir) {
+ unzip(plugin.getAbsolutePath(), outDir, ".bundle");
+ BUNDLE_AI_FACE = outDir + File.separator + "assets" + File.separator + BUNDLE_AI_FACE;
+ BUNDLE_FACE_BEAUTIFICATION = outDir + File.separator + "assets" + File.separator + BUNDLE_FACE_BEAUTIFICATION;
+ }
+
+ /**
+ * 加载指定so
+ *
+ * @param dir so文件路径
+ * @param file so文件名字
+ */
+ private void loadSo(File dir, String file) {
+ file += ".so";
+ if (new File(dir.getAbsolutePath() + File.separator + file).exists()) {
+ System.load(dir + File.separator + file);
+ Log.d(TAG, "加载成功 "+dir + File.separator + file );
+ } else {
+ Log.e(TAG, "不存在 "+dir + File.separator + file );
+ }
+ }
+
+ /**
+ * 下载主播插件包
+ */
+ private void downloadAnchorSdk() {
+ String downloadDir = new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download").getAbsolutePath();
+ new DownloadUtil().download("plugin", downloadDir, "anchorPlugin.apk", anchorPluginDownloadUrl, new DownloadUtil.Callback() {
+ @Override
+ public void onSuccess(File file) {
+ Log.d(TAG, "下载成功 "+file );
+ loadAnchorPlugin();
+ }
+
+ @Override
+ public void onProgress(int progress) {
+
+ }
+
+ @Override
+ public void onError(Throwable e) {
+
+ }
+ });
+ }
+
+ public String getAnchorPluginVersion() {
+ try {
+ File sdk = new File(CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + File.separator + "plugin_download" + File.separator + "anchorPlugin.apk");
+ DexClassLoader loader = new DexClassLoader(
+ sdk.getAbsolutePath(),
+ sdk.getParent(),
+ sdk.getParent(),
+ Context.class.getClassLoader());
+ Object version = loader.loadClass("com.pdlive.pluginsForAnchor.MainPlugin").getMethod("getVersion").invoke(null);
+ Log.i(TAG, "主播插件版本号:" + version);
+ return (String) version;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ /**
+ * 解压zip文件
+ *
+ * @param zip zip文件
+ * @param outDir 解压路径
+ * @param suffix 过滤
+ */
+ private boolean unzip(String zip, String outDir, String suffix) {
+ FileOutputStream out;
+ byte buffer[] = new byte[1024];
+ try {
+ ZipInputStream zis = new ZipInputStream(new FileInputStream(zip));
+ ZipEntry entry = zis.getNextEntry();
+ while (entry != null) {
+ String name = entry.getName();
+ if (entry.isDirectory()) {
+ File newDir = new File(outDir + entry.getName());
+ newDir.mkdir();
+ } else if (name.endsWith(suffix)) {
+ File outputFile = new File(outDir + File.separator + name);
+ String outputPath = outputFile.getCanonicalPath();
+ name = outputPath
+ .substring(outputPath.lastIndexOf("/") + 1);
+ outputPath = outputPath.substring(0, outputPath
+ .lastIndexOf("/"));
+ File outputDir = new File(outputPath);
+ outputDir.mkdirs();
+ outputFile = new File(outputPath, name);
+ outputFile.createNewFile();
+ out = new FileOutputStream(outputFile);
+
+ int tmp = 0;
+ while ((tmp = zis.read(buffer)) > 0) {
+ out.write(buffer, 0, tmp);
+ }
+ /* do {
+ tmp = zis.read(buffer);
+ if (tmp <= 0) {
+ break;
+ } else {
+ out.write(buffer, 0, tmp);
+ }
+ } while (true);*/
+ out.close();
+ }
+ entry = zis.getNextEntry();
+ }
+ zis.close();
+ return true;
+ } catch (IOException e) {
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+}
diff --git a/common/src/main/assets/anchorPlugin.apk b/common/src/main/assets/anchorPlugin.apk
new file mode 100644
index 000000000..7e2e8f75a
Binary files /dev/null and b/common/src/main/assets/anchorPlugin.apk differ
diff --git a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
index 50dad56d9..e68000a1b 100644
--- a/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
+++ b/common/src/main/java/com/yunbao/common/http/live/LiveNetManager.java
@@ -1264,6 +1264,7 @@ public class LiveNetManager {
callback.onSuccess(listResponseModel.getData().getInfo());
}
}, throwable -> {
+ throwable.printStackTrace();
if (callback != null) {
callback.onError(throwable.getMessage());
}
diff --git a/pluginsForAnchor/.gitignore b/pluginsForAnchor/.gitignore
new file mode 100644
index 000000000..42afabfd2
--- /dev/null
+++ b/pluginsForAnchor/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/pluginsForAnchor/build.gradle b/pluginsForAnchor/build.gradle
new file mode 100644
index 000000000..ef5b9896d
--- /dev/null
+++ b/pluginsForAnchor/build.gradle
@@ -0,0 +1,160 @@
+apply plugin: 'com.android.application'
+//apply plugin: 'com.android.library'
+
+
+android {
+ compileSdkVersion rootProject.ext.android.compileSdkVersion
+ buildToolsVersion rootProject.ext.android.buildToolsVersion
+ packagingOptions {
+ pickFirst "lib/armeabi/libyuvutils.so"
+ pickFirst "lib/arm64-v8a/libyuvutils.so"
+ pickFirst "lib/armeabi-v7a/libyuvutils.so"
+ pickFirst "lib/armeabi/libyuvtools.so"
+ pickFirst "lib/arm64-v8a/libyuvtools.so"
+ pickFirst "lib/armeabi-v7a/libyuvtools.so"
+ exclude "lib/arm64-v8a/libmmcv_api_handgesture.so"
+ exclude "lib/arm64-v8a/libmmcv_api_express.so"
+ exclude "lib/arm64-v8a/libMediaEncoder.so"
+ exclude "lib/arm64-v8a/libarcore_sdk_c.so"
+ exclude "lib/arm64-v8a/libmediadecoder.so"
+ exclude "lib/arm64-v8a/libMediaMuxer.so"
+ exclude "lib/arm64-v8a/libarcore_sdk_jni.so"
+ exclude "lib/arm64-v8a/libMediaUtils.so"
+ exclude "lib/arm64-v8a/libcosmosffmpeg.so"
+ //旧美颜so
+ exclude 'lib/arm64-v8a/libxeengine.so'
+ exclude 'lib/arm64-v8a/libmmcv_base.so'
+ exclude 'lib/arm64-v8a/libmmcrypto.so'
+ exclude 'lib/arm64-v8a/libMNN.so'
+ exclude 'lib/arm64-v8a/libc++_shared.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_base.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_beauty.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_bodylandmark.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_express.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_faceattributes.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_facefeatures.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_faceprocessor.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_facerecognition.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_handgesture.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_imagequality.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_objectdetect.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_segmentation.so'
+ exclude 'lib/arm64-v8a/libmmcv_api_videoprocessor.so'
+ exclude 'lib/arm64-v8a/libmmlic.so'
+ exclude 'lib/arm64-v8a/libMNN_CL.so'
+ exclude 'lib/arm64-v8a/libMNN_Express.so'
+ exclude 'lib/armeabi-v7a/libxeengine.so'
+ exclude 'lib/armeabi-v7a/libmmcv_base.so'
+ exclude 'lib/armeabi-v7a/libmmcrypto.so'
+ exclude 'lib/armeabi-v7a/libMNN.so'
+ exclude 'lib/armeabi-v7a/libc++_shared.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_base.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_beauty.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_bodylandmark.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_express.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_faceattributes.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_facefeatures.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_faceprocessor.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_facerecognition.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_handgesture.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_imagequality.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_objectdetect.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_segmentation.so'
+ exclude 'lib/armeabi-v7a/libmmcv_api_videoprocessor.so'
+ exclude 'lib/armeabi-v7a/libmmlic.so'
+ exclude 'lib/armeabi-v7a/libMNN_CL.so'
+ exclude 'lib/armeabi-v7a/libMNN_Express.so'
+
+ }
+ applicationVariants.all { variant ->
+ String variantName = variant.name.capitalize()
+ def processManifestTask = project.tasks.getByName("process${variantName}Manifest")
+ processManifestTask.doLast { pm ->
+ String manifestPath = "build/intermediates/bundle_manifest/release/bundle-manifest/AndroidManifest.xml"
+ def isGooglePlay = rootProject.ext.manifestPlaceholders.isGooglePlay
+ if (file(manifestPath).exists() && isGooglePlay) {
+ def manifestContent = file(manifestPath).getText()
+
+ manifestContent = manifestContent.replace('', '')
+ file(manifestPath).write(manifestContent)
+ } else {
+ print "not Exists = " + manifestPath
+ }
+ }
+ variant.mergeAssetsProvider.configure {
+ doLast {
+ delete(fileTree(dir: outputDir, includes: [
+ 'model/ai_bgseg_green.bundle',
+ 'model/ai_face_processor.bundle',
+ //'model/ai_face_processor_lite.bundle',
+ 'model/ai_hairseg.bundle',
+ 'model/ai_hand_processor.bundle',
+ 'model/ai_human_processor.bundle',
+ 'model/ai_human_processor_gpu.bundle',
+ 'model/ai_human_processor_mb_fast.bundle',
+ 'graphics/body_slim.bundle',
+ 'graphics/controller_cpp.bundle',
+ //'graphics/face_beautification.bundle',
+ 'graphics/face_makeup.bundle',
+ 'graphics/fuzzytoonfilter.bundle',
+ 'graphics/fxaa.bundle',
+ 'graphics/tongue.bundle',
+ //旧美颜
+ 'model-all.zip',
+ 'filterData.zip',
+ 'KSYResource/*',
+ 'Resources/*',
+ 'Asset/*',
+ 'image_effect_shaders/*',
+ 'internal/*',
+ ]))
+ }
+ }
+ }
+ defaultConfig {
+ applicationId "com.pdlive.plugins"
+ minSdkVersion rootProject.ext.android.minSdkVersion
+ targetSdkVersion rootProject.ext.android.targetSdkVersion
+ versionCode rootProject.ext.android.versionCode
+ versionName rootProject.ext.android.versionName
+ manifestPlaceholders = rootProject.ext.manifestPlaceholders
+ ndk {
+ abiFilters "armeabi-v7a", "arm64-v8a"
+ }
+ }
+ aaptOptions {
+ cruncherEnabled = false
+ useNewCruncher = false
+ }
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
+ }
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+ sourceSets {
+ main {
+ jniLibs.srcDirs = ['libs']
+ }
+ }
+
+}
+repositories {
+ flatDir {
+ dirs 'libs', '../libs'
+ }
+}
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+
+ implementation 'com.faceunity:core:8.3.1'
+ implementation 'com.faceunity:model:8.3.1'
+ //implementation 'com.faceunity:nama:8.3.1' //底层库-标准版
+
+
+}
diff --git a/pluginsForAnchor/proguard-rules.pro b/pluginsForAnchor/proguard-rules.pro
new file mode 100644
index 000000000..481bb4348
--- /dev/null
+++ b/pluginsForAnchor/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
\ No newline at end of file
diff --git a/pluginsForAnchor/src/main/AndroidManifest.xml b/pluginsForAnchor/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..8b45ca164
--- /dev/null
+++ b/pluginsForAnchor/src/main/AndroidManifest.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pluginsForAnchor/src/main/java/com/pdlive/pluginsForAnchor/MainPlugin.java b/pluginsForAnchor/src/main/java/com/pdlive/pluginsForAnchor/MainPlugin.java
new file mode 100644
index 000000000..7ac6f8cb8
--- /dev/null
+++ b/pluginsForAnchor/src/main/java/com/pdlive/pluginsForAnchor/MainPlugin.java
@@ -0,0 +1,9 @@
+package com.pdlive.pluginsForAnchor;
+
+public class MainPlugin {
+ private static final String Version = "1.0";
+
+ public static String getVersion() {
+ return Version;
+ }
+}
diff --git a/pluginsForAnchor/src/main/res/drawable-v24/ic_launcher_foreground.xml b/pluginsForAnchor/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 000000000..2b068d114
--- /dev/null
+++ b/pluginsForAnchor/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pluginsForAnchor/src/main/res/drawable/ic_launcher_background.xml b/pluginsForAnchor/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 000000000..07d5da9cb
--- /dev/null
+++ b/pluginsForAnchor/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/pluginsForAnchor/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/pluginsForAnchor/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 000000000..6f3b755bf
--- /dev/null
+++ b/pluginsForAnchor/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pluginsForAnchor/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/pluginsForAnchor/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 000000000..6f3b755bf
--- /dev/null
+++ b/pluginsForAnchor/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pluginsForAnchor/src/main/res/mipmap-hdpi/ic_launcher.webp b/pluginsForAnchor/src/main/res/mipmap-hdpi/ic_launcher.webp
new file mode 100644
index 000000000..c209e78ec
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-hdpi/ic_launcher.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-hdpi/ic_launcher_round.webp b/pluginsForAnchor/src/main/res/mipmap-hdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..b2dfe3d1b
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-hdpi/ic_launcher_round.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-mdpi/ic_launcher.webp b/pluginsForAnchor/src/main/res/mipmap-mdpi/ic_launcher.webp
new file mode 100644
index 000000000..4f0f1d64e
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-mdpi/ic_launcher.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-mdpi/ic_launcher_round.webp b/pluginsForAnchor/src/main/res/mipmap-mdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..62b611da0
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-mdpi/ic_launcher_round.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-xhdpi/ic_launcher.webp b/pluginsForAnchor/src/main/res/mipmap-xhdpi/ic_launcher.webp
new file mode 100644
index 000000000..948a3070f
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-xhdpi/ic_launcher.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-xhdpi/ic_launcher_round.webp b/pluginsForAnchor/src/main/res/mipmap-xhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..1b9a6956b
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-xhdpi/ic_launcher_round.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-xxhdpi/ic_launcher.webp b/pluginsForAnchor/src/main/res/mipmap-xxhdpi/ic_launcher.webp
new file mode 100644
index 000000000..28d4b77f9
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-xxhdpi/ic_launcher.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp b/pluginsForAnchor/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..9287f5083
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-xxhdpi/ic_launcher_round.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-xxxhdpi/ic_launcher.webp b/pluginsForAnchor/src/main/res/mipmap-xxxhdpi/ic_launcher.webp
new file mode 100644
index 000000000..aa7d6427e
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-xxxhdpi/ic_launcher.webp differ
diff --git a/pluginsForAnchor/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp b/pluginsForAnchor/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp
new file mode 100644
index 000000000..9126ae37c
Binary files /dev/null and b/pluginsForAnchor/src/main/res/mipmap-xxxhdpi/ic_launcher_round.webp differ
diff --git a/pluginsForAnchor/src/main/res/values/colors.xml b/pluginsForAnchor/src/main/res/values/colors.xml
new file mode 100644
index 000000000..f8c6127d3
--- /dev/null
+++ b/pluginsForAnchor/src/main/res/values/colors.xml
@@ -0,0 +1,10 @@
+
+
+ #FFBB86FC
+ #FF6200EE
+ #FF3700B3
+ #FF03DAC5
+ #FF018786
+ #FF000000
+ #FFFFFFFF
+
\ No newline at end of file
diff --git a/pluginsForAnchor/src/main/res/values/strings.xml b/pluginsForAnchor/src/main/res/values/strings.xml
new file mode 100644
index 000000000..814088626
--- /dev/null
+++ b/pluginsForAnchor/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ packageSdk
+
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
index e1b3b91be..1305f2842 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -2,4 +2,5 @@ include ':app', ':video', ':common', ':main', ':baidu', ':live', ':lib_country_
include ':FaceUnity'
//include ':baidu'
//include ':recognizer'//融云语音转文字模块
-include ':Share'
\ No newline at end of file
+include ':Share'
+include ':pluginsForAnchor'