diff --git a/app/src/main/java/com/shayu/phonelive/AppContext.java b/app/src/main/java/com/shayu/phonelive/AppContext.java index 4ebddbfce..3e51613d4 100644 --- a/app/src/main/java/com/shayu/phonelive/AppContext.java +++ b/app/src/main/java/com/shayu/phonelive/AppContext.java @@ -26,13 +26,10 @@ import com.facebook.appevents.AppEventsLogger; import com.fm.openinstall.OpenInstall; import com.google.gson.Gson; import com.pdlive.lib_so.DynamicSoLauncher; -import com.yunbao.common.utils.LogUtils; import com.tencent.imsdk.v2.V2TIMGroupMemberInfo; import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMSimpleMsgListener; import com.tencent.imsdk.v2.V2TIMUserInfo; -import com.yunbao.common.manager.OpenAdManager; -import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.BuildConfig; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; @@ -40,6 +37,7 @@ import com.yunbao.common.Constants; import com.yunbao.common.bean.AnchorStartLiveBean; import com.yunbao.common.bean.CrashSaveBean; import com.yunbao.common.event.SudGameSocketImEvent; +import com.yunbao.common.manager.OpenAdManager; import com.yunbao.common.manager.imrongcloud.InstructorSendReward; import com.yunbao.common.manager.imrongcloud.InstructorSendRewardProvider; import com.yunbao.common.manager.imrongcloud.MessageIMManager; @@ -49,6 +47,9 @@ import com.yunbao.common.utils.AppManager; import com.yunbao.common.utils.Bus; import com.yunbao.common.utils.GoogleUtils; import com.yunbao.common.utils.L; +import com.yunbao.common.utils.LoadSoUtil; +import com.yunbao.common.utils.LogUtils; +import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.utils.SpUtil; import com.yunbao.live.socket.SocketReceiveBean; import com.yunbao.live.socket.SocketRyClient; @@ -145,11 +146,11 @@ public class AppContext extends CommonAppContext { if (!isMainProcess()) { return; } - String path = getFilesDir().getAbsolutePath() + "/dynamic_so/"; + //如果第三方的SDK自己不支持动态加载so文件时,需要自己主动加载so + String path = LoadSoUtil.so_path + "/"; File file = new File(path); if (!file.exists()) { - boolean b= file.mkdir(); - Log.i("mLog","创建文件 "+b); + file.mkdir(); } // 在合适的时候将自定义路径插入so检索路径 需要使用者自己负责在这个路径上有写入权限 DynamicSoLauncher.INSTANCE.initDynamicSoConfig(this, path, s -> { diff --git a/common/build.gradle b/common/build.gradle index 45d76daee..5dc5923e8 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -82,6 +82,7 @@ repositories { dependencies { + implementation project(':lib_so') annotationProcessor rootProject.ext.dependencies["arouter-compiler"] implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar']) api files('libs/jcc-bate-0.7.3.jar') diff --git a/common/src/main/java/com/yunbao/common/utils/LoadSoUtil.java b/common/src/main/java/com/yunbao/common/utils/LoadSoUtil.java index 470bd8a60..3a6e5771b 100644 --- a/common/src/main/java/com/yunbao/common/utils/LoadSoUtil.java +++ b/common/src/main/java/com/yunbao/common/utils/LoadSoUtil.java @@ -1,9 +1,11 @@ package com.yunbao.common.utils; import android.content.Context; -import android.content.res.AssetManager; import android.util.Log; +import com.pdlive.lib_so.DynamicSoLauncher; +import com.yunbao.common.CommonAppContext; + import org.jetbrains.annotations.NotNull; import java.io.BufferedOutputStream; @@ -30,41 +32,24 @@ import okhttp3.Response; public class LoadSoUtil { - public static void loadSo(Context context, onLoadSoListener listener) { - try { - String path = context.getFilesDir().getAbsolutePath() + "/dynamic_so"; - File file = new File(path); - AssetManager assetManager = context.getAssets(); - String[] files = assetManager.list("libso"); - if (!file.exists()) { - boolean b = file.mkdir(); - Log.i("mLog", "创建文件 " + b); - } - if (file.listFiles().length != files.length) {//说明之前已经保存了 - file.delete(); - file.mkdir(); - Log.i("mLog", "需要拷贝so文件 "); - // 获取AssetManager对象 - for (int i = 0; i < files.length; i++) { - loadLibrary(context, "libso/" + files[i], files[i]); - } - } - listener.ok(); - Log.i("mLog", "拷贝so成功------------------------"); - } catch (IOException e) { - Log.e("mLog", "拷贝so错误++++++++++++++++++++"); - e.printStackTrace(); - listener.error(); - } - } + //so保存的路径 + public static final String so_path = CommonAppContext.sInstance.getFilesDir().getAbsolutePath() + "/" + LoadSoUtil.so_path; - public static void loadSo2(Context context, onLoadSoListener listener) { + /** + * 先加载so文件,再去做初始化的操作 + * 1.正常的流程,判断手机的类型 加载不同的so(SUPPORTED_ABIS[0].contains("64"),代码中还未实现 ) + * 2.通过不同的url去下载对应的so的zip文件 + * 3.解压zip到指定位置 + * 4.加载解压完成的so文件 + */ + public static void downloadSoAndLoad(Context context, onLoadSoListener listener) { + //检查本地是否创建了zip的缓存文件 String path = context.getFilesDir().getAbsolutePath() + "/so_zip"; File file = new File(path); if (!file.exists()) { file.mkdir(); - } else if (isLoadSo(context)) { - listener.ok(); + } else if (isLoadSo()) {//这里去验证so文件是否已经下载过了 + loadSo(listener); return; } OkHttpClient.Builder builder = new OkHttpClient.Builder() @@ -92,7 +77,7 @@ public class LoadSoUtil { @Override public void ok() { //下载完成开始解压 解压完成之后 区初始化声网数据 - zip(context, path + "/" + "libSo.zip", listener); + zip(path + "/" + "libSo.zip", listener); } @Override @@ -102,13 +87,16 @@ public class LoadSoUtil { }); } - private static void zip(Context context, String path, onLoadSoListener listener) { + /** + * 下载完成解压zip文件 + */ + private static void zip(String path, onLoadSoListener listener) { ZipInputStream zis = null; FileOutputStream fos = null; try { zis = new ZipInputStream(new FileInputStream(path)); ZipEntry ze; - String soPath = context.getFilesDir().getAbsolutePath() + "/dynamic_so"; + String soPath = so_path; File file = new File(soPath); if (!file.exists()) { file.mkdir(); @@ -125,7 +113,7 @@ public class LoadSoUtil { fos.close(); zis.closeEntry(); } - listener.ok(); + loadSo(listener); } catch (IOException e) { e.printStackTrace(); listener.error(); @@ -138,6 +126,10 @@ public class LoadSoUtil { } } + /** + * 去下载so的zip文件 + * 可以在下载之前去做zip是否已经下载的验证,还可以根据版本做区分(是否是最新版本,要不要做断点续传) + */ private static void downloadFile(OkHttpClient mOkHttpClient, String url, File file, onLoadSoListener listener) { Request request = new Request.Builder() .get() @@ -181,9 +173,11 @@ public class LoadSoUtil { }); } - public static boolean isLoadSo(Context context) { - String pathSo = context.getFilesDir().getAbsolutePath() + "/dynamic_so"; - File fileSo = new File(pathSo); + public static boolean isLoadSo() { + File fileSo = new File(so_path); + if (!fileSo.exists()) { + fileSo.mkdir(); + } if (fileSo.listFiles().length == 22) {//说明之前已经保存了 Log.i("mLog", "已经下载了so 所有直接加载就行 "); return true; @@ -191,44 +185,19 @@ public class LoadSoUtil { return false; } - public static boolean loadLibrary(Context context, String oldFileName, String libName) throws IOException { - // 获取应用的私有模式的libs目录(真实的目录是app-libs) - String path = context.getFilesDir().getAbsolutePath() + "/dynamic_so/"; - // 可以获取到assets资源文件的数据流 - InputStream open = context.getAssets().open(oldFileName); - String new_file_name = path + libName; - // 把资源文件的数据流写入到app-libs目录下 - if (!copyLibrary(open, new_file_name)) { - return false; + /** + * 调用自己实现的加载so的方式 + */ + public static void loadSo(onLoadSoListener listener) { + File fileSo = new File(so_path); + if (!fileSo.exists()) { + fileSo.mkdir(); } - return true; - } - - //从assets资源目录下复制到app-libs目录下 - public static boolean copyLibrary(InputStream fileInputStream, String new_file) { - FileOutputStream fos = null; - try { - File file = new File(new_file); - fos = new FileOutputStream(file); - int dataSize; - byte[] dataBuffer = new byte[2048]; - - while ((dataSize = fileInputStream.read(dataBuffer)) != -1) { - fos.write(dataBuffer, 0, dataSize); - } - fos.flush(); - return true; - } catch (Exception e) { - e.printStackTrace(); - Log.e("mLog", e.getMessage()); - } finally { - try { - if (fos != null) fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } + File file[] = fileSo.listFiles(); + for (int i = 0; i < file.length; i++) { + DynamicSoLauncher.INSTANCE.loadSoDynamically(file[i]); } - return false; + listener.ok(); } public interface onLoadSoListener { diff --git a/lib_faceunity/src/main/java/io/agora/beautyapi/faceunity/agora/SWAuManager.java b/lib_faceunity/src/main/java/io/agora/beautyapi/faceunity/agora/SWAuManager.java index 82e8721a4..e872c9389 100644 --- a/lib_faceunity/src/main/java/io/agora/beautyapi/faceunity/agora/SWAuManager.java +++ b/lib_faceunity/src/main/java/io/agora/beautyapi/faceunity/agora/SWAuManager.java @@ -2,33 +2,16 @@ package io.agora.beautyapi.faceunity.agora; import android.app.Activity; import android.content.Context; -import android.opengl.EGL14; -import android.opengl.EGLConfig; -import android.opengl.EGLContext; -import android.opengl.EGLDisplay; -import android.opengl.EGLSurface; -import android.opengl.GLES20; -import android.util.Log; -import android.view.Surface; import android.view.TextureView; import android.view.View; import android.widget.FrameLayout; - import com.yunbao.common.CommonAppConfig; import com.yunbao.common.CommonAppContext; -import com.yunbao.common.bean.BaseModel; import com.yunbao.common.bean.LiveBean; -import com.yunbao.common.bean.UserBean; -import com.yunbao.common.http.API; -import com.yunbao.common.http.ResponseModel; -import com.yunbao.common.manager.MicUserManager; -import com.yunbao.common.manager.MicedUserManager; import com.yunbao.common.manager.base.BaseCacheManager; -import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; import com.yunbao.common.utils.L; import com.yunbao.common.utils.StringUtil; -import com.yunbao.common.utils.ToastUtil; import java.util.ArrayList; import java.util.List; @@ -40,15 +23,6 @@ import io.agora.rtc2.RtcConnection; import io.agora.rtc2.RtcEngineConfig; import io.agora.rtc2.RtcEngineEx; import io.agora.rtc2.video.VideoCanvas; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.functions.Consumer; -import io.reactivex.schedulers.Schedulers; -import io.rong.imkit.IMCenter; -import io.rong.imlib.IRongCallback; -import io.rong.imlib.RongIMClient; -import io.rong.imlib.model.Conversation; -import io.rong.imlib.model.Message; -import io.rong.message.TextMessage; /** * 声网主播管理类 @@ -115,7 +89,6 @@ public class SWAuManager extends BaseCacheManager { config.mContext = mContext; config.mAppId = CommonAppConfig.getSwAppId(); config.mEventHandler = mRtcEventHandler; - config.mNativeLibPath=mContext.getFilesDir().getAbsolutePath() + "/dynamic_so/"; // 创建并初始化 RtcEngine mRtcEngine = (RtcEngineEx) RtcEngineEx.create(config); } catch (Exception e) { diff --git a/main/src/main/java/com/yunbao/main/activity/MainActivity.java b/main/src/main/java/com/yunbao/main/activity/MainActivity.java index daa322b30..28e922fec 100644 --- a/main/src/main/java/com/yunbao/main/activity/MainActivity.java +++ b/main/src/main/java/com/yunbao/main/activity/MainActivity.java @@ -51,11 +51,6 @@ import com.tencent.imsdk.v2.V2TIMManager; import com.tencent.imsdk.v2.V2TIMSDKConfig; import com.tencent.imsdk.v2.V2TIMSDKListener; import com.tencent.imsdk.v2.V2TIMUserFullInfo; -import com.yunbao.common.bean.QiniuLog; -import com.yunbao.common.glide.ImgLoader; -import com.yunbao.common.utils.AppManager; -import com.yunbao.common.utils.LogUtil; -import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.CommonAppConfig; import com.yunbao.common.Constants; import com.yunbao.common.activity.AbsActivity; @@ -68,6 +63,7 @@ import com.yunbao.common.bean.ConfigBean; import com.yunbao.common.bean.IMLoginModel; import com.yunbao.common.bean.LiveBean; import com.yunbao.common.bean.LiveSvgGiftBean; +import com.yunbao.common.bean.QiniuLog; import com.yunbao.common.bean.SwTokenModel; import com.yunbao.common.bean.UpdataListBean; import com.yunbao.common.bean.UserBean; @@ -84,6 +80,7 @@ import com.yunbao.common.event.NoviceInstructorEvent; import com.yunbao.common.event.RongIMConnectionStatusEvent; import com.yunbao.common.event.SudGameUserEvent; import com.yunbao.common.event.UpdateTablePointMe; +import com.yunbao.common.glide.ImgLoader; import com.yunbao.common.http.CommonHttpConsts; import com.yunbao.common.http.CommonHttpUtil; import com.yunbao.common.http.HttpCallback; @@ -97,12 +94,16 @@ import com.yunbao.common.manager.IMLoginManager; import com.yunbao.common.manager.NoviceInstructorManager; import com.yunbao.common.manager.OpenAdManager; import com.yunbao.common.manager.imrongcloud.RongcloudIMManager; +import com.yunbao.common.utils.AppManager; import com.yunbao.common.utils.DialogUitl; import com.yunbao.common.utils.DpUtil; import com.yunbao.common.utils.GiftCacheUtil; import com.yunbao.common.utils.GoogleUtils; import com.yunbao.common.utils.LiveRoomCheckLivePresenter; +import com.yunbao.common.utils.LoadSoUtil; import com.yunbao.common.utils.LocationUtil; +import com.yunbao.common.utils.LogUtil; +import com.yunbao.common.utils.MobclickAgent; import com.yunbao.common.utils.ProcessResultUtil; import com.yunbao.common.utils.RouteUtil; import com.yunbao.common.utils.SpUtil; @@ -225,16 +226,14 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene OpenAdManager.getInstance().dismiss(); } - public static boolean isLoadSo=false; + public static boolean isLoadSo = false; @Override protected void main() { //初始化声网 - String path = getFilesDir().getAbsolutePath() + "/dynamic_so"; - File file = new File(path); - if (file.listFiles().length==22){ + if (LoadSoUtil.isLoadSo()) { //说明已经有了可以直接初始化 - isLoadSo=true; + isLoadSo = true; SWAuManager.get().initRtcEngine(this); } ActivityCompat.postponeEnterTransition(this); @@ -288,8 +287,8 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk,boolean isSw) { - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal),isSw); + public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk, boolean isSw) { + RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal), isSw); } @Override @@ -503,8 +502,8 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene LiveBean liveBean = JSON.parseObject(info[0], LiveBean.class); new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk,boolean isSw) { - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal),isSw); + public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk, boolean isSw) { + RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal), isSw); } @Override @@ -877,12 +876,12 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene @Override public void onError(RongIMClient.ConnectionErrorCode e) { - ToastUtil.show(R.string.net_error+""+e.toString()); + ToastUtil.show(R.string.net_error + "" + e.toString()); } @Override public void onDatabaseOpened(RongIMClient.DatabaseOpenStatus code) { - ToastUtil.show(R.string.net_error+""+code); + ToastUtil.show(R.string.net_error + "" + code); } }); @@ -1168,9 +1167,9 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene public void watchLive(LiveBean liveBean, String key, int position) { new LiveRoomCheckLivePresenter(mContext, liveBean.getUid(), liveBean.getStream(), new LiveRoomCheckLivePresenter.NewActionListener() { @Override - public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk,boolean isSw) { + public void onLiveRoomChanged(String liveUid, String stream, int liveType, String liveTypeVal, String liveSdk, boolean isSw) { MobclickAgent.onEvent(mContext, "home_page_enter_room", "首页点击直播间"); - RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal),isSw); + RouteUtil.forwardLiveAudienceActivity(liveBean, liveType, Integer.parseInt(liveSdk), Integer.parseInt(liveTypeVal), isSw); } @Override @@ -1606,7 +1605,7 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene @Subscribe(threadMode = ThreadMode.MAIN) public void onLiveFloatEvent(LiveFloatEvent event) { if (event != null && event.getmLiveBean() != null && !TextUtils.isEmpty(event.getmLiveBean().getPull())) { - new Handler().post(() -> LiveFloatView.getInstance().cacheLiveData(event.getmLiveBean(), event.getmLiveType(), event.getmLiveSDK() ==Constants.LIVE_SDK_SW, event.getmLiveTypeVal()).builderFloat(mContext, event.getmLiveBean().getPull(), LiveAudienceActivity.class)); + new Handler().post(() -> LiveFloatView.getInstance().cacheLiveData(event.getmLiveBean(), event.getmLiveType(), event.getmLiveSDK() == Constants.LIVE_SDK_SW, event.getmLiveTypeVal()).builderFloat(mContext, event.getmLiveBean().getPull(), LiveAudienceActivity.class)); } } @@ -1656,12 +1655,13 @@ public class MainActivity extends AbsActivity implements MainAppBarLayoutListene }); } - private void initLogUpdate(){ + + private void initLogUpdate() { LiveNetManager.get(mContext) .getLogUpdateStatus("1", new com.yunbao.common.http.base.HttpCallback() { @Override public void onSuccess(QiniuLog data) { - if(data.getLog_type()==1){ + if (data.getLog_type() == 1) { LogUtil.shareFile(mContext); } } diff --git a/main/src/main/java/com/yunbao/main/views/MainHomeLiveViewHolder.java b/main/src/main/java/com/yunbao/main/views/MainHomeLiveViewHolder.java index 17bab88e9..f1f0839a4 100644 --- a/main/src/main/java/com/yunbao/main/views/MainHomeLiveViewHolder.java +++ b/main/src/main/java/com/yunbao/main/views/MainHomeLiveViewHolder.java @@ -492,7 +492,7 @@ public class MainHomeLiveViewHolder extends AbsMainHomeChildViewHolder implement onItemClick2(bean, position); } else { Toast.makeText(mContext, "正在下载so文件,请稍后。。。", Toast.LENGTH_LONG).show(); - LoadSoUtil.loadSo2(mContext, new LoadSoUtil.onLoadSoListener() { + LoadSoUtil.downloadSoAndLoad(mContext, new LoadSoUtil.onLoadSoListener() { @Override public void ok() { MainActivity.isLoadSo = true; diff --git a/settings.gradle b/settings.gradle index 34a8bd36b..7aad7ab21 100644 --- a/settings.gradle +++ b/settings.gradle @@ -9,4 +9,3 @@ include ':lib_google' include ':IAP6Helper' include ':lib_faceunity' include ':lib_so' -include ':lib_so'