- Точка монтирования в android
- Как я могу просмотреть таблицу внутренних разделов Android?
- Монтирование в Android
- Монтирование флешек в Android
- Монтирование файлов образов
- Монтирование папок
- Получение пути к карте памяти SD Card на Android
- Терминология
- Результаты поиска
- Описание кода
- Пример использования
- Заключение
Точка монтирования в android
Доброго времени суток! Купил смартфон на android 4. В нем присутствует встроенная флешка помимо встроенной памяти. Встроенная паять 700 мб, а встроенная флешка 1,8 GB. Еще в телефон можно вставить внешнюю, в моем случае-это 8GB. Так проблема заключается в том, что встроенная флешка монтируется как sdcard, а внешняя ext_card. Вопрос: Можно ли изменить точки монтирования? Или хотя бы подскажите программу, которая умеет перемещать программы на внешнюю карту т.е. ext_card. А то много программ на внутреннюю память не «затолкаешь». Буду очень благодарен.
Ты в натсройках приложения можешь его подвинуть на сд карту.
Рут не проблема. app2sd я же говорю, что монтируется под флешку внутренняя память телефона! /sdcard т.е. все программы для переноса приложений определяют внутреннюю память как флешку. А флешка монтируется как /ect_card.
Можно ли изменить точки монтирования?
Если этого нет в настройках и нет root-а то нельзя. Иначе либо тыкать настройки либо если есть root то можно вообще все.
В выходные получу рут и отпишусь.
А кто нибудь расскажет, как изменить точки монтирования? нужно поменять местами /ext_card и /sdcard
Ну ,тогда вам надо ковырять vold.conf(прям как в соляре), или vold.fstab. Искать нужно в /etc/, вот только скорее всего данный файл находится в initrd-образе, а на корневом разделе вашего девайса его может и не быть. Прийдётся модифицировать initrd-образ, но думаю что всё получится.
В /etc/vold.conf прописаны ваши разделы. Синтаксис там своеобразный, но поменять местами пути к устройству у встроенной памяти, и карты памяти не сложно. Любой текстовый редактор подойдёт для такого дела.
спасибо. В выходные буду ковырять.
Удачи:) Поделитесь потом результатом. Как правило, внешняя карта на запись не так быстра, как внутренняя. Можно ещё через adb заюзать команду pm setInstallLocation 2, которая активирует кнопку Move to SD(для тех приложений, которые не имеют такой кнопки) в центре установленных приложений. Это стандартная фича данной ОС(перенос на карту памяти только тех приложений ,которые вы хотите туда перенести). Мы лишь активируем фичу для всех программ, а не тех ,разрабы которых позаботились об этом. Вот только программы с виджетами переносить на карту памяти не стоит. Кстати, возможно это даже более оптимальный вариант в вашем случае. Но повозиться прийдётся не мало, для каждого приложения прийдётся нажимать магическую кнопку(как в ролике) . В видео объясняют в частности, почему приложения с виджетами переносить не стоит.
Только не /etc/vold.conf а /system/etc/vold.fstab
там будет (должно) 2 записи вроде такой:
dev_mount sdcard /mnt/sdcard auto /devices/platform/msm_sdcc.3/mmc_host/mmc1
соответственно меж ними нужно просто поменять точки монтирования.
Подредактировать прямо на девайсе можно удобно Root Explorer-ом, он и в RW сам смонтировать сможет, и встроенный редактор вполне вменяем.
Источник
Как я могу просмотреть таблицу внутренних разделов Android?
Я рутировал свое устройство, перевел его в режим восстановления и связал его с ПК с помощью оболочки adb .
Как я могу просмотреть список устройств хранения и разделов?
Примечание: fdisk не работает.
Я верю, что вы хотите cat /proc/mtd .
Также полезно: mount .
Я обычно использую комбинацию из следующих 4 команд и сопоставляю их, поскольку каждая из этих команд дает часть информации, которая может понадобиться.
Используя df перечисляет псевдоним пути файловой системы и информацию о размере, как показано ниже (общий размер, используемый, свободный и размер блока)
(. вырезано по космическим причинам)
Использование cat /proc/mounts показывает путь к файлу раздела, псевдоним, тип файловой системы, индекс запуска, число блоков, состояние чтения / записи (и другие параметры отдельного раздела, в которых я не совсем уверен)
- NB: вывод cat /proc/mounts может быть немного грязным, но если вы прочитаете его построчно (запись за записью), вы получите информацию
(. вырезано по космическим причинам)
Используя cat /proc/partitions вы получите фактический идентификатор имени раздела и количество блоков в разделе.
(. вырезано по космическим причинам)
Используя ls -al /dev/block/platform/msm_sdcc.1/by-name вы получаете отображение между псевдонимом раздела и путем к файлу фактического раздела (вы также получаете владельца, их группу пользователей и т. Д.)
Источник
Монтирование в Android
Если вы пользовались операционной системой Linux, а потом у вас появилось устройство Android у вас наверное возникал вопрос как использовать такую полезную функцию как монтирование в Android. Поскольку Android основан на ядре Linux он поддерживает большинство его функций, но не все они открыты обычному пользователю, а для некоторых необходим root доступ. В этой инструкции я опишу монтирование флешек, файлов и папок в Android.
Монтирование флешек в Android
Это делается очень просто с помощью меню Настройки. Откройте настройки системы, затем перейдите в пункт Память:
В низу есть пункт подключить карту памяти, он станет активным при подключении флешки:
Вот так это делается. Но если вы хотите примонтировать флешку из терминала, возникнут кое какие проблемы. Первое — в системе по умолчанию нет приложения терминала, но его не сложно установить из GooglePlay. Второе — нужно узнать имя файла флешки, в Linux имена стандартны, но в Android для каждой прошивки флешка может называться по разному. Третье — стандартная команда mount имеет не совсем привычный синтаксис.
И так приступим. Откройте GooglePlay и установите Android Terminal Emulator если еще этого не сделали. Затем нам нужно будет узнать имя файла флешки. Самый надежный способ это сделать снимок каталога /dev/block/ со вставленной флешкой и без нее, а затем сравнить эти файлы:
Делаем первый снимок:
Вынимаем флешку и делаем второй снимок:
Сравнивать файлы вручную дело трудное, казалось бы можно использовать стандартную в Linux утилиту diff, но в Android по умолчанию ее нет. Можно установить BusyBox, который добавляет джентельменский набор консольных утилит в систему. Или можно использовать андроид приложение для сравнения файлов например DiffTool
Сравниваем с помощью diff:
Или с помощью Diff Tools:
Здесь mmcnlk1 — имя устройства флешки, mmcnlk1p1 -имя раздела на флешке, такой себе аналог sda и sda1 для андроид. У вас может выглядеть по другому. Теперь когда мы знаем имя флешки можно монтировать:
Перед вводом команды необходимо получить права рут с помощью команды su. Файловую систему указывать обязательно, иначе получите ошибку синтаксиса. Доступны еще опции -r — монтировать в режиме только чтение, -w монтирование в режиме записи, -o дополнительные опции, аналогичны таковым в linux.
Монтирование файлов образов
Иногда возникает необходимость посмотреть содержание образа диска на телефоне, но сделать это на первый взгляд не так то просто. Монтировать образы в Android можно с помощью консоли или Android приложения. Для монтирования с помощью терминала наберите:
$ mount -t iso9660 -o ro,loop /имя_файла.iso /точка_монтирования
Но здесь есть один нюанс — ядро должно поддерживать монтирование loop устройств. Как и в предыдущем случае необходимо получить root права с помощью команды su, -t — это файловая система образа.
Также можно просматривать образы с помощью приложения ISO Extractor.
Монтирование папок
Наверное это самое легкое в этой статье. Для монтирования из терминала наберите:
Также существует множество утилит для монтирования папок например FolderMount.
Теперь вы знаете какие чудеса можно творить с помощью консоли в Android. Но это еще только маленькая частичка. Консоль Android не смотря на все ограничения позволяет делать очень интересные вещи, но об этом уже в следующих статьях.
Источник
Получение пути к карте памяти SD Card на Android
Разрабатывая приложение для проведения соревнований, я столкнулся с проблемой хранения базы данных. Проблема состояла в том, как мне определить внешнюю карту памяти. В целом поиск в сети точного ответа не дал. Поэтому, объединив все найденные результаты, я собрал свой класс. Если кому интересно, смотрим под катом.
Итак, начнем с теории.
Терминология
Гугл нам говорит, что есть следующие понятия:
- Внутренняя (internal) память — это часть встроенной в телефон карты памяти. При ее использовании по умолчанию папка приложения защищена от доступа других приложений (Using the Internal Storage).
- Внешняя (external) память — это общее «внешнее хранилище», т.е. это может быть как часть встроенной памяти, так и удаляемое устройство. Обычно это часть встроенной памяти, как удаляемое устройство я видел в последний раз на андройде 2.2, где встроенная память была около 2Гб, и подключаемая память становилась внешней (Using the External Storage).
- Удаляемая (removable) память — все хранилища, которые могут быть удалены из устройства без «хирургических» вмешательств.
До версии KitKat 4.4 API не предоставляло функционала для получения путей к внешней памяти. Начиная с этой версии (API 19) появилась функция public abstract File[] getExternalFilesDirs (String type), которая возвращает массив строк с путями к внутренней и внешней памяти. Но как же быть с нашей SD Card, которая вставлена в слот? Путь к ней мы опять не можем получить.
Результаты поиска
Чтобы ответить на поставленный вопрос я обратился к всезнающему гуглу. Но и он мне не дал четкого ответа. Было рассмотрено множество вариантов определения от использования стандартных функций, которые ведут к внешней памяти, но ничего общего с удаляемыми устройствами хранения данных они не имеют, до обработки правил монтирования устройств (Android же на ядре Linux работает). В последних случаях были использованы «зашитые» пути к папке с примонтироваными устройствами (в различных версиях эта директория разная). Не стоит забывать, что от версии к версии правила монтирования меняются.
В конечном итоге я решил объединить все полученные знания и написал свой класс, который может нам вернуть пути к внешним и удаляемым устройствам.
Описание кода
Был создан класс MountDevice, который содержит в себе путь к устройству, тип устройства и некий хэш.
Типов устройств выделено два (внутреннюю память я не стал трогать, так как к ней доступ можно получить через API системы).
И был создан класс StorageHelper, который и осуществляет поиск доступных карт памяти.
В классе StorageHelper реализовано два способа поиска — через системное окружение (Environment) и с использованием утилиты Linux mount, а точнее результата ее выполнения.
Способ первый — Environment
При работе с окружением я использую стандартную функцию getExternalStorageDirectory() для получения информации о внешней памяти. Чтобы получить информацию о удаляемой памяти, я использую переменную окружения «SECONDARY_STORAGE«.
Внешняя память всегда одна и обычно всегда есть, поэтому проверяем ее на читаемость, вычисляем хэш и запоминаем. Удаляемой памяти может быть много, поэтому необходимо полученную строку разбить по разделителю и проверять каждое значение.
Вариант решения взят со stackoverflow. Ответ где-то там внизу.
Способ второй — mount
Так как у меня долго не получалось заставить систему мне сказать путь к удаляемой памяти, я решил искать в сторону примонтированных устройств. В системе есть файлы конфигурации, в которых описаны правила монтирования внешних устройств. Все бы хорошо, но на Android версии 4.* к этому файлу простым смертным доступа нет, поэтому рассматривать этот способ не буду.
Вернемся к утилите mount. При запуске без параметров команда возвращает список смонтированных файловых систем. Удаляемые устройства имеют обычно формат файловой системы FAT, то будем выделять строки, в которых есть характеристика «fat«. Внешняя память будет характеризоваться параметром «fuse«.
Примечание: при использовании такого способа не всегда корректно (скорее всего я что-то не учел) определяются типы смотнтированных устройств. Разницу замечал на разных версиях Android. Поэтому этот способ можно использовать как дополнительный.
Вариант решения взят со stackoverflow. Ответов там несколько примерно одинаковых.
Про дублирование
Многие замечали в директории монтирования устройств такую картину:
И что самое интересно, все это одна и та же внешняя карта памяти. Такое дробление начинается с версии Jelly Bean и сделано это для поддержки многопользовательского режима работы системы. Более подробно тут. И вот, чтобы не получать одну и туже карту памяти как различные устройства, необходим способ определения идентичности. Если бы был доступ к конфигурации монтирования, то и вопросов не было. Но доступа нет. Поэтому я тут подсмотрел решение с расчетом хэша для каждого устройства:
- создаем StringBuilder
- записываем в него общий размер устройства и размер используемого пространства устройства
- обходим содержимое корня устройства
- записываем имя каталога
- записываем имя файла и размер
- вычисляем hash
Пример использования
Заключение
Подробные рассуждения по этому вопросу понимания памяти в Android, некоторые советы можно прочитать тут.
Исходный код всего класса расположен еще нигде не расположен. На днях постараюсь разместить на gitHub.
Источник