[6.6.0][崩溃统计] 优化崩溃文件上传及埋点上报逻辑
This commit is contained in:
@@ -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 建议有流程
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -39,7 +39,7 @@ interface IDevaToolsProvider : IProvider {
|
||||
/**
|
||||
* 检查上传崩溃日志
|
||||
*/
|
||||
fun checkUploadCrashLog()
|
||||
// fun checkUploadCrashLog()
|
||||
|
||||
/**
|
||||
* App 业务记录 更新
|
||||
|
||||
Reference in New Issue
Block a user