From 8c05d2be8a6efdc4b301ee29605acda65eb68507 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 23 Feb 2021 10:41:55 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=205.1.1=20=E7=B3=BB=E7=BB=9F?= =?UTF-8?q?=E7=9A=84=20vivo=20=E8=AE=BE=E5=A4=87=E5=AE=89=E8=A3=85?= =?UTF-8?q?=E5=A4=A7=E6=96=87=E4=BB=B6=E7=9A=84=20ANR=20=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gh/common/util/DownloadObserver.kt | 7 +++++ .../java/com/gh/common/util/PackageUtils.java | 30 +++++++++++++++---- .../com/gh/download/DownloadDataHelper.kt | 14 +++++---- 3 files changed, 39 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/DownloadObserver.kt b/app/src/main/java/com/gh/common/util/DownloadObserver.kt index 0cffeb3e13..cafa46969e 100644 --- a/app/src/main/java/com/gh/common/util/DownloadObserver.kt +++ b/app/src/main/java/com/gh/common/util/DownloadObserver.kt @@ -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) { diff --git a/app/src/main/java/com/gh/common/util/PackageUtils.java b/app/src/main/java/com/gh/common/util/PackageUtils.java index 27e1201b60..987ac2bafd 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -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 diff --git a/app/src/main/java/com/gh/download/DownloadDataHelper.kt b/app/src/main/java/com/gh/download/DownloadDataHelper.kt index 49912fff4e..172a18f918 100644 --- a/app/src/main/java/com/gh/download/DownloadDataHelper.kt +++ b/app/src/main/java/com/gh/download/DownloadDataHelper.kt @@ -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 {