Мой опыт в исправлении ошибки приложения Boinc в части заряда батареи смартфона.
Хотел бы поделиться опытом в исправлении ошибки приложения в части заряда батареи смартфона. Сразу скажу, что описанный способ подходит только для устройств без батареи.
Я совсем не программист, поэтому заранее прошу прощение за описанные костыли.
Телефоны решил собрать в некое подобие кластера. Делаю все из подручных средств. Пока все еще в процессе.
Первая часть кластера готова, подключено к компьютерному БП через преобразователь напряжения 12>5 В.
Прикладываю фото работающих телефонов с модифицированным приложением.
Небольшая предыстория. Ко мне в руки попало несколько смартфонов Vertex Impress Luck без батарей. Оперативки 1 Гб, 4 ядра, Android 8.1. Конечно железо слабое, но было интересно повозиться с этими телефонами и запустить на них BOINC.
Телефоны предполагалось использовать без батарей, провода питания подключал к контактам вместо батареи.
К сожалению, расчеты не запускались, все время висело сообщение:
"Расчеты возобновятся, когда заряд батареи достигнет 90% (в настоящее время 100%) (computing will resume when battery charge reaches 90% (currently 100%))".
В сети решения этой проблемы не нашел, но возможно плохо искал. На форуме boincstats было сообщение, что разработчики знают о такой проблеме, но решения пока нет.
Я подумал, что смогу как-нибудь отключить использование батареи в исходном коде приложения, ломать - не строить. На гитхабе довольно подробная инструкция по компиляции приложения под андроид с помощью WSL. Для модификации использовал версию 8.0.2.
Методом проб и ошибок я сделал следующий костыль. В файле client/cs_prefs.cpp вручную указал значение заряда батареи: int cp = 90;
И это сработало. Приложение скачало задание, и начался расчет.
Но каждые 28 секунд вычисления останавливались и начинались сначала. Оказалось проблема в отсутствии батареи. Хотя у меня уже несколько лет BOINC работает на смартфоне без батареи, там таких проблем не было, но там андроид версии 4.2.
В логе постоянно было сообщение "E/BOINC_GUI( 3087): [MONITOR] Monitor.reportDeviceStatus exception: temperature parsing error."
Приложение не могло определить температуру батареи и постоянно перезапускало вычисления.
Эту проблему я также решил с помощью костыля. В файле android/BOINC/app/src/main/java/edu/berkeley/boinc/client/DeviceStatus.java вручную указал значение температуры батареи: int temperature = 10;
Сейчас приложение работает нормально, уже посчитано несколько заданий Einstein@home.
Костыль про температуру может быть опасен для устройств с батареей, может привести к перегреву батареи и к пожару. Поэтому его можно использовать только для устройств без батареи.