GetPackageInfo приводит к исключению DeadObjectException - PullRequest
1 голос
/ 20 марта 2019

У меня есть следующий фрагмент кода:

 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) 

Характеристики устройства - Samsung с ОС 6.

Похоже, это редкий сбой в моем случае. Независимо от того, что может быть причиной этого? Как я могу предотвратить это снова?

1 Ответ

1 голос
/ 20 марта 2019

Лучший способ получить ваше собственное versionName (которое, как я полагаю, вы пытаетесь сделать, судя по своему коду), это вызвать BuildConfig.VERSION_NAME.Для этого необходимо, чтобы приложение было построено с использованием gradle, а версия была определена в вашем файле app.gradle.

Для самой проблемы PackageManager у меня есть теория, хотя и анекдотичная (копирование из моего комментария к вопросу):

Я столкнулся с той же проблемой некоторое время назад.Кажется, когда IPC Communication из PackageManager пытается отправить слишком много данных, он как-то умирает.Он останется мертвым, пока ваше приложение не перезапустится.Единственное найденное мной «решение» - ограничить данные, предоставляемые getPackageInfo, флагами.

...