From 22f72abb0b4fb8b090eb7e317c5d16d886f40323 Mon Sep 17 00:00:00 2001 From: renwj Date: Mon, 9 Sep 2024 20:01:03 +0800 Subject: [PATCH] =?UTF-8?q?[6.6.0][=E5=B4=A9=E6=BA=83=E7=BB=9F=E8=AE=A1]?= =?UTF-8?q?=20=E4=BC=98=E5=8C=96=E5=B4=A9=E6=BA=83=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E5=8F=8A=E5=9F=8B=E7=82=B9=E4=B8=8A=E6=8A=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DevaToolsProvider.kt | 56 ++++---- .../logcat/MoGoLogRecordProviderImpl.kt | 122 ++++++++++++++---- .../api/devatools/IDevaToolsProvider.kt | 2 +- 3 files changed, 125 insertions(+), 55 deletions(-) diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt index da07ba87a5..316ba7b6e8 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/DevaToolsProvider.kt @@ -237,34 +237,34 @@ class DevaToolsProvider : IDevaToolsProvider, IAppStateListener { /** * 检查上传崩溃日志 */ - override fun checkUploadCrashLog() { - mContext?.let { - val crashDir = File(it.getExternalFilesDir(null), "crash") - if(crashDir.exists() && crashDir.canExecute() && crashDir.listFiles()?.isNotEmpty() == true){ - it.lifeCycleScope.launch(Dispatchers.IO){ - val startTime = crashDir.lastModified() - 60*1000 - val endTime = if(System.currentTimeMillis() - crashDir.lastModified()>60*1000){ - crashDir.lastModified() + 60*1000 - }else{ - System.currentTimeMillis() - } - var isUploadSuccess = false - try { - MoGoLogRecordProviderImpl.isUploadExtraFile = false - CallerDevaToolsManager.logcat()?.upload(startTime, endTime) - isUploadSuccess = true - } catch (t: Throwable) { - t.printStackTrace() - } finally { - MoGoLogRecordProviderImpl.isUploadExtraFile = true - } - if(isUploadSuccess){ - crashDir.deleteRecursively() - } - } - } - } - } +// override fun checkUploadCrashLog() { +// mContext?.let { +// val crashDir = File(it.getExternalFilesDir(null), "crash") +// if(crashDir.exists() && crashDir.canExecute() && crashDir.listFiles()?.isNotEmpty() == true){ +// it.lifeCycleScope.launch(Dispatchers.IO){ +// val startTime = crashDir.lastModified() - 60*1000 +// val endTime = if(System.currentTimeMillis() - crashDir.lastModified()>60*1000){ +// crashDir.lastModified() + 60*1000 +// }else{ +// System.currentTimeMillis() +// } +// var isUploadSuccess = false +// try { +// MoGoLogRecordProviderImpl.isUploadExtraFile = false +// CallerDevaToolsManager.logcat()?.upload(startTime, endTime) +// isUploadSuccess = true +// } catch (t: Throwable) { +// t.printStackTrace() +// } finally { +// MoGoLogRecordProviderImpl.isUploadExtraFile = true +// } +// if(isUploadSuccess){ +// crashDir.deleteRecursively() +// } +// } +// } +// } +// } /** * 受channel业务影响的功能,需要更新,todo 建议有流程 diff --git a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt index 8cd84928dc..0bb516bc3e 100644 --- a/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt +++ b/core/function-impl/mogo-core-function-devatools/src/main/java/com/zhjt/mogo_core_function_devatools/logcat/MoGoLogRecordProviderImpl.kt @@ -27,8 +27,12 @@ import com.mogo.core.log.record.model.UploadError import com.mogo.eagle.core.data.app.AppConfigInfo import com.mogo.eagle.core.function.api.devatools.logcat.* import com.mogo.eagle.core.utilcode.download.DownloadUtils +import com.mogo.eagle.core.utilcode.util.ThreadUtils +import com.zhidao.cosupload.callback.CosStatusCallback +import com.zhidao.cosupload.callback.CosStatusCallbackManager +import com.zhidao.cosupload.model.CallbackData import com.zhidao.loglib.bean.RemoteLogPushContent -import com.zhjt.mogo_core_function_devatools.BuildConfig +import com.zhidao.loglib.upload.UploadManager import com.zhjt.mogo_core_function_devatools.logcat.checker.AnrLogChecker import com.zhjt.mogo_core_function_devatools.logcat.config.LogRecordConfig import com.zhjt.mogo_core_function_devatools.logcat.uploader.* @@ -37,6 +41,7 @@ import java.io.* import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit.MINUTES import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.atomic.AtomicInteger import java.util.concurrent.atomic.AtomicLong internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, @@ -142,7 +147,7 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, builder.crashConfig( CrashConfig.Builder() .enabled(true) - .uploader(CrashLogUploader(context)) + .uploader(CrashLogUploader()) .crashDir(File(context.getExternalFilesDir(null), "crash")) .expireDuration(TimeUnit.DAYS.toMillis(3)) .javaCrash(true) @@ -243,32 +248,97 @@ internal class MoGoLogRecordProviderImpl: IMoGoLogRecordProvider, SystemClock.sleep(15000) } - private class CrashLogUploader(private val mContext: Context): ICrashFileUploader { + private class CrashLogUploader : ICrashFileUploader { - override suspend fun upload( - type: CrashType, - crashTime: String, - file: File, - extra: Map? - ): Boolean { - try { - val keyMessage = when(type) { - JavaCrash -> extra?.get("java stacktrace") ?: extra?.get("backtrace") ?: "#" - NativeCrash -> extra?.get("backtrace") ?: "#" - ANRCrash -> extra?.get("backtrace") ?: "#" - } - val typeStr = when(type){ - JavaCrash -> "JavaCrash" - NativeCrash -> "NativeCrash" - ANRCrash -> "ANRCrash" - } - CrashLogAnalyticsManager.crashLogAnalytics(typeStr,keyMessage) - return true - } catch (t: Throwable) { - return false - } + companion object { + private const val TAG = "CrashLogUploader" } - } + override suspend fun upload(type: CrashType, crashTime: String, file: File, extra: Map?): Boolean = suspendCancellableCoroutine { + val isStartUpload = AtomicBoolean(false) + val isInvoked = AtomicBoolean(false) + val retry = AtomicInteger(0) + CosStatusCallbackManager.getInstance().register(object : CosStatusCallback { + override fun onStartUpload(data: CallbackData?) { + if (data?.localPath == file.absolutePath) { + isStartUpload.set(true) + Log.d(TAG, "---- onStartUpload ---: $data") + } + } + override fun uploadCosCompleted(data: CallbackData?) { + if (data?.localPath == file.absolutePath && isInvoked.compareAndSet(false, true)) { + try { + isStartUpload.set(true) + Log.d(TAG, "---- uploadCosCompleted ---: $data") + CosStatusCallbackManager.getInstance().unregister(this) + } finally { + try { + val keyMessage = when (type) { + JavaCrash -> extra?.get("java stacktrace") ?: extra?.get("backtrace") ?: "#" + NativeCrash -> extra?.get("backtrace") ?: "#" + ANRCrash -> extra?.get("backtrace") ?: "#" + } + val typeStr = when (type) { + JavaCrash -> "JavaCrash" + NativeCrash -> "NativeCrash" + ANRCrash -> "ANRCrash" + } + CrashLogAnalyticsManager.crashLogAnalytics(typeStr, keyMessage) + } catch (e: Throwable) { + e.printStackTrace() + } finally { + it.resumeWith(Result.success(true)) + } + } + } + } + + override fun uploadCosFailed(data: CallbackData?) { + if (data?.localPath == file.absolutePath && isInvoked.compareAndSet(false, true)) { + try { + Log.d(TAG, "---- uploadCosFailed ---: $data") + isStartUpload.set(true) + CosStatusCallbackManager.getInstance().unregister(this) + } finally { + it.resumeWith(Result.failure(IllegalStateException(data?.exception ?: "上传崩溃文件失败"))) + } + } + } + + override fun onProgress(data: CallbackData?) { + if (data?.localPath == file.absolutePath) { + isStartUpload.set(true) + Log.d(TAG, "---- onProgress ---: $data") + } + } + }) + ThreadUtils.getIoPool().execute { + try { + while (retry.get() < 3 && !isStartUpload.get()) { + try { + Log.d(TAG, "---- 上传开始 ---: ${retry.get()}") + UploadManager.getInstance().uploadSingleFile(file.absolutePath) + } catch (t: Throwable) { + t.printStackTrace() + } + SystemClock.sleep(5000) + retry.addAndGet(1) + } + if (!isStartUpload.get() && isInvoked.compareAndSet(false, true)) { + it.resumeWith(Result.failure(IllegalStateException("重试3次,还没有开始上传, 真无语..."))) + return@execute + } + if (retry.get() > 3 && isInvoked.compareAndSet(false, true)) { + it.resumeWith(Result.failure(IllegalStateException("重试3次,没有收到结果回调,真无语..."))) + return@execute + } + } catch (t: Throwable) { + if (isInvoked.compareAndSet(false, true)) { + it.resumeWith(Result.failure(t)) + } + } + } + } + } } \ No newline at end of file diff --git a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt index 84c6925145..5aa6d9b394 100644 --- a/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt +++ b/core/mogo-core-function-api/src/main/java/com/mogo/eagle/core/function/api/devatools/IDevaToolsProvider.kt @@ -39,7 +39,7 @@ interface IDevaToolsProvider : IProvider { /** * 检查上传崩溃日志 */ - fun checkUploadCrashLog() +// fun checkUploadCrashLog() /** * App 业务记录 更新