Android 13 запретит сторонним файловым менеджерам доступ к папкам в каталоге '/Android'
В Android 11 Google ввела такую вещь, как Scoped Storage, суть которой заключалась в том, чтобы предоставлять приложениям доступ только к своим собственным файлам кэша, специфичным для приложения, но не никак ни к чужим. То есть, даже если приложение имеет разрешение на "доступ ко всем файлам", ему не разрешается доступ к каталогу /Android и его подкаталогам /Android/obb и Android/data.
Пользуясь случаем, мы хотели бы вас пригласить в наш Telegram канал, где вы найдете еще больше новостей, связанных с Google, устройствами Pixel и Android!
Но как же разработчикам до сих пор удавалось обходить ограничение введенное в Android 11? Всё благодаря лазейке в Storage Access Framework (SAF). Используя лазейку, файловые менеджеры могли получать доступ к подкаталогам в каталоге /Android.
К сожалению, как обнаружил Мишаал Рахман на Esper Blog, в Android 13 эта лазейка теперь была закрыта, что ограничивает возможности сторонних файловых менеджеров выполнять свою работу. Он продемонстировал это на примере файлового менеджера MixPlorer.
Повторюсь, речь идет именно о сторонних файловых менеджерах. Такие системные решения, как AOSP Files и приложение Google Files, являющееся частью предустановленных Google Mobile Services, по-прежнему имеют доступ к этим директориям.
Так почему же закрытие этой лазейки так важно для пользователей? Для этого нужно немного подтянуть теорию.
Основы
В подкаталоге /Android/data хранятся файлы многих приложений. В этом подкаталоге вы найдете папки с именами пакетов приложений, установленных на вашем устройстве. Приложение может читать и записывать любые файлы в папку, соответствующую названию только его пакета, и ему не нужно запрашивать на это разрешение.
Например, приложение Telegram хранит свой кэш в папке /Android/data/org.telegram.messenger/cache, поэтому если вы забыли сохранить какой-то файл, но хотите его извлечь, вы можете найти его там. /Android/data — это не единственное место, где приложения могут хранить файлы, но для таких целей оно предлагает больше пространства, чем внутренняя память, и к нему к тому же удобно обращаться, поэтому зачастую используется именно эта директория.
В течение многих лет Google Play ограничивал размер APK-файлов, которые могли загружать разработчики, объемом 100 мб и меньше. Но есть приложение, которые работают с большим количеством высококачественных ресурсов, например игры. В этом случае Google предлагает возможность создавать файлы дополнительные для APK файлы размером до 2 ГБ. Эти файлы хранятся в папке /Android/obb с расширением .obb. Наверняка, вы сталкивались с этим, если когда-либо скачивали объемные Android игры со сторонних ресурсов.
В связи с этим, неудивительно, что введенное в Android 11 ограничение вызвало бурю недовольства среди пользователей. Однако довольно быстро было замечено, что многие файловые менеджеры выпустили обновления, позволяющие получить доступ к /Android/data и /Android/obb. Пользователю достаточно было нажать "использовать эту папку", а затем "разрешить", и файловый менеджер получал доступ к этим каталогам.
Ниже вы видите пример из Android 12L и файлового менеджера MiXplorer. После попытки открытия подпапок в каталоге /Android, пользователя перекидывает в системное приложение AOSP Файлы, где предлагается разрешить доступ к /Android/data. Такой же запрос появляется при получении доступа к /Android/obb.
Лазейка в Storage Access Framework (SAF)
Файловые менеджеры, подобные MiXplorer, используют Storage Access Framework (SAF) для запроса доступа к содержимому определенного каталога. SAF был представлен еще в Android 4.4, а возможность использовать SAF для того, чтобы предложить пользователю выбрать каталог для доступа к нему, была добавлена в Android 5.0.
Таким образом, эта возможность существует уже довольно долгое время, поэтому не похоже, что Google не учел, что приложения будут пытаться использовать SAF для запроса доступа к каталогам, доступ к которым должен быть ограничен. На самом деле, Google явно блокировал доступ SAF к каталогу /Android, но эта реализация имела недостаток: она не блокировала доступ SAF к подкаталогам под /Android.
Другими словами, хоть файловые менеджеры и не могли просто использовать SAF для запроса доступа ко всей директории /Android, они могли использовать его для запроса доступа к /Android/data и /Android/obb, тем самым почти полностью обходя ограничения Android.
Метод, лежащий в основе этой лазейки, довольно просто найти в Интернете. Она достаточно хорошо описана на ресурсе StackOverflow. Это работает следующим образом: при создании намерения запустить SAF приложения могут установить начальное местоположение выбора документа как /Android/data или /Android/obb. Это функциональность SAF, которая изначально была в нем заложена, но, похоже, что Google, не учел этого при реализации в Android ограничений на эти каталоги. ¯\_(ツ)_/¯
Закрытие лазейки
Спустя полгода после того, как кто-то сообщил Google о существовании лазейки, сотрудник компании заявил, что проблема будет исправлена в одном из будущих релизов Android. Этот "будущий релиз Android" уже здесь, в виде Android 13. Как заметил Мишаал Рахман на Esper Blog, лазейка устранена путем собственного тестирования и изучения кода. Как видно из видео ниже, лазейка работает на Android 12L, но не на Android 13:
В Android 13 Google обновил метод shouldBlockFromTree в ExternalStorageProvider. В обновленном методе появилось новое условие для проверки соответствия запускаемого каталога одному из каталогов, которые должны быть скрыты от приложений. Если совпадение есть, то к директории будет применен флаг, который блокирует ее выбор через SAF.
Разница между методом shouldBlockFromTree в Android 12L и Android 13
Источник: Esper Blog
Итог
Из-за этого изменения файловым менеджерам придется искать другой обходной способ доступа к файлам в каталоге /Android. Одним из решений может быть использование библиотеки Shizuku для запуска от через shell, поскольку shell-пользователь по-прежнему имеет доступ к /Android. Однако Shizuku не является идеальным решением, поскольку ее служба не сохраняется при перезагрузке, а на некоторых устройствах она завершается при переключении между WiFi и мобильными данными. Кроме того, полагаться на Shizuku немного рискованно, поскольку в будущем Google может ограничить эту возможность.
Пока разработчики файловых менеджеров ищут обходные пути, пользователи могут получить доступ к /Android одним из официально поддерживаемых способов: системное приложение AOSP Files (если вы не можете найти его, то вы можете скачать это приложение, оно действует как ярлык), MTP передача данных (т.е. с вашего ПК) или оболочка ADB (adb shell) (с ПК или без него).
Мишаал Рахман предполагает, что файловые менеджеры, которые уже получили доступ к подкаталогам под /Android с помощью лазейки SAF на Android 12L, сохранят этот доступ при обновлении до Android 13, поэтому одним из вариантов может быть настройка файлового менеджера перед обновлением на новую версию системы.
Источник: Esper Blog