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'