Почему один пользователь получает NoSuchMethodError, а десятки тысяч нет? - PullRequest
1 голос
/ 28 марта 2020

Как один из наших многочисленных пользователей может получить

java.lang.NoSuchMethodError: 
   at com.mycelium.wallet.activity.settings.SettingsPreference.getLanguage (SettingsPreference.kt:73)
   at com.mycelium.wallet.WalletApplication.onCreate (WalletApplication.java:109)
   at android.app.Instrumentation.callApplicationOnCreate (Instrumentation.java:1127)

в этой строке Kotlin код:

@JvmStatic
fun getLanguage(): String? = sharedPreferences.getString(Constants.LANGUAGE_SETTING, Locale.getDefault().language)

В этой строке три вызова функций: android.content.SharedPreferences::getString(String,String) , java.util.Locale::getDefault() и java.util.Locale::getLanguage() все они доступны после API 1.

Единственный затронутый пользователь (Samsung Galaxy A5 (2017) (a5y17lte), 2816 МБ ОЗУ, Android 8.0) попытался запустить приложение 180 раз с этим insta-cra sh.

Преобразование в Kotlin может иметь проблемы еще?

Ответы [ 2 ]

2 голосов
/ 28 марта 2020

Как вы знаете (я уверен), NoSuchMethodError вызвано несоответствием версий классов во время компиляции и во время выполнения.

И я согласен с вами, что три метода, вызываемые эта строка кода должна присутствовать во время выполнения.

Я подозревал, что для NoSuchMethodError нет строки сообщения о том, какой метод отсутствовал, но есть и другие примеры для платформы Android, где отсутствует сообщение. Поэтому я (предположительно) называю это несущественным.

Итак, нам нужно искать другие объяснения. Вот некоторые из них:

  1. Номер строки в трассировке стека может быть неточным. Люди иногда сообщают о таких вещах; например, Crashlytics сообщает о неправильных номерах строк

  2. Этот конкретный пользователь может использовать другую (более старую?) версию вашего приложения, где код в этой строке отличается от код, который вы просматриваете.

  3. Пользователь «рутировал» свое устройство и портил его стандартные библиотеки. Кроме того, пользовательское устройство было взломано, и хакер вмешался в стандартные библиотеки (в данном случае довольно грубо).

  4. Пользователь связался с байт-кодами для вашего приложения и имеет случайно получил его, пытаясь вызвать несуществующий метод. Кроме того, пользователь запускает (грубо) троянскую версию вашего приложения, в которой злоумышленник сделал то же самое.

Тот факт, что ваше приложение использует биткойны, означает, что они могут быть сильными стимул для кого-то совершать гнусные поступки ... поэтому не следует сбрасывать со счетов последние две альтернативы.


Преобразование в Kotlin может иметь проблемы по-прежнему?

Я не понимаю, почему это повлияет только на одного пользователя.


Тот факт, что пользователь попробовал 180 раз, вызывает у меня беспокойство. Это кошелек Bitcoin, так что ... у них могут быть деньги в этом кошельке, и я не хочу не разрешать проблемы, если смогу.

(Или наоборот, это может быть плохой парень, пытающийся вывести биткойны из кошелька через украденное устройство. Тот факт, что пользователь настолько настойчивый ... и не связался с вами за помощью ... сам по себе подозрительно.)

Но дело в том, что если у вас нет возможности связаться с этим пользователем, то исправление проблемы в целом вряд ли поможет им напрямую. И сейчас у вас недостаточно информации, чтобы понять, в чем проблема на самом деле.

2 голосов
/ 28 марта 2020

try { ... } catch (NoSuchMethodError e) { ... } может быть подходящим обходным путем. Но они уже могли сдаться; если у вас нет адреса электронной почты или чего-либо подобного, вы не сможете их уведомить. Вы можете вернуть строку c в случае NoSuchMethodError. Кроме того, если записать начальную фразу, кошелек находится в цепочке блоков, устройство имеет только ключи. Я бы подал это как отдельную судьбу - и это устройство, вероятно, еще можно было бы внедрить, чтобы извлечь ключи. Трудно помочь им без запроса поддержки, чтобы можно было уведомить их о новой версии, которая не зависит ни от какого неизвестного метода. Может быть, они все еще используют его и получат автоматическое обновление и попробуют снова, но только возможно - но нет никакой гарантии, что это единственный неизвестный метод на этом устройстве.

Это определенно не Kotlin проблема, а скорее дефект хранения; google "eMM C коррупция".

И если пользователь не записал свою исходную фразу, это его собственная ошибка.

Это все предположение, но вероятность не равна т так низко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...