【问题标题】:GetPackageInfo results in DeadObjectExceptionGetPackageInfo 导致 DeadObjectException
【发布时间】:2019-03-20 14:40:21
【问题描述】:

我有以下代码sn-p:

 public static String getAppVersion(Context context) {

        String versionName = null;
        try {
            versionName = context.getPackageManager().getPackageInfo(context.getPackageName(), 0).versionName; //This is the problematic line
        } catch (NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionName;
    }

现在根据 Crashlytics 的说法,当应用程序崩溃时出现以下异常:

Caused by android.os.DeadObjectException
com.tawkon.data.lib.util.ParameterUtils.getAppVersion
    android.os.BinderProxy.transactNative (Binder.java)
    android.os.BinderProxy.transact (Binder.java:503)
    android.content.pm.IPackageManager$Stub$Proxy.getPackageInfo (IPackageManager.java:2684)
    android.app.ApplicationPackageManager.getPackageInfo (ApplicationPackageManager.java:193)
    com.tawkon.data.lib.util.ParameterUtils.getAppVersion (ParameterUtils.java:44)
    com.tawkon.data.lib.helper.analytics.NetworkRequestHelper.generateHttpRequest (NetworkRequestHelper.java:28)
    com.tawkon.data.lib.service.DataThroughputScanJobIntentService$2.onTestFinished (DataThroughputScanJobIntentService.java:342)
    com.tawkon.data.lib.collector.DataThroughputManager$1.run (DataThroughputManager.java:171) 

设备规格为搭载 OS 6 的三星。

在我的情况下,这似乎是一个罕见的崩溃。无论如何,什么可能导致这种情况发生?我怎样才能防止它再次发生?

【问题讨论】:

  • "是什么导致了这种情况发生?" -- 在操作系统进程中发生了崩溃。 “我怎样才能防止它再次发生?” -- 我怀疑这是可能的。
  • 不久前我遇到了同样的问题。似乎当来自 PackageManager 的 IPC 通信尝试发送太多数据时,它会以某种方式死亡。在您的应用重新启动之前,它将一直处于死状态。我发现的唯一“解决方案”是使用它的标志来限制getPackageInfo 提供的数据。

标签: android deadobjectexception


【解决方案1】:

获取您自己的 versionName(我假设您正在尝试这样做,判断您的代码)的更好方法是调用 BuildConfig.VERSION_NAME。这要求应用程序是使用 gradle 构建的,并且版本在您的 app.gradle 文件中定义。

对于 PackageManager 问题本身,我有一个理论,虽然只是轶事(复制我对问题的评论):

不久前我遇到了同样的问题。似乎当来自 PackageManager 的 IPC 通信尝试发送太多数据时,它会以某种方式死亡。在您的应用重新启动之前,它将一直处于死状态。我发现的唯一“解决方案”是使用它的标志来限制从 getPackageInfo 提供的数据。

【讨论】:

  • 代码 sn-p 是 SDK 的一部分,后来作为依赖项添加到另一个应用程序中。您建议的解决方案在这种情况下仍然有效吗?
  • 如果您能够更改该 SDK,是的。如果您无法更改它,则必须找到一种解决方法,以便您可以实现自己的代码而不是调用此函数
  • 只是澄清一下,“.. 并且版本是在你的 app.gradle 中定义的 ..” 它应该在使用我的 SDK 的应用程序的 Gradle 中定义吗?如果是这样,我无法保证。
  • 哦,我误会了。在那种情况下,对不起。
  • @JensV 你的理论似乎是正确的。使用 PackageManager.GET_META_DATA 标志进行 getPackageInfo() 调用可以解决此问题。在 Kotlin 中: val packageInfo = getPackageInfo(packageName, PackageManager.GET_META_DATA)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-24
  • 2015-06-01
  • 1970-01-01
  • 2020-10-02
  • 2011-10-25
  • 2014-03-16
  • 1970-01-01
相关资源
最近更新 更多