11 апреля 2016 г.

Android не запрашивет пароль в процессе загрузки устройства

До Android N Accessibility недоступен в процессе загрузки ОС

    На официальном форуме «Лаборатории Касперского» пользователь задал интересный вопрос, суть которого я, к своему стыду, не понял сразу и отправил человека не в то направление. К счастью, пользователь верно разобрался сам, а я потратил несколько минут выходных на то, чтобы докопаться до причины.

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

    Сначала я бы рекомендовал ознакомиться с двумя предыдущими статьями, где упомянуты экраны блокировки и шифрование (жаль, что к этому времени я ещё не написал остальные статьи из цикла про шифрование в Android, они бы помогли). Первое нужно, чтобы убедиться, что ни одно приложение не сбрасывало пароль. Второе — чтобы лучше понимать, что происходит в этом случае.
 
    Стоит зайти в настройки системы → Специальные возможности (Settings → Accessibility) и посмотреть, нет ли там приложений, для которых разрешены («Включено» / «On») использования этих самых специальных возможностей. По умолчанию для всех приложений там должно быть «Выключено» / «Off». Ну и, конечно, вспомнить, включали/выключали ли вы сами здесь что-нибудь. Если хоть что-нибудь включено в разделе «Службы» («Services»), то вот и причина.

    Вся суть описана здесь: https://code.google.com/p/android/issues/detail?id=79309 И суть эта вот в чём. Accessibility Service, предоставляющий нужные API для приложений, загружается после того, как устройство будет расшифровано. То есть если человек незрячий, то приложение Talk Back или его аналог, которое проговаривает названия элементов интерфейса и вводимый текст, просто не сможет помочь ему ввести пароль на этой стадии. Чтобы не допустить эту ситуацию, сам Android меняет ключ шифрования на некий стандартный. Устройство остаётся зашифрованным, но уже не тем ключом шифрования (на самом деле пользовательский ключ шифрования не используется для шифрования всего устройства, но об этом в другой статье), который установил пользователь. Ну а на экране блокировки служба специальных возможностей уже работает полноценно и незрячий человек вполне может взаимодействовать с экраном блокировки.

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

    Если забыли, где этот пароль включается, то: Настройки → Безопасность → Блокировка экрана → /Введите свой текущий пароль/ (напоминаю, что и PIN, и рисунок — всё это тоже пароли с точки зрения Android) → Выберите желаемый способ блокировки → Установите переключатель в состояние «Запрашивать ... при запуске устройства» (Settings → Security → Screen lock → /Подтвердите, что знаете текущий пароль/ → Выберите желаемый способ блокировки → Установите переключатель в состояние «Require ... to start device»). На предупреждение системы о возможных проблемах нужно подтвердить свои намерения.
    Таким образом у вас будет работать и приложение, использующие службу специальных возможностей (оно не будет работать при загрузке устройства, но там оно вам и не нужно), и запрос пароля на загрузке системы.