[2.15.0][增量升级] 优化下载过程中的逻辑

This commit is contained in:
renwj
2023-04-14 11:02:54 +08:00
parent 5e7fa79828
commit 660413439d
5 changed files with 75 additions and 108 deletions

View File

@@ -60,11 +60,7 @@ class UpgradeAppNetWorkManager private constructor() {
provider?.recordUpgradeRecord(sn ?: "", macAddress, type, FunctionBuildConfig.isSupportPatchUpgrade)
provider?.recordUpgradeRequestStart()
val info = mUpgradeApiService.getUpgradeInfo(requestBody)
if (info != null) {
SharedPrefsMgr.getInstance(context!!).putString(SharedPrefsConstants.APP_UPGRADE_CONTENT, if (info.result != null) GsonUtils.toJson(info) + "--mac:$macAddress --type:$type --sn:$sn --versionName:$versionName" else "info.result == null --mac:$macAddress --type:$type --sn:$sn --versionName:$versionName")
} else {
SharedPrefsMgr.getInstance(context!!).putString(SharedPrefsConstants.APP_UPGRADE_CONTENT, "info == null --mac:$macAddress --type:$type --sn:$sn --versionName:$versionName")
}
SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.APP_UPGRADE_CONTENT, if (info.result != null) GsonUtils.toJson(info) + "--mac:$macAddress --type:$type --sn:$sn --versionName:$versionName" else "info.result == null --mac:$macAddress --type:$type --sn:$sn --versionName:$versionName")
if (info.result != null) {
provider?.recordUpgradeRequestSuccess(GsonUtils.toJson(info))
doUpgrade(info)
@@ -73,7 +69,7 @@ class UpgradeAppNetWorkManager private constructor() {
}
} catch (t: Throwable) {
t.printStackTrace()
SharedPrefsMgr.getInstance(context!!).putString(SharedPrefsConstants.APP_UPGRADE_CONTENT,
SharedPrefsMgr.getInstance(context).putString(SharedPrefsConstants.APP_UPGRADE_CONTENT,
"$t--mac:$macAddress --type:$type --sn:$sn "
)
provider?.recordUpgradeRequestFailed(t.message ?: "更新接口请求失败")
@@ -118,6 +114,7 @@ class UpgradeAppNetWorkManager private constructor() {
}
}
if (isGoFullUpgrade) {
Log.d("ApkInstaller", "走全量升级 --- 1 ----")
provider?.recordUpgradeRecord(info.result.versionName, null, 0)
}
withContext(Dispatchers.Main) {

View File

@@ -41,14 +41,14 @@ class UpgradeManager : IDownload {
}
}
private var map: Map<String, String>? = null
private val upgradeProvider: IMoGoUpgradeProvider? by lazy { CallerBase.getApiInstance(IMoGoUpgradeProvider::class.java, MogoServicePaths.PATH_UPGRADE_TYPE_API) }
private val types by lazy { ConcurrentHashMap<String, DownloadType>() }
fun upgradeProvider(): IMoGoUpgradeProvider? = upgradeProvider
internal fun upgradeProvider(): IMoGoUpgradeProvider? = upgradeProvider
private val scope by lazy { CoroutineScope(Dispatchers.IO + SupervisorJob()) }
fun downLoadPackage(context: Context, type: DownloadType, downloadKey: String, downloadUrl: String) {
@@ -67,16 +67,10 @@ class UpgradeManager : IDownload {
override fun onStart(downloadUrl: String?) {
CallerLogger.d("$M_DEVA$TAG","onStart downloadUrl : $downloadUrl")
if (downloadUrl != null) {
if (map.isNullOrEmpty()) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeStart(downloadUrl)
} else {
findKey(downloadUrl) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeStart(it)
}
}
CallerDevaToolsUpgradeListenerManager.invokeUpgradeStart(downloadUrl)
val type = types[downloadUrl]
if (type == PATCH || type == APK) {
runBlocking {
scope.launch {
CallerDevaToolsManager.upgradeProvider()?.recordDownloadStart(downloadUrl)
}
}
@@ -86,11 +80,11 @@ class UpgradeManager : IDownload {
override fun onPause(downloadUrl: String?, threadBean: ThreadBean?) {
CallerLogger.d("$M_DEVA$TAG","onPause downloadUrl : $downloadUrl , threadBean : $threadBean")
if (downloadUrl != null) {
if (map.isNullOrEmpty()) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradePause(downloadUrl)
} else {
findKey(downloadUrl) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradePause(it)
CallerDevaToolsUpgradeListenerManager.invokeUpgradePause(downloadUrl)
val type = types[downloadUrl]
if (type == PATCH || type == APK) {
scope.launch {
CallerDevaToolsManager.upgradeProvider()?.recordDownloadPause(downloadUrl)
}
}
}
@@ -99,23 +93,22 @@ class UpgradeManager : IDownload {
override fun onProgress(downloadUrl: String?, length: Int) {
CallerLogger.d("$M_DEVA$TAG"," onProgress downloadUrl : $downloadUrl , length : $length")
if (downloadUrl != null) {
if (map.isNullOrEmpty()) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeProgress(downloadUrl, length)
} else {
findKey(downloadUrl) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeProgress(downloadUrl, length)
}
}
CallerDevaToolsUpgradeListenerManager.invokeUpgradeProgress(downloadUrl, length)
}
}
override fun onFinished(downloadUrl: String?, threadBean: ThreadBean?, localPath: String) {
if (downloadUrl != null) {
if (downloadUrl == null) {
return
}
doOnFinished(downloadUrl, localPath)
}
private fun doOnFinished(downloadUrl: String, localPath: String) {
scope.launch {
val type = types[downloadUrl]
if (type == APK || type == PATCH) {
runBlocking {
upgradeProvider?.recordDownloadSuccess(downloadUrl)
}
upgradeProvider?.recordDownloadSuccess(downloadUrl)
val patchInfo = CallerPatchManager.getPatchInfoByUrl(downloadUrl)
if (patchInfo != null) {
var isPatchInstallFailed = false
@@ -141,49 +134,41 @@ class UpgradeManager : IDownload {
} catch (t: Throwable) {
t.printStackTrace()
}
runBlocking {
upgradeProvider?.recordInstallApplyPatchStart()
}
upgradeProvider?.recordInstallApplyPatchStart()
var ret = CallerPatchManager.applyPatch(Utils.getApp(), patch, newApk)
if (!ret) {
runBlocking {
upgradeProvider?.recordInstallApplyPatchFailed("合成patch失败")
}
upgradeProvider?.recordInstallApplyPatchFailed("合成patch失败")
Logger.w(TAG, "合成patch失败...")
throw AssertionError("合成patch失败...")
} else {
runBlocking {
upgradeProvider?.recordInstallApplyPatchSuccess()
upgradeProvider?.recordTargetMd5CheckStart()
}
upgradeProvider?.recordInstallApplyPatchSuccess()
upgradeProvider?.recordTargetMd5CheckStart()
ret = CallerPatchManager.checkMd5ForMergedApk(Utils.getApp(), newApk, patchInfo.targetMd5)
if (!ret) {
runBlocking {
upgradeProvider?.recordTargetMd5CheckFailed("合成后的apk的md5与服务端上的目标版本的md5不一致:[server_target_md5: ${patchInfo.targetMd5}, merged_md5: ${Md5Util.getMd5FromFile(newApk)}]")
}
upgradeProvider?.recordTargetMd5CheckFailed("合成后的apk的md5与服务端上的目标版本的md5不一致:[server_target_md5: ${patchInfo.targetMd5}, merged_md5: ${Md5Util.getMd5FromFile(newApk)}]")
Logger.w(TAG, "md5校验失败...")
throw AssertionError("md5校验失败:[target:${patchInfo.targetMd5}]")
} else {
Logger.w(TAG, "md5校验成功...")
runBlocking {
upgradeProvider?.recordTargetMd5CheckSuccess()
upgradeProvider?.recordInstallStart()
}
ApkInstaller.installApp(Utils.getApp(), newApk) { code, reason ->
if (code != PackageInstaller.STATUS_SUCCESS) {
upgradeProvider?.also {
try {
newApk.delete()
} catch (t: Throwable) {
t.printStackTrace()
}
try {
patch.delete()
} catch (t: Throwable) {
t.printStackTrace()
}
runBlocking {
it.recordInstallFailed(code, reason)
upgradeProvider?.recordTargetMd5CheckSuccess()
upgradeProvider?.recordInstallStart()
withContext(Dispatchers.Main) {
ApkInstaller.installApp(Utils.getApp(), newApk) { code, reason ->
if (code != PackageInstaller.STATUS_SUCCESS) {
upgradeProvider?.also {
try {
newApk.delete()
} catch (t: Throwable) {
t.printStackTrace()
}
try {
patch.delete()
} catch (t: Throwable) {
t.printStackTrace()
}
scope.launch {
it.recordInstallFailed(code, reason)
}
}
}
}
@@ -202,65 +187,37 @@ class UpgradeManager : IDownload {
}
if (isPatchInstallFailed) {
runBlocking {
CallerDevaToolsManager.upgradeProvider()?.recordInstallFailed(ApkInstaller.INSTALL_CODE_INVALID, patchInstallFailedReason)
}
upgradeProvider?.recordInstallFailed(ApkInstaller.INSTALL_CODE_INVALID, patchInstallFailedReason)
}
} else {
val apk = File(localPath)
ApkInstaller.installApp(Utils.getApp(), apk) { code, reason ->
if (code != PackageInstaller.STATUS_SUCCESS) {
upgradeProvider?.also { itx ->
try {
apk.delete()
} catch (t: Throwable) {
t.printStackTrace()
}
runBlocking {
itx.recordInstallFailed(code, reason)
withContext(Dispatchers.Main) {
ApkInstaller.installApp(Utils.getApp(), apk) { code, reason ->
if (code != PackageInstaller.STATUS_SUCCESS) {
upgradeProvider?.also { itx ->
try {
apk.delete()
} catch (t: Throwable) {
t.printStackTrace()
}
scope.launch { itx.recordInstallFailed(code, reason) }
}
}
}
}
}
}
}
if (downloadUrl != null) {
if (map.isNullOrEmpty()) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeFinish(downloadUrl, localPath)
} else {
findKey(downloadUrl) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeFinish(it, localPath)
}
}
CallerDevaToolsUpgradeListenerManager.invokeUpgradeFinish(downloadUrl, localPath)
}
}
override fun onError(downloadUrl: String?, errorMsg: String?) {
CallerLogger.d("$M_DEVA$TAG","onError downloadUrl : $downloadUrl , errorMsg : $errorMsg")
if (downloadUrl != null) {
if (map.isNullOrEmpty()) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeError(downloadUrl, errorMsg ?: "未知错误")
} else {
findKey(downloadUrl) {
CallerDevaToolsUpgradeListenerManager.invokeUpgradeError(it, errorMsg ?: "未知错误")
}
}
CallerDevaToolsUpgradeListenerManager.invokeUpgradeError(downloadUrl, errorMsg ?: "未知错误")
val type = types[downloadUrl]
if (type == APK || type == PATCH) {
runBlocking {
CallerDevaToolsManager.upgradeProvider()?.recordDownloadFailed(downloadUrl,errorMsg ?: "下载失败")
}
}
}
}
private fun findKey(downloadUrl: String?, findResult: (downloadUrl: String) -> Unit) {
downloadUrl?.let { url ->
map?.iterator()?.forEach {
if (it.value == url) {
findResult.invoke(it.key)
}
scope.launch { upgradeProvider?.recordDownloadFailed(downloadUrl,errorMsg ?: "下载失败") }
}
}
}
@@ -333,5 +290,4 @@ class UpgradeManager : IDownload {
}
})
}
}

View File

@@ -83,6 +83,16 @@ class MoGoUpgradeProviderImpl: IMoGoUpgradeProvider {
}
}
override suspend fun recordDownloadPause(downloadUrl: String) {
val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadPause, downloadUrl = downloadUrl, time = System.currentTimeMillis())
UpgradeDbHelper.insertDownloadRecord(record)
try {
onUpgradeRecordLinkLog(mapOf("upgrade_download_pause" to GsonUtils.toJson(record)))
} catch (t: Throwable) {
t.printStackTrace()
}
}
override suspend fun recordDownloadFailed(downloadUrl: String, error: String) {
val record = DownloadRecord(versionName = AppUtils.getAppVersionName(), status = DownloadFailed, failReason = error, downloadUrl = downloadUrl, time = System.currentTimeMillis())
UpgradeDbHelper.insertDownloadRecord(record)

View File

@@ -151,6 +151,8 @@ data class DownloadRecord(
DownloadStart,
DownloadPause,
DownloadFailed,
DownloadComplete;