修复 5.1.1 系统的 vivo 设备安装大文件的 ANR 问题
This commit is contained in:
@ -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) {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user