修复 5.1.1 系统的 vivo 设备安装大文件的 ANR 问题

This commit is contained in:
juntao
2021-02-23 10:41:55 +08:00
parent 23dd89198b
commit 8c05d2be8a
3 changed files with 39 additions and 12 deletions

View File

@ -182,6 +182,13 @@ object DownloadObserver {
}
// 下载过程分析统计
// 部分设备 (已知 vivo 5.1.1) 在调用 packageManager.getPackageArchiveInfo 获取比较大的 APK 文件时会出现 ANR
// 这里为了让它能用就不判断是否解析包错误了
if (PackageUtils.isDeviceUnableToHandleBigApkFile(downloadEntity.path)) {
return
}
val pm = mApplication.packageManager
val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, 0)
if (packageInfo == null) {

View File

@ -18,6 +18,7 @@ import android.text.TextUtils;
import androidx.annotation.Nullable;
import com.g00fy2.versioncompare.Version;
import com.gh.common.xapk.XapkInstaller;
import com.gh.gamecenter.BuildConfig;
import com.gh.gamecenter.entity.ApkEntity;
import com.gh.gamecenter.entity.GameEntity;
@ -297,13 +298,12 @@ public class PackageUtils {
// 部分设备 (已知 vivo 5.1.1) 在调用 packageManager.getPackageArchiveInfo 获取比较大的 APK 文件时会出现 ANR
// 大于 1G 的 APK 就走另类方法
if ("vivo".equals(Build.MANUFACTURER)
&& (Build.VERSION_CODES.LOLLIPOP == Build.VERSION.SDK_INT)
|| Build.VERSION_CODES.LOLLIPOP_MR1 == Build.VERSION.SDK_INT) {
File file = new File(path);
if (file != null && file.length() > 1024 * 1024 * 1024) {
return getPackageNameByPathAlternative(path);
if (isDeviceUnableToHandleBigApkFile(path)) {
// XAPK 不存在 AndroidManifest
if (path.contains(XapkInstaller.XAPK_EXTENSION_NAME)) {
return null;
}
return getPackageNameByPathAlternative(path);
}
PackageManager packageManager = context.getApplicationContext().getPackageManager();
@ -316,6 +316,24 @@ public class PackageUtils {
return null;
}
/**
* 此设备是否不能调用 packageManager.getPackageArchiveInfo 来获取 APK 信息
*
* 部分设备 (已知 vivo 5.1.1) 在调用 packageManager.getPackageArchiveInfo 获取比较大的 APK 文件时会出现 ANR
*/
public static boolean isDeviceUnableToHandleBigApkFile(String path) {
if ("vivo".equals(Build.MANUFACTURER)
&& (Build.VERSION_CODES.LOLLIPOP == Build.VERSION.SDK_INT) || Build.VERSION_CODES.LOLLIPOP_MR1 == Build.VERSION.SDK_INT) {
File file = new File(path);
if (file != null && file.length() > 1024 * 1024 * 1024) {
return true;
}
}
return false;
}
/**
* 从 APK 文件里读包名的另类方法
* 部分设备 (已知 vivo 5.1.1) 在调用 packageManager.getPackageArchiveInfo 获取比较大的 APK 文件时会出现 ANR

View File

@ -1,14 +1,12 @@
package com.gh.download
import android.content.pm.PackageInfo
import android.text.TextUtils
import com.gh.common.constant.Constants
import com.gh.common.exposure.meta.MetaUtil
import com.gh.common.exposure.meta.MetaUtil.getMeta
import com.gh.common.loghub.LoghubUtils
import com.gh.common.util.DeviceUtils
import com.gh.common.util.getExtension
import com.gh.common.util.getMetaExtra
import com.gh.common.util.isSimulatorGame
import com.gh.common.util.*
import com.gh.common.xapk.XapkInstaller
import com.gh.gamecenter.BuildConfig
import com.halo.assistant.HaloApp
@ -59,8 +57,12 @@ object DownloadDataHelper {
if (downloadEntity.isSimulatorGame()) {
return "下载完成"
}
val pm = HaloApp.getInstance().application.applicationContext.packageManager
val packageInfo = pm.getPackageArchiveInfo(downloadEntity.path, 0)
val packageInfo = if (PackageUtils.isDeviceUnableToHandleBigApkFile(downloadEntity.path)) {
PackageInfo()
} else {
val pm = HaloApp.getInstance().application.applicationContext.packageManager
pm.getPackageArchiveInfo(downloadEntity.path, 0)
}
if (packageInfo == null && XapkInstaller.PACKAGE_EXTENSION_NAME == downloadEntity.path.getExtension()) {
"解析包错误"
} else {