Выбор формата файловой системы для Android
ТОП-3 популярных файловых менеджеров для Android
Одним из значимых преимуществ операционной системы Android является открытый доступ к файловой системе. На некоторых устройствах прямо с коробки установлены незамысловатые файловые менеджеры, другие девайсы не имеют даже оных, поэтому файловые менеджеры сторонних разработчиков довольно популярны среди пользователей.
В этой статье собрана 3-ка лучших файловых менеджеров для Android OS, которые имеют обширный функционал и позволяют полноценно работать как с вашими собственными данными, так и с системными файлами.
File Commander
File Commander сразу же встречает пользователя ярким и интересным оформлением.
Приложение является условно бесплатным. Free-версия поставляется с рекламой, а для того, чтобы убрать ее, необходимо внести дополнительную оплату. Помимо отсутствия рекламы, Premium-версия открывает для пользователя расширенные возможности:
- Доступ к скрытым файлам и папкам;
- Наличие «Корзины», которая позволяет восстановить ошибочно удаленные данные»;
- Выделение часто используемых файлов в Избранное для быстрого доступа;
- Безопасный режим, который позволяет скрыть или зашифровать выбранные файлы и папки;
- Возможность сортировки данных по типу и размеру для анализа загруженности накопителей.
Сразу после запуска перед вами откроется окно с категориями файлов, над которыми вы можете работать.
Помимо категорий, доступных по умолчанию, нажав на значок «+» вы можете добавить еще несколько вариантов, а также убрать те категории, которые вы не планируете использовать.
Внизу под категориями отображаются все доступные для вашего устройства накопители, их общий объем и занятое место.
Тапнув по выбранному хранилищу, вы сможете получить доступ сразу ко всем файлам и папкам, которые там располагаются.Рядом с каждым дисковым накопителем располагается значок круговой диаграммы, тапнув на который, вы открываете Анализатор памяти.
Эта функция позволяет определить самые «тяжелые» файлы, которые занимают на диске больше всего объема.
Анализатор доступен только для Premium-версии File Commander, но для бесплатного доступа существует возможность воспользоваться этой функцией 3 раза в ознакомительных целях.
Если ваше мобильный девайс подключен к одной Wi-Fi сети вместе в вашим компьютером, с помощью PC File Transfer вы сможете получить доступ к вашим файлам с помощью браузера. Для этого необходимо запустить сервис PC File Transfer и ввести сгенерированный приложением адрес в адресную строку браузера на ПК.
Так вы получите доступ ко всем файлам на ПК без необходимости подключать смартфон или планшет к компьютеру с помощью USB-кабеля.
Также File Commander позволяет транслировать экран вашего мобильного телефона на другие устройства, подключенные с вами к одной Wi-Fi сети. Для запуска этой функции необходимо пройти регистрацию через E-mail или с помощью Google или .
Еще одной чрезвычайно полезной функцией File Commander является встроенная возможность конвертировать файлы в различные форматы. Для того, чтобы запустить конвертер, необходимо тапнуть на значок двойных стрелок, который расположен рядом с каждым из файлов.
File Commander умеет конвертировать не только изображения, но и видеофайлы, текстовые документы и pdf. Список поддерживаемых форматов довольно обширен, и для каждого из файлов он подбирается индивидуально.Боковое контекстное меню позволяет получить быстрый доступ к категориям, последним файлам, избранному и корзине, а также воспользоваться FTP, через локальную сеть войти на другие устройства и пр.
ES Проводник
Бесплатный файловый менеджер для Android ES проводник имеет русский интерфейс выполнен в синих и светло-серых тонах, и без долгих прелюдий сразу же открывает пользователям доступ ко всем имеющимся функциям.
С самого верха расположена информация об имеющихся хранилищах и их объеме. Там же находится кнопка запуска Анализатора места, который проверяет, какие данные занимают больше всего места на мобильном девайсе.
После анализа пользователь может увидеть круговую диаграмму, которая наглядно отображает процентное соотношение занятого и свободного пространства. Далее размещаются сведения о крупных файлах, которые «съедают» основную часть дискового пространства, затем о пустых временных и журнальных файлах, о файлах-дубликатах, расположенных одновременно в нескольких каталогах.
Нажав на «Сведения» вы сможете подробнее узнать в выбранной категории, а также сразу удалить все или только определенные файлы.
Помимо категорий файлов, на главном экране есть доступ к такой удобной функции, как Журнал. Она позволяет отслеживать, какие файлы были сохранены на устройстве и их местоположение.
Функция Очистка позволяет быстро проанализировать файловое хранилище и удалить файлы из корзины, стереть устаревшие установщики APK, рекламный мусор, скачанные файлы из папки Download, кешированные миниатюры изображений. Порой такого незначительного мусора может накопиться на несколько гигабайт.
Помимо работы с локальным хранилищем, ES Проводник умеет также работать с облачными сервисами. Нажав на кнопку Облако, вы сможете авторизироваться в таких популярных удаленных хранилищах, как Gdrive, Yandex, OneDrive и пр.
Пользуясь ES Проводник, вы сможете подключаться по локальной сети к другим устройствам через LAN, FTP или Android TV.
Также приложение позволяет получить удаленный доступ к мобильному устройству через ПК, если оба девайса подключены к одной локальной сети.Встроенный шифровальщик дает возможность защитить ваши данные при передаче, а также при хранении в облаке. Для этого ES Проводник использует специальный 128-битный шифр.
Помимо возможности выбирать файлы по категориям, вы также можете получить доступ ко всей информации на выбранном хранилище. Для этого необходимо нажать на иконку карты памяти, расположенную в верхней части экрана рядом с надписью «Домашняя страница». Перед вами откроются все папки и файлы, хранящиеся на вашем устройстве.
Total Commander
Total Commander по праву можно считать легендарным продуктом, который известен всем еще с платформы Windows с 1993 года. В 2002 году программа перекочевала во владение Microsoft и со временем расширилась до платформ Windows Mobile и Android.
Total Commander по умолчанию имеет темный интерфейс на русском языке, но при желании пользователь может в Настройках полностью переделать внешний вид приложения для себя. Изменить можно не только цвет фона и управляющих элементов, но и начертания и размеры шрифтов, высоту строк, внешний вид значков. Также можно просто сменить тему интерфейса с темной на светлую.
На домашнем экране имеется доступ к общим файлам на внутреннем хранилище. Также можно отдельно получить быстрый доступ к папке загрузок и фотографиям, зайти в корневой каталог файловой системы, перейти к избранным файлам в Закладки или открыть полный перечень приложений для быстрого удаления.
В нижней части дисплея находится зафиксированная панель кнопок:
- Выделить;
- Копировать/переместить;
- Заархивировать;
- Удалить;
- Отсортировать;
- Добавить/изменить кнопку.
Выделение файлов в Total Commander реализовано крайне интересно. Помимо того, что вы можете выделять файлы долгим тапом по иконке, вы также можете выделить или снять выделение с определенных файлов, по имени или расширению. Также доступна опция инвертирования выделения.
Функция копирования позволяет не только перемещать файлы внутри хранилища, но и отправлять их через беспроводные технологии Bluetooth и Wi-Fi.
Отсортировать данные можно по названию, расширению, размеру, дате и времени.
В качестве дополнительных кнопок вы можете назначать различные команды, среди которых смена папки, внутренние команды, запуск приложения и т.д.
Отдельные папки можно добавлять в закладки, нажав на иконку звездочки в верхней части экрана.
После тапа на кнопку «Добавить закладку» по умолчанию вам будет предложено сохранить в Избранное текущую папку. Вы можете согласиться или выбрать другую. Помимо сохранения в закладках, вы можете также сохранить папку на главном экране для быстрого доступа.
Кнопка множественных папок рядом с Закладками отвечает за просмотр истории папок. Там вы можете отследить, какие папки вы просматривали с помощью Total Commander, а также осуществить быстрый переход в выбранному каталогу.
Также Total Commander радует своим обширным функционалом поиска. Помимо поиска по имени файла или расширению, вы можете также искать файлы, в которых содержится определенный текст, файлы по дате создания и изменения, а также по размеру.
Помимо основного функционала, возможности Total Commander могут быть расширены с помощью плагинов, которые могут быть инсталлированы дополнительно. Такой подход выглядит оправданным, ведь некоторые функции, которые поставляются с приложениями «из коробки», могут быть не востребованы теми или иными пользователями приложения.
Здесь же можно персонализировать приложение и дополнительно установить только тот функционал, который вам необходим.
Для скачивания доступны плагины FTP-сервера, плагин синхронизации с Google Drive, плагин соединения с помощью LAN-сети и т.д.
Представленные приложения обладают всем необходимым базовым и интересным расширенным функционалом, который позволяет не только управлять файлами, но и производить очистку диска от лишних данных, работать с облачными хранилищами и пр.Конечно, приложения такого рода на Google Play представлены в огромном количестве, но эта тройка является проверенными и надежными лидерами, которые получили пользовательское признание.
Файловые системы Android
Файловая система представляет собой своего рода структуру того или иного накопителя. Она отвечает за то, какой максимальный объем файла можно сохранить в памяти, длину их названий, а также за организацию циклов записи или чтения. Файловые системы выступают в роли посредников между программным кодом и физическим вместилищем.
Для разных операционных систем и типов устройств существуют отдельные ФС и гаджеты на ОС Android, не являются исключением. Давайте разберемся, какие файловые системы поддерживает Android и для каких целей используется каждая из них?
1. Yaffs и Yaffs2
Создателем файловой системы Yaffs (Yet Another Flash File System) является Чарльз Мэннинг, родом из Новой Зеландии. Данная ФС предназначается для организации работы флеш-накопителей и оперативной памяти.
Основным ее преимуществом является повышение сроков эксплуатации модулей памяти, так как система автоматически пропускает ячейки, предназначенный для однократной записи.
Yaffs2 использовалась для организации работы внутренней памяти гаджетов Android версии 2.2 и 2.3.
2. VFAT
Vfat не является полноценной самостоятельной файловой системой, а представляет собой расширение FAT.
Доработанная версия позволяет сохранять файлы с длинными именами, но по всем остальным характеристикам является морально устаревшей.
Vfat может использоваться на картах памяти, а операционные системы на базе ОС Андроид полностью их поддерживают. В основном, это файловая система флешки android.
3. F2FS
F2FS (Flash Friendly File System) – файловая система, которая предназначена в первую очередь на работу с флеш-памятью и SSD-накопителями. Разработал ее сотрудник компании Samsung, Ким Чэ Гык, а после публикации исходного кода она была доработана другими инженерами компании. F2FS может использоваться на картах памяти SD/MMC, а также со множеством других типов памяти.
Для полноценной кастомизации существует целый набор утилит. Из преимуществ можно отметить хорошую гибкость в настройке, высокие показатели сохранения жизненного цикла блоков памяти, а также хранение данных в виде журнала. Хорошую скорость работы обеспечивает то, что индексы данных сохраняются в оперативную память, а поддержка F2FS включена в ядро Linux, начиная с версии 3.8.
4. Ext2-Ext4
Ext2-Ext4 – основные файловые системы Android. Именно они используются для организации работы внутреннего хранилища на большинстве современных гаджетов, и если первые устройства работали под версиями Ext2, то начиная с версии Android 4, основными стали Ext3, а потом и Ext4.
Основное отличие между вариациями заключается в наличие журналирования. То есть, если в процессе записи или чтения данных происходит системный сбой, например, неожиданное отключение питания, не произойдет потери или повреждения данных.
Несмотря на то, что в основном ФС формата Ext используется в основном в блочных накопителях, пользователи могут установить данный тип и для карт памяти, но без сторонних утилит получить к ним доступ из операционных систем, помимо Linux, будет невозможно.
Файловая система флэшки Android обычно форматируются в FAT (VFAT) или NTFS, а флеш-память — в Ext3 или Ext4.
5. UBIFS
mSATA SSD 16 GB Sandisk — SDSA3DD-016G
UBIFS – файловая система, предназначенная исключительно для памяти по типу NAND (флеш-накопители, применяемые на мобильных устройствах). Ее основное преимущество — это снижение износа носителей данных.
Состоит такая ФС из двух слоев — UBI (отвечает за работу и связь с физическим носителем) и UBIFS (сама файловая система).
Разработчиком UBIFS является компания Nokia, но встретить подобную файловую систему можно не только на оригинальных устройствах от данного производителя, но и на других гаджетах, например, китайского изготовления.
6. Samsung RFS
Samsung RFS – разработанная корейской компанией Samsung файловая система для устройств на базе ОС Linux, а одной из разновидностей последнего является Android. Предназначается фирменная ФС для флеш-памяти NAND и используется во многих гаджетах собственного производства.
Для облегчения работы с файлами используется таблица формата FAT, что позволяет максимально просто произвести запись файлов на флэш-память и их чтение.
Специфика RFS учитывает особенности NAND накопителей, что позволяет увеличить длительность их эксплуатации, а также снизить вероятность потери данных при системных сбоях и случайных отключениях питания.
7. SDCardFS
Компания Google долгое время использовала в своих устройствах файловую систему FUSE, но она имела ряд недостатков, среди которых необходимо отметить малое количество памяти, выделяемой под приложения под приложения, а также большое потребление хранилища при кэшировнии данных.
На замену FUSE пришла SDCardFS, которая решала эти проблемы, но представляла собой своего рода оболочку, эмулирующую FAT32. Она отправляет данные файловым системам нижнего уровня, что позволяет оптимизировать работу смартфонов, а также исправляет ошибки, связанные с передачей данных на компьютер и обратно.
SDCardFS по своей сути не является классической файловой системой, но значительно сказывается на скорости работы смартфонов или планшетов на Android.
Выводы
Файловые системы Android самые разнообразные. Среди них есть как общие ФС, предназначенные для работы с ОС на базе Linux, так и специфические, которые используются в NAND-накопителях.
Несмотря на такое разнообразие, производители все же прикладывают совместные усилия для продвижения и улучшения той или иной файловой системы, так как именно от работы внутренних составляющих зависит будущее рынка Android-гаджетов.
Стоит также отметить тот факт, что над улучшением различных файловых систем могут одновременно работать конкурирующие концерны, и именно такое объединение заставляет цифровые технологии развиваться, независимо от того, насколько яростна борьба на потребительском рынке. И только производители смартфонов определяют, какая файловая система на Android работает лучше при тех или иных обстоятельствах.
(8 4,25 из 5)
Загрузка…
В каком формате форматировать флешку для андроид — расширяем возможности карты памяти
Многие пользователи ошибочно считают, что форматирование флешки — это процедура удаления данных с цифрового носителя.
На самом деле у этой операции более широкое назначение, которое идентично форматированию жёсткого диска.
И если, как это часто бывает, не обращать на это внимания, то такая беспечность может негативно сказаться на работе карты памяти. Вот поэтому мы и решили разобрать тему, в каком формате форматировать флешку для Андроид
SD-карты имеются практически в каждом Андроид-устройстве. И это вполне объяснимо – не совсем логично хранить весь имеющийся контент на внутреннем накопителе, тем более, объём внутренней памяти, у большинства девайсов очень небольшой, а вот с помощью флешки память устройства можно увеличить от двух до 32 гигибайт и даже больше, дело только в вашем желании и финансовых возможностях.
Правда, нередки случаи, когда Android-устройство начинает некорректно работать с картой памяти из-за возникновения различных проблем, избавиться от которых можно процедурой форматирования карты памяти.
Что такое форматирование флешки
Под форматированием карты памяти нужно понимать процедуру обработки любого цифрового накопителя данных (информации). Цель этой процедуры – упорядочение или полное изменение структуры накопителя.
Как было сказано выше, форматировать можно все носители информации, будь то винчестеры, USB flash-карты или Эс-Ди карты памяти.
Внимание! Перед тем, как приступить к форматированию, нужно обратить внимание на то, что в результате процедуры вся информация, находящаяся на накопителе, будет стёрта и восстановить её, зачастую, не представляется возможным.
С другой стороны, в процессе форматирования система обнаруживает и исправляет повреждённые фрагменты структуры.
В какой формат форматировать флешку для андроид
Существует несколько типов файловых систем, например, NTFS, FAT, FAT32, exFAT и др. Все они имеют как свои плюсы, так и минусы. Об этом давайте поподробнее.
Большинство устройств с ОС Android поддерживает FAT32. Основными достоинствами этой системы можно назвать хорошую скорость работы и совместимость. Например, в бытовом DVD-плеере, фотопринтере или медиапроигрывателе, если вставить такой накопитель, все файлы будут доступны и нормально читаться.
Ещё одна файловая система, предназначенная для flash-накопителей – exFAT.
Она создана относительно недавно той же Microsoft и по-моему, это идеальный вариант и для флешек и для карт памяти, поскольку представляет собой ФС FAT32, в которой сняты ограничения.То есть, размер файлов, а так же разделов в ней может быть любых величин, а количество файлов, хранящихся в одной папке, практически не ограничено.
*Примечание: для некоторых бытовых приборов и компьютеров на Windows XP этот формат неактуален.
Современной и надёжной считается NTFS – файловая система, заменившая в современных ПК, описанную выше, FAT32. Безусловным плюсом NTFS можно назвать и обеспечение более высокого уровня безопасности информации.
На что нужно обратить внимание — это размер скачиваемых файлов. Дело в том, что, в FAT32 размер файла ограничен до 4 Гбайт, поэтому при скачивании фильма или любого приложения большего размера, система будет выдавать ошибку «Недостаточно места в памяти устройства», хотя на самом деле места ещё предостаточно:
Что нужно сделать, чтобы Андроид увидел флешку
Итак, чтобы ваш смартфон Android видел флешку, нам нужно поменять на ней формат. Для этого существует несколько способов, о которых читайте дальше.
С помощью функций ОС устройства
На некоторых телефонах есть возможность беспроблемно поменять файловую систему. Для этого, через основные «Настройки» открываем раздел «Память». Находим пункт «Настройки памяти», затем строку «Форматировать карту памяти», открываем и меняем файловую систему с FAT32 на NTFS. Теперь можно нажать «ОК» и дождаться завершения процесса.
Далеко не во всех моделях Андроид устройств есть инструмент, позволяющий изменить файловую систему. В таком случае воспользуемся инструментами ПК.
С помощью компьютера
В ОС Windows функция форматирования стандартна и особых сложностей не представляет. Итак, подключаем своё устройство Андроид к компьютеру с помощью USB-кабеля, не забываем включить отладку по USB:
Теперь на ПК нажимаем «Пуск», далее «Компьютер» (или «Мой компьютер»).
Среди отображённых дисков находим съёмный носитель своего устройства, на скриншоте это диск «Е», я назвала его MAIN, чтобы не спутать с внутренней памятью телефона, так как, по умолчанию оба этих диска будут называться «съёмный носитель», отличаясь лишь литерой («Е», «F» или как-то иначе). Щёлкаем правой кнопкой мыши по диску «Е», в выпавшем списке действий выбираем «Форматировать»:
В открывшемся окне нажимаем стрелку в поле с текущим форматом FAT32 и выбираем формат NTFS. Затем активируем кнопку «Начать»:
*Примечание:
- Убедитесь, что ваш телефон — единственный съёмный диск, подключенный к компьютеру.
- Чтобы удостовериться, что форматированию будет подвергнута именно SD-карта (на скриншоте диск «Е»), проверьте её содержимое.
Если вы выбрали для своего флеш-накопителя формат exFAT, то, руководствуясь действием, отображённым выше на снимке экрана, вместо FAT32 выберите не NTFS, а exFAT.
С помощью функции convert
Этот способ позволяет выполнить процедуру преобразования файловой системы без потери данных на флеш-накопителе. И, тем не менее, мой совет – на всякий случай позаботиться о сохранении информации. Итак.
Подключаем смартфон к ПК, как указано выше. Не забываем активировать отладку по USB. На ПК, в левом нижнем углу жмём на кнопку «Пуск», в поиске вводим «cmd», по завершении поиска программы, нажимаем клавишу «Enter»:
Теперь, в открывшемся окне командной строки вводим convert E: /fs:ntfs, где «Е» — литера съёмного диска (SD-карты), который будет подвергнут процедуре форматирования:
Поле командной строки может выглядеть иначе (в зависимости от операционной системы), что не меняет применяемые действия:
Есть и другой путь добраться до командной строки: На компьютере нажимаем «Пуск», затем «Все программы», внизу списка выбираем «Стандартные», находим пункт «Командная строка», щёлкаем по нему правой кнопкой мыши. Из появившегося списка открываем «Запуск от имени администратора». На запрос программы о внесении изменений, отвечаем утвердительно, после чего можно будет вносить изменения, как описано выше.
*Примечание:
- Программы, запущенные с диска, который будет преобразован, необходимо закрыть.
- Перед началом процедуры форматирования позаботьтесь о том, чтобы заряд батареи был не менее 50 — 70%.
- Не забудьте сохранить важные данные.
Мы рассказали, в какой формат форматировать флешку для Андроид в целях изменения файловой системы. Но, как было сказано выше, процедуру форматирования можно применять и для очистки карты памяти. Об этом читаем здесь.
Реализуем выбор файла (File Picker). Система разрешений Android. Получение списка файлов
Итак, мы продолжаем создание приложения, которое позволяет просматривать список установленных приложений, а так же удалять их и устанавливать новые. Мы остановились на том, что начали реализовывать Activity, которая позволит нам выбрать файл для установки.
Прежде чем предоставить пользователю список файлов для выбора, нужно получить этот список.
Система разрешений Android
Приложение для Android может получить доступ к множеству вещей в системе, одна из этих вещей — файлы.
Для того, чтобы пользователь знал, что именно может делать приложение, а так же мог контролировать доступ приложения к функциям системы существует система разрешений.
Приложение должно запросить разрешение (Permission) пользователя, прежде чем оно получит доступ к определенным функциям системы. Разрешения могут быть явными или неявными, метод получения зависит от типа разрешения. Существует два типа разрешений:
- Обычные — разрешения, требующиеся для получения данных, которые не опасны для «чувствительных» данных пользователя. Например, разрешение для доступа в интернет. Такие разрешения просто декларируются в AndroidManifest.xml, пользователь видит их при установке приложения.
- Опасные — разрешения, требующиеся для получения данных, затрагивающих приватные данные пользователя (как запись, так и чтение). Пример таких данных — контакты, файлы на SD-карте (реальной или виртуальной). Когда приложение запрашивает такое разрешение, пользователю показывается диалог, в котором он может предоставить доступ или отказать в нём.
Все опасные разрешения разделены на соответствующие группы разрешений. Например, приложение запрашивает доступ к изменению контактов, и при этом пользователь уже одобрил чтение контактов — в таком случае, система разрешит доступ к изменению контактов без запроса через диалог.
В случае, если пользователь отказывает в разрешении, приложение может запросить его повторно, и диалог покажется снова. При этом в диалоге будет присутствовать галочка, позволяющая больше не спрашивать пользователя об этом разрешении.
Кроме того, пользователь всегда может подтвердить или же отозвать разрешение в настройках.
Давайте запросим разрешение на получение списка файлов.
В первую очередь, добавим соответствующее разрешение в AndroidManifest.xml.
Разрешения добавляются с использованием тэга uses-permission с атрибутом android:name, в котором указывается название разрешения, которое мы хотим получить. Добавляется этот элемент перед тэгом application.
Нам нужно разрешение android.permission.READ_EXTERNAL_STORAGE, поэтому наш манифест будет выглядеть так:
Теперь в FilePickerActivity создайте метод initFileManager():
private void initFileManager() { }
В нём мы в первую очередь проверим, есть ли у нас разрешение на чтение файлов.
Делается это вызовом метода ContextCompat.checkSelfPermission(), который возвращает PackageManager.PERMISSION_GRANTED, если пользователь предоставил разрешение, или PackageManager.PERMISSION_DENIED, если пользователь отказал в нём.Если разрешения нет, то нужно использовать метод ActivityCompat.requestPermissions(), чтобы запросить разрешение. С помощью этого метода можно запросить несколько разрешений подряд.
Итак, добавьте в FilePickerActivity следующий код:
private void requestPermissions() { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PERMISSION_REQUEST_CODE );}
В этом методе мы запрашиваем разрешение.
Теперь добавьте такой код в метод initFileManager():
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { // Разрешение предоставлено fileManager = new FileManager(this);} else { requestPermissions();}
Кроме того, в классе FilePickerActivity нужно создать константу PERMISSION_REQUEST_CODE — когда пользователь предоставит разрешение, нам придёт уведомление, и по этому коду мы сможем понять, какое именно разрешение было предоставлено (если мы запрашивали несколько):
private static final int PERMISSION_REQUEST_CODE = 1;
А теперь обработаем событие предоставления разрешения. Для этого добавьте следующий метод:
@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults);}
В этом методе мы должны проверить, предоставил ли пользователь разрешение:
if (requestCode == PERMISSION_REQUEST_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Log.i(TAG, «Permission granted!»); initFileManager(); } else { Log.i(TAG, «Permission denied»); requestPermissions(); // Запрашиваем ещё раз }}
Ну и теперь вызываем initFileManager() в onCreate():
@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_file_picker); initFileManager();}
Теперь запустите приложение и откройте экран выбора файла:
Запрос разрешения
Если вы нажмёте на кнопку Deny, диалог покажется ещё раз, и будет показываться до тех пор, пока пользователь не нажмёт Allow или не запретит запрашивать разрешение.
На самом деле, бесконечно запрашивать разрешение — это не очень хорошая практика. В случае, если пользователь не подтвердил доступ с первого раза, нужно показать ему информацию о том, зачем нам нужно это разрешение, и что приложение не будет без него корректно работать, после чего предложить нажать на кнопку, чтобы показать диалог ещё раз.
Но для наших нужд в данный момент это не нужно, поэтому оставим пока что такой вариант.
FileManager
Теперь создадим класс, который будет ответственен за получение списка файлов. В нём должна храниться текущая директория, а так же должна быть возможность получения списка файлов в текущей директории с возможностью сортировки.
Создайте новый класс FileManager:
public class FileManager { }
Объявите в нём поле currentDirectory:
private File currentDirectory;
Так же пригодится поле rootDirectory, в котором мы укажем директорию, выше которой подниматься будет нельзя (это будет та же директория, что и currentDirectory при создании):
private final File rootDirectory;Теперь создайте конструктор. В конструкторе мы должны проинициализировать currentDirectory.
По умолчанию это будет корень SD-карты. Однако, если SD-карта недоступна, то будем использовать директорию приложения. Для доступа к директории приложения нам понадобится контекст.
Конструктор в итоге будет выглядеть вот так:
public FileManager(Context context) { File directory; if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { directory = Environment.getExternalStorageDirectory(); } else { directory = ContextCompat.getDataDir(context); } rootDirectory = directory; navigateTo(directory);}
Сперва мы проверяем, доступна ли SD-карта. Если доступна, то получаем её, используя метод Environment.getExternalStorageDirectory(). В ином случае получаем путь к директории данных нашего приложения (в нашем случае это будет /data/data/com.test.packages/).
Обратите внимание: несмотря на то, что в большинстве случаев SD-карта доступна по пути /sdcard/, ни в коем случае нельзя использовать эту строковую константу.
Вместо этого нужно всегда использовать Environment.
getExternalStorageDirectory(), иначе может получиться так, что доступа к карте вы не получите! То же самое справедливо и для директории данных, которую мы используем, если карта недоступна.
В последней строчке мы переходим в нужную нам директорию, используя метод navigateTo(). Этот метод мы ещё не создали — самое время сделать это:
public boolean navigateTo(File directory) { // Проверим, является ли файл директорией if (!directory.isDirectory()) { Log.e(TAG, directory.getAbsolutePath() + » is not a directory!»); return false; } // Проверим, не поднялись ли мы выше rootDirectory if (!directory.equals(rootDirectory) && rootDirectory.getAbsolutePath().contains(directory.getAbsolutePath())) { Log.w(TAG, «Trying to navigate upper than root directory to » + directory.getAbsolutePath()); return false; } currentDirectory = directory; return true;}
Отлично! Теперь нужно создать метод для навигации в директорию, которая находится выше. Пользователь будет попадать в неё, нажимая кнопку назад:
public boolean navigateUp() { return navigateTo(currentDirectory.getParentFile());}
Ну и напоследок — метод, с помощью которого мы будем получать список файлов в текущей директории:
public List getFiles() { List files = new ArrayList(); files.addAll(Arrays.asList(currentDirectory.listFiles())); return files;}
На данный момент может показаться, что этот метод избыточен, но позже вы поймёте, что мы создали его не просто так 🙂
Отображаем список файлов
Пришло время отобразить список файлов. Процесс почти ничем не отличается от того, что мы делали ранее с установленными приложениями.
Основы безопасности операционной системы Android. Native user space, ч.1
В этой статье я попробую рассмотреть безопасность чуть-чуть повыше ядра, а именно: как работает безопасность в Native user space. Мы коснемся темы процесса загрузки операционной системы и рассмотрим структуру файловой системы Android.
Как я уже говорил, я не очень силен в Linux, поэтому если заметите неточности, то исправляйте — меня научите и статью улучшите. Так как эта тема довольно обширная, я решил разбить её на две части.
В первой части мы рассмотрим процесс загрузки операционной системы и особенности файловой системы. Всем кому интересно, добро пожаловать!
Список статей
Здесь собраны ссылки на мои статьи из этой темы:
Что подразумевается под Native user space
Под Native user space подразумеваются все компоненты пространства пользователя, которые выполняются вне Dalvik Virtual Machine, и которые не являются частью Linux kernel.
Файловая система Android
Для начала давайте рассмотрим структуру файловой системы Android. Хотя Android и базируется на Linux kernel, привычную нашему глазу структуру файловой системы мы здесь не увидим. Давайте запустим эмулятор и посмотрим, что у нас есть. Для этого выполним комманду: adb shell ls -al В моем терминале для эмулятора на Android 4.
2 я вижу следующий результат: drwxr-xr-x root root 2013-04-10 08:13 acctdrwxrwx— system cache 2013-04-10 08:13 cachedr-x—— root root 2013-04-10 08:13 configlrwxrwxrwx root root 2013-04-10 08:13 d -> /sys/kernel/debugdrwxrwx—x system system 2013-04-10 08:14 data-rw-r—r— root root 116 1970-01-01 00:00 default.
propdrwxr-xr-x root root 2013-04-10 08:13 devlrwxrwxrwx root root 2013-04-10 08:13 etc -> /system/etc-rwxr-x— root root 244536 1970-01-01 00:00 init-rwxr-x— root root 2487 1970-01-01 00:00 init.goldfish.rc-rwxr-x— root root 18247 1970-01-01 00:00 init.rc-rwxr-x— root root 1795 1970-01-01 00:00 init.trace.rc-rwxr-x— root root 3915 1970-01-01 00:00 init.usb.
rcdrwxrwxr-x root system 2013-04-10 08:13 mntdr-xr-xr-x root root 2013-04-10 08:13 procdrwx—— root root 2012-11-15 05:31 rootdrwxr-x— root root 1970-01-01 00:00 sbinlrwxrwxrwx root root 2013-04-10 08:13 sdcard -> /mnt/sdcardd—r-x— root sdcard_r 2013-04-10 08:13 storagedrwxr-xr-x root root 2013-04-10 08:13 sysdrwxr-xr-x root root 2012-12-31 03:20 system-rw-r—r— root root 272 1970-01-01 00:00 ueventd.goldfish.rc-rw-r—r— root root 4024 1970-01-01 00:00 ueventd.rclrwxrwxrwx root root 2013-04-10 08:13 vendor -> /system/vendorЯ отмечу здесь только главные директории и те, которые нам пригодятся в будущем. В Интернете можно найти описание и предназаначение других директорий. Можно заметить, что некоторые директории такие же, как и в Linux, например, /dev, /proc, /sys, /mnt, /etc И их предназначение в основном такое же, как и в Linux. Кстати, отметьте, что мы не видим /bin и /lib директорий. Где они скрылись, я расскажу чуть позже.
C другой стороны можно заметить директории, которых в Linux вообще нет. Среди них нас интересуют /data, /system, /cache, /init, /init.rc Давайте рассмотрим их назначение поподробнее.
/system Это главная директория, где хранятся неизменяемые компоненты Android системы. Если проводить аналогию, то эта папка похожа на папку C:windows, доступную только для чтения. Т.е. изменять данные в этой директории мы не можем. Как раз здесь можно найти директории /bin и /lib, где хранятся различные исполняемые файлы и shared libraries. Кроме того, здесь же лежат системные приложения, которые встроены в операционку и которые, по умолчанию, нельзя удалить. Содержимое этой директории формируется во время компиляции операционной системы.
/data Т.к. /system у нас доступна только для чтения, то должна быть директория где хранятся изменяемые данные. /data как раз ею и является. Например, в эту директорию в /data/app сохраняются apk файлы устанавливаемых приложений, а в /data/data хранятся их данные (эту директорию мы подробно рассматривали в прошлой статье).
/cache Это просто временное хранилище. Также в эту директорию сохраняются, а потом из неё запускаются системные обновления.
Чтобы понять, что такое /init файл и для чего нужны непонятные файлы с расширением *.rc, рассмотрим процесс загрузки системы.
Процесс загрузки Android
Давайте рассмотрим несколько шагов процесса загрузки операционной системы Android. Эта картинка взята из книги «Embedded Android», там же можно найти и более детальное описание. Хотя в целом я и понимаю процесс, но для меня это больше магия 🙂
CPU. Когда вы нажимаете на кнопку включения, на процессор вашего устройства начинает подаваться напряжение.
Так как до этого момента процессор был выключен, и так как он не способен сохранять свое состояние без подачи напряжения, то сразу после старта он находится в некотором неинициализированном состоянии. В данном случае процессор считывает из своего специального регистра некоторый жестко зашитый адрес и начинает выполнять инструкции начиная с него.
Чаще всего, этот адрес указывает на чип, в который зашит bootloader (загрузчик).
Bootloader. Bootloader инициализирует RAM и загружает в неё Linux kernel. Кроме того Bootloader создает RAMdisk.
Linux kernel. Ядро инициализирует различные подсистемы, встроенные драйвера и монтирует root filesystem (корневую файловую систему). После этого ядро может запускать первую программу. На этом магия заканчивается и дальше всё становится более-менее понятно.
Init
Первой программой в случае Android является init. Исполняемый файл находится в корневой директории (/init). Именно эту программу стартует ядро после своей загрузки. Её исходники находятся в папке system/core/init/ Давайте в них слегка покопаемся. Нас интересует system/core/init/init.c: …int main(int argc, char **argv){ …
/* clear the umask */ umask(0); /* Get the basic filesystem setup we need put * together in the initramdisk on / and then we will * let the rc file figure out the rest.
*/ mkdir(«/dev», 0755); mkdir(«/proc», 0755); mkdir(«/sys», 0755); mount(«tmpfs», «/dev», «tmpfs», MS_NOSUID, «mode=0755»); mkdir(«/dev/pts», 0755); mkdir(«/dev/socket», 0755); mount(«devpts», «/dev/pts», «devpts», 0, NULL); mount(«proc», «/proc», «proc», 0, NULL); mount(«sysfs», «/sys», «sysfs», 0, NULL); … init_parse_config_file(«/init.rc»); …
}
Вначале мы создаем и монтируем некоторые необходимые для работы директории, а потом парсим файл /init.rc и выполняем то, что распарсили. Формат /init.rc файла очень хорошо описан в readme, там же можно найти и пример. Если кратко, то этот файл представляет собой набор actions (секций — именнованная последовательность комманд).
Каждая последовательность команд срабатывает по определенному trigger (триггеру).
Например, следующая последовательно — это action, в которой trigger — это fs, а последовательность команд — это набор mount команд: on fs # mount mtd partitions # Mount /system rw first to give the filesystem a chance to save a checkpoint mount yaffs2 mtd@system /system mount yaffs2 mtd@system /system ro remount mount yaffs2 mtd@userdata /data nosuid nodev mount yaffs2 mtd@cache /cache nosuid nodev
Исходный файл /init.rc находится в system/core/rootdir/init.rc Давайте рассмотрим некоторые основные его части, хотя я вам очень советую просмотреть его полность. После этого многие вещи вам должны стать понятны. Итак, начинается наш файл следующими строками: import /init.usb.rcimport /init.${ro.hardware}.rcimport /init.trace.rc
Они означают, что кроме init.rc файла нужно также импортировать настройки из файлов init.usb.rc, init.trace.rc и из файла с непонятным именем init.${ro.hardware}.rc Впрочем, ${ro.hardware} — это просто переменная, значение которая определяет тип железа. В случае эмулятора, её значение, например, — goldfish. Далее определяются переменные окружения: …on init … # setup the global environment export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin export LD_LIBRARY_PATH /vendor/lib:/system/lib export ANDROID_BOOTLOGO 1 export ANDROID_ROOT /system export ANDROID_ASSETS /system/app export ANDROID_DATA /data export ANDROID_STORAGE /storage export ASEC_MOUNTPOINT /mnt/asec export LOOP_MOUNTPOINT /mnt/obb export BOOTCLASSPATH /system/framework/core.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar … После этого происходит инициализация переменных, необходимых для работы устройства. Если вас заинтересует эта тема, то вы легко найдете информацию о той или иной комманде. Давайте подробно рассмотрим следующий блок (который я уже приводил в этой статье): on fs # mount mtd partitions # Mount /system rw first to give the filesystem a chance to save a checkpoint mount yaffs2 mtd@system /system mount yaffs2 mtd@system /system ro remount mount yaffs2 mtd@userdata /data nosuid nodev mount yaffs2 mtd@cache /cache nosuid nodev
MTD — Memory Technology Devices. Если в общих чертах, то MTD — это специальный чип с энергонезависимой (т.е. данные на этом чипе сохраняются после перезагрузки или выключения) flash-памятью (типа NOR или NAND), на который сохраняются образы дисков. В этой статье более подробно рассказывается об этом типе устройств, а также об ограничениях. Специально для этих разновидностей flash-памяти были разработаны специальные файловые системы, например, YAFFS. Одно из самых важных ограничений этих типов памяти заключается в том, что для того чтобы записать данные в сектор, куда уже записаны какие-то данные, вам надо полностью сначала стереть весь сектор. Поэтому производители стали переходить на новый тип блочной flash-памяти (eMMC), на которые можно поставить обычную ext4 файловую систему и избавиться от указанного ограничения. Т.к. я показываю пример init.rc файла для эмулятора, где вся работа эмулируется, то в нем по умолчанию используется файловая система YAFFS2 (думаю, что это пережитки прошлого, т.к. YAFFS2 использовалась для всех устройств до Android 2.2). В реальном устройстве (это как раз один из примеров, когда необходимо использовать init.rc файл для определенного железа) эти комманды будут перезаписаны. Например, в случае устройства herring (Google Nexus S), в файле init.herring.rc эта секция выглядит следующим образом: on fs mkdir /efs 0775 radio radio mount yaffs2 mtd@efs /efs noatime nosuid nodev chmod 770 /efs/bluetooth chmod 770 /efs/imei mount_all /fstab.herring …
Где fstab.herring — это файл, содержимое которого выглядит следующим образом: …/dev/block/platform/s3c-sdhci.0/by-name/system /system ext4 ro wait/dev/block/platform/s3c-sdhci.0/by-name/userdata /data ext4 noatime,nosuid,nodev,nomblk_io_submit,errors=panic wait,encryptable=/efs/userdata_footer
Как вы могли заметить, /system, /data, /cache — это просто mounting points (точки монтирования файловой системы), которые указывают либо на MTD устройства (в случае эмулятора), либо на блочные устройства (в случае настоящего устройства), куда записаны соответствующие дисковые образы (system.img, userdata.img и cache.img). Я не уверен, но думаю, что внутри смартфона находится один единственный чип с flash-памятью, разделенный на partitions (тома), в каждый из которых записан соответствующий образ. Этот чип с flash-памятью — то, что мы знаем под именем Internal storage (внутренняя память), объем которой — один из основных параметров смартфона.
Следует заметить, что /system смонтирован read-only (только для чтения). Это означает, что содержимое данного раздела не изменяется в процессе работы устройства, а только когда вы, например, обновляете систему на вашем устройстве (используя системные обновления).
Продолжим рассматривать наш init.rc. По триггеру post-fs-data формируется базовая структура файловой системы /data раздела. Там, в общем всё понятно — набор mkdir, chown, chmod команд.
Далее init.rc запускает несколько демонов. Если вернуться к рисунку в начале статьи, то они перечислены в блоке Native daemons. На этом мы пока остановимся. Как вы могли заметить из рисунка, я не полностью рассмотрел процесс загрузки операционной системы. Некоторые непокрытые этапы я рассмотрю в следующих статья.
Заключение
В следующей части я расскажу, откуда берутся образы system.img, userdata.img и cache.img и рассмотрю безопасность на уровне Native user space. Как всегда приветствуются исправления, дополнения, а так же предложения, о чем написать. И хотя у меня уже есть некоторый план, о чем писать в следующих статья, я готов его подкорректировать.