[6.6.0][崩溃统计] 优化崩溃文件上传及埋点上报逻辑

This commit is contained in:
renwj
2024-09-09 20:01:03 +08:00
parent 612e4795cd
commit 22f72abb0b
3 changed files with 125 additions and 55 deletions

View File

@@ -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 建议有流程

View File

@@ -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<String, String>?
): 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<String, String>?): 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))
}
}
}
}
}
}