24 августа 2020 г.

Изменения Android 11, которые затрагивают все приложения

     Как всегда, я рекомендую читать оригинал, а не мой перевод: https://developer.android.com/preview/behavior-changes-all Кроме того, мне сказали, что читать всю простыню тяжело и люди хотят просто конкретики. Так что попробую в этот раз сделать не полный, а сокращённый перевод, опустив совсем уж технические детали.

    Однако, чтобы эта запись была более полезной, чем просто список фич, сюда же будет подтянут текст с расширенным объяснением того или иного изменения. То есть если у какого-то изменения есть своя статья (например, она есть у one-time permissions), то оттуда будет взято пояснение, что это такое и как работает.

    Некоторые изменения поведения Android в 11-ом мажорном релизе затрагивают все приложения, вне зависимости от их targetSdkVersion. Так что обязательно проверьте ваше приложение, не сломалось ли чего.

Приватность

    Для улучшения приватности пользователей, в Android 11 внесены некоторые улучшения и изменения, включая следующие:

  • Одноразовые разрешения. Теперь в запросах разрешений на доступ к геолокации, микрофону, камере будет присутствовать ещё один пункт: «На один раз». Соответственно, если пользователь выберет этот пункт, то разрешение будет предоставлено на, логично, один раз. И при следующем сеансе работы этот запрос возникнет снова.
    Что такое «один раз» — зависит от поведения приложения:
    • Пока приложение на переднем плане, доступ предоставляется
    • Когда приложение уходит в фон, доступ остаётся на короткий промежуток времени. Примечание. Google не уточняет, что значит «короткий». Это не условность моего перевода, это фраза из оригинальной записи
    • Если приложение запустило фореграунд сервис, пока было на переднем плане, а затем приложение ушло в фон, то доступ останется до тех пор, пока фореграунд сервис будет запущен
    • Если пользователь отозвал разрешение из настроек, то фореграунд сервис не поможет — разрешение будет отозвано принудительно. Ну и кроме того, как и раньше, отзыв разрешения отстреливает приложение
  • Очевидность действий в запросах разрешений. Если за время жизни приложения оно запрашивало какое-то разрешение несколько раз и пользователь неоднократно отвечал «Запретить», то очередной такой ответ будет означать «Запретить и больше не спрашивать». Примечание. И снова Google не говорит, через сколько раз такое произойдёт. Просто слово «неоднократно». И обращаю внимание — речь не просто про запросы снова и снова, а за всё время жизни (то есть с момента установки) приложения
  • Аудит доступа к данным. Эта функциональность полезна разработчикам, которые хотят убедиться, что не получают больше данных, чем им на самом деле нужно. Разработчик может зарегистрировать AppOpsManager.OnOpNotedCallback, который будет вызываться всякий раз, когда само приложение или SDK внутри него (Примечание: что особенно полезно, т. к. очень многие разработчики любят тащить внешние зависимости в свой проект не особо разбираясь, какие подводные камни могут быть) получает доступ к чему-либо, что потенциально может повлиять на приватность

Безопасность

  • Реализация SSLSocket в Android использует SSLEngine из Conscrypt
  • Использование Scudo Hardened Allocator для аллокации хипа. Scudo — это динамический аллокатор хипа, созданный для противодействия различным уязвимостям, связанных с хипом (хиповое buffer overflow, use after free и double free) при управлении памятью. Так что, если вы ловите краши Scudo (в логкате это Scudo ERROR:), то RTFM: https://source.android.com/devices/tech/debug/scudo#Troubleshooting
  • Статистика использования приложений теперь шифруется. Это означает, что ни система, ни какое-либо приложение не могут получить доступа к статистике, пока isUserUnlocked() не вернёт true. Так что если ваше приложение получает такие данные, реализуя UsageStatsManager, то проверяйте, что возвращает этот метод после рестарта, а иначе рискуете вместо статистики получать null или пустые значения. isUserUnlocked() вернёт true когда:
    • Пользователь впервые разблокирует устройство после ребута
    • Пользователь зайдёт в свой профиль (Примечание: на устройстве можно иметь нескольких пользователей; не путать с учётными записями всяких Гуглов и Яндексов у единственного пользователя)

Эмулятор

    Эмулятор поддерживает 5G. Нужна версия 30.0.22 и новее.

Отладка

  • Отладка лимитов на вызовы JobScheduler API. Разработчики смогут проверять, не вызываются ли задачи JobScheduler слишком часто, что может привести к проблемам производительности. Для приложений, у которых флаг debuggable в Манифиесте выставлен в true, превышение лимита вызовов будет возвращать RESULT_FAILURE
  • File descriptor sanitizer (fdsan). Fdsan появился ещё в Android 10. Он занимается отслеживанием неправильных обращений владельцев файловых дескрипторов к этим самым дескрипторам. Например, попытки их использования после закрытия или двойные закрытия. Только Android 10 в этом случае просто создавал ворнинг в логе и позволял работать дальше, а 11 будет блокировать операцию. Так что если у вас появились падения из-за fdsan, то RTFM 

Ограничения доступа к не-SDK интерфейсам

    Уже несколько версий Google ограничивает доступ к интерфейсам, к которым иногда обращаются через рефлексию и JNI. Очередная версия Android и очередное пополнение списка ограничений: https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
    Если кто-то спрашивает, что это вообще за интерфейсы, то, утрируя, это всё, что не описано здесь: https://developer.android.com/reference/packages

Библиотека Maps v1 удалена

    Древнющая, давно объявленная устаревшей и прекратившая в 10ке работу библиотека Карт первой версии теперь полностью удалена.

Взаимодействие с другими приложениями

    Если ваше приложение взаимодействует с другими как, например, контент провайдер или наоборот, потребитель (то есть использует content URI), то оно должно получить разрешение доступа к URI, установкой флагов интента: FLAG_GRANT_READ_URI_PERMISSION или FLAG_GRANT_WRITE_URI_PERMISSION.

Комментариев нет:

Отправить комментарий