GetPackageInfo 结果导致 DeadObjectException

Kes*_*lme 5 android deadobjectexception

我有以下代码片段:

 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;
    }
Run Code Online (Sandbox Code Playgroud)

现在,根据 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) 
Run Code Online (Sandbox Code Playgroud)

设备规格为三星,操作系统为 6。

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

Jen*_*nsV 2

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

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

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