From 3fbcd33f984e96a40b38eed4ce8d6bbe09d0e07e Mon Sep 17 00:00:00 2001 From: juntao Date: Mon, 14 Dec 2020 17:10:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E5=AE=8C=E6=88=90=E8=A7=A6=E5=8F=91=E7=9A=84=20ANR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/gh/common/util/PackageUtils.java | 5 +++++ app/src/main/java/com/gh/download/PackageObserver.kt | 4 +++- .../receiver/InstallAndUninstallReceiver.java | 10 +++++++++- 3 files changed, 17 insertions(+), 2 deletions(-) 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 791c8b2eb5..3ec4f507c8 100644 --- a/app/src/main/java/com/gh/common/util/PackageUtils.java +++ b/app/src/main/java/com/gh/common/util/PackageUtils.java @@ -185,6 +185,11 @@ public class PackageUtils { public static boolean compareSignatureBetweenInstalledAppWithApk(Context context, String packageName, String apkFilePath) { try { + // 统计签名比较使用的频率 (大文件会触发 ANR) + SentryHelper.INSTANCE.onEvent( + "SIGNATURE_COMPARE", + "packageName", packageName); + Signature sig = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES).signatures[0]; // Fuck HUAWEI, 华为系统调用 getPackageArchiveInfo 获取魔羯 apk 的签名时会耗时超过5秒造成 ANR,没有找到解决方法 diff --git a/app/src/main/java/com/gh/download/PackageObserver.kt b/app/src/main/java/com/gh/download/PackageObserver.kt index 1ef2fedc79..0538ba56ab 100644 --- a/app/src/main/java/com/gh/download/PackageObserver.kt +++ b/app/src/main/java/com/gh/download/PackageObserver.kt @@ -7,6 +7,7 @@ import android.preference.PreferenceManager import android.text.TextUtils import com.gh.common.constant.Constants import com.gh.common.loghub.LoghubUtils +import com.gh.common.runOnIoThread import com.gh.common.util.* import com.gh.gamecenter.entity.GameDigestEntity import com.gh.gamecenter.eventbus.EBPackage @@ -106,7 +107,8 @@ object PackageObserver { } }) } - postNewlyInstalledApp(gameId, packageName) + + runOnIoThread { postNewlyInstalledApp(gameId, packageName) } } if ("卸载" == busFour.type) { diff --git a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java index 1682ff06fd..d44b15daf1 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/InstallAndUninstallReceiver.java @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; +import com.gh.common.AppExecutor; import com.gh.common.util.DataUtils; import com.gh.common.util.ExtensionsKt; import com.gh.common.util.InstallUtils; @@ -38,7 +39,14 @@ public class InstallAndUninstallReceiver extends BroadcastReceiver { String versionName = PackageUtils.getVersionByPackage(packageName); EBPackage installEb = new EBPackage("安装", packageName, versionName); EventBus.getDefault().post(installEb); - PackageObserver.onPackageChanged(installEb); + if (PackageUtils.isAppOnForeground(context)) { + PackageObserver.onPackageChanged(installEb); + } else { + // 处于后台运行的时候尝试延迟 1 秒再触发 onPackageChanged (猜测是引起 ANR 的原因) + AppExecutor.getUiExecutor().executeWithDelay(() -> { + PackageObserver.onPackageChanged(installEb); + }, 1000); + } } // 接收卸载广播