October 25, 2020

Мифы об оптимизации смартфона

Оригинальная статья: anupritaisno1
Перевод: driversti®

Многие люди имеют много неправильных представлений о чистке кеша, подхода в заряжании батареи, её калибровке, ограничений системы (от переводчика: привет Google Play Services!) и тому подобных.

  • Итак, почему бы вам хотелось очистить кеш?вам скучно и нечем заняться
  • у вас нет усиленной разрядки батареи, но вы хотите позадалбывать форумчан
  • у вас нет проблем с производительностью, но вы хотите получить фризы и подлагивания, что позволит вам показать всем насколько OnePlus плохой
  • вы хотите получить медленную зарядку и значительный нагрев телефона во время этого процесса
  • вам нужна грелка для рук
  • вы хотите ждать неделями пока кеш создастся заново и во время этого периода вы желаете столкнуться с выше описанными проблемами

Если на любой из вопросов вы ответили утвердительно - вам обязательно нужно очистить кеш.

Об оптимизации

Должно быть после перепрошивки или установки обновлений вы встречались с таким диалогом системы как "Оптимизация приложения 32 из 92" (от переводчика: цифры для примера). В Android 7.0 N этого диалога уже нет. Значит ли это, что оптимизация была удалена? Нет. Android N не удалил этот экран, а просто отложил задачу, и отсрочка этой задачи является причиной разрядки аккумулятора.

Тогда оптимизация происходит в фоновом режиме? Опять нет. Она запускается только при особых условиях. Отсутствие этой оптимизации приводит к разрядке аккумулятора Да, вы правильно прочитали. Оптимизация не выполняется, потому что вы не знаете, как выполнить условия, необходимые для запуска оптимизации. Причина: ускоренная разрядка телефона.


Вы можете часто наблюдать, как Система Android потребляет энергии больше других приложений. Это результат того, что вы не позволили системе оптимизироваться.


Если в Android 6 и раньше оптимизация была принудительной, то начиная с Android 7 была додана опция пропустить этот процесс и оптимизировать приложения на лету (JIT, Just-In-Time), во время их использования. При этом изначальная оптимизация не была удалена и запускается только при соблюдении следующих условий: телефон подключен к зарядному устройству, полностью заряжен, включен (сам телефон, а не экран), не используется, бездействует (от переводчика: вроде после минимум 30 минут). Если эти условия выполнены, начинается оптимизация.

Теперь перейдем к части усиленной разрядки батареи.

Существует два (в нашем случае) компилятора приложений: JIT (Just-in-Time, во время запуска) и AOT (Ahead-of-Time, перед запуском). Оптимизация, когда телефон бездействует, выполняется AOT, в то время как JIT выполняет оптимизацию приложений во время их запуска. Так вот, когда вы, например, обновили систему, JIT включается в работу. Он сильно нагружает процессор, что приводит к значительному нагреву устройства и, конечно же, потреблению большого количества заряда батареи. Поэтому планируйте когда вы собираетесь обновить ОС, лучше это делать часа за 2 перед сном, чтобы вы могли оставить телефон на зарядке на всю ночь и позволили AOT сделать свою работу по оптимизации.

Миф о кэше

Миф: После обновления системы старый кеш не нужен и его стоит удалить

Факт. Android сравнивает отпечаток билда (дату билда в случает использования кастомной прошивки) и если он совпадает, сравнивает старый кеш с boot.art в /system и если что-либо с этого не совпадает, весь кеш помечается к удалению. Не нужно этого делать самому, так как если на самом деле в этом нет необходимости, вы уничтожаете актуальный кеш и принуждаете систему заново его создавать. А этот процес может длиться днями или неделями! (пруф https://forums.oneplus…6/page-3#post-19739199).

Миф: необходимо чистить кеш после каждого обновления кастомной прошивки

Факт. Большинство популярных кастомных прошивок (LineageOS и другие) имеют механизм проверки актуальности кеша (https://github.com/Gla…18cdff1986e50afcef960e) и сами сделают его обновления, если на самом деле это нужно. Если же разработчик требует, чтобы вы очистили кеш после обновления, то он не смотрел исходный код прошивки, не включил механизм проверки кеша в свою прошивку или просто не понимает, что делает. Он ничего не знает об Android! Стоит ли доверять таким ромоделам?!


Итак, повторим: зарядка телефона ночью позволит закончить AOT компиляцию, но JIT компиляция запустится как только вы начнете использовать устройство. Зарядка ночью улучшит быстродействие, но автономность улучшится на протяжении нескольких дней использования устройства.


Миф: кэш пересоздаётся немедленно

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

Принудительная оптимизация

Зачем вообще нужна эта оптимизация? Потому что разработчики приложений не могут этого сделать для каждого набора железа и каждое устройство уже само компилирует приложения в наиболее эффективный код для своего процессора. Поэтому просто пользуйтесь своим устройством и позвольте ему самому позаботится о кеше и прочем.

Как бы там ни было, у вас есть возможность принудительно запустить оптимизацию. Для пользователей с root:
откройте эмулятор терминала и выполните (вместе с кавычками, так как это часть команды):

su -c "cmd package bg-dexopt-job"

Если root у вас нет, воспользуйтесь ADB. Подключите телефон к устройству, убедитесь, что он доступен

adb devices

Выполните следующую команду

adb shell cmd package bg-dexopt-job

Процесс может занять от 20 минут до 3 часов (от переводчика: у меня это заняло около минуты, хотя накануне вечером установил Beta 6 и телефон лежал всю ночь с зарядом 98%-95%).

Отключение устройства во время оптимизации прервёт процесс, но не навредит устройству. Это абсолютно безопасно.

Пользователи без root могут обнаружить сообщение об ошибке "user 2000 nor current process has Android.permission.UpdateDeviceStats". Беспокоится не стоит, можете его проигнорировать и запустить команду снова.

Об оптимизации накопителя

Также Google производит оптимизацию хранилища во время бездействия на зарядке. Но поскольку пользователи не оставляют телефоны на зарядке, Гигант делает эту оптимизацию принудительно. Другими словами: вы убиваете свое устройство не оставляя его на зарядке на всю ночь.

Считаете, что зарядка телефона всю ночь вредит ему? Почитайте это! https://teletype.in/@dvaderfun/ENtn_9nNM

Миф о калибровке батареи

Миф: периодически надо калибровать батарею

Видите множество советов по калибровке батареи? Это ложь!
Пришло время развенчать этот миф. Сегодня люди даже клянутся, что калибровка батареи работает и верят в эффект плацебо, который она дает.

Так о чем все это? Статистика батареи хранится в файле /data/system/batterystats.bin. Быстрый анализ этого файла ничего не показывает о предполагаемых данных калибровки батареи. Вот это и есть правда.
Дополнительное доказательство: если калибровка батареи на самом деле работает, откуда TWRP получает то же значение заряда батареи, что и операционная система, даже без расшифрования пользовательского раздела /data?

У вас есть старое устройство с принудительным шифрованием? Мне действительно интересно, как эти устройства знали правильный процент заряда батареи даже до того, как раздел /data был примонтирован. И, безусловно, ваш загрузчик не знает об уровне заряда батареи до загрузки ядра, верно? Вы хотите поспорить со мной прямо сейчас?

Миф прояснился, но тогда как Android узнаёт о правильном уровне заряда батареи? Драйвер в вашем ядре под названием "fuelguage" (дословно - датчик расхода топлива) периодически отправляет данные о батарее в систему Android. Это выглядит именно так:

Вот так показатели заряда отправляются в ОС. Ядро записывает это в файл, записывает в лог, что процент заряда батареи изменился, и Android просто сообщает это значение пользователю. Android не хранит эти данные для калибровки батареи или чего-либо еще.

Что содержит этот файл batterystats? Он просто содержит данные о том, сколько батареи использовалось каждым приложением и системой от одного полного заряда до следующего. У него нет фактических данных калибровки батареи.
Все выше изложенное подтверждает инженер Google, Dianne Hackborn.

Жрущие сервисы Google Play

Сервисы Google Play работают как доставщики уведомлений приложениям. Другими словами, если Google Play Services потребляют слишком много батареи, это значит, что какое-то приложение или получает слишком много уведомлений, или само их инициирует. Или излишне использует возможности Google Play Services. Вам следует выявить это приложение и самому решить как его настроить, чтобы оно меньше обращалось к Google Play Services. К сожалению, это не самая простая задача. Существует много грязных и глупых советов по ограничению Google Play Services или перевода их в глубокий сон. Не делайте этого, так как вы не решаете саму проблему, а боретесь с её последствиями и можете пропустить много важных уведомлений. Из-за этого другие приложения могут перестать корректно работать. Найдите виновника. (от переводчика: найдите паразита и накажите)