Как заменить внутреннюю память андроид на карту памяти. Получаем список доступных устройств хранения информации

Как и обещал в комментариях к заметке «Deployment Manager или куда ещё можно задеплоить файлы », покопался ещё немного в файловой системе (а точнее в Иерархии каталогов). Основой для этой статьи стал вопрос от Дмитрия Кузьменко , очень надеюсь, что смог ответить на него в необходимом объёме. Немного поговорим об OC Android, производителях устройств работающих под управлением этой операционки, а также я покажу несколько вариантов получения списка доступных устройств хранения информации.


Продолжение для Android 4.4.* тут: Android 4.4 и запись на внешнюю карту памяти...

Upd (17.02.14). На основе комментариев внесены правки в приложения.
Upd2 (17.02.14). Обнаружено ложное срабатывание 3-го варианта, особенность пофиксил. Немного улучшил поиск.

Upd (30.03.14). Третий способ работает на версиях Android ниже 4.3. Для версий выше 4.3 код не напишу, т.к. не имею устройств с такой версией Android для анализа новой структуры.
Upd (21.04.14). Проверил код на Delphi XE6

Upd3 (15.07.14). Обновление исходного кода, обнаружена не правильная работа (ошибка AV) на некоторых устройствах

Постараюсь изложить всю суть кратко, чтобы не получилось 10 страниц текста.

Начнём с основ.

Операционная система Android основана на ядре Linux. В Unix-подобных операционных системах существует только один корневой каталог, а все остальные файлы и каталоги вложены в него. В большинстве UNIX-подобных систем съёмные диски, флеш-накопители и другие внешние устройства хранения данных монтируют в каталог /mnt, /mount или /media (в нашем случае это папка /mnt). UNIX-подобные операционные системы также позволяют автоматически монтировать диски при загрузке операционной системы.

Определяем список доступных устройств хранения информации.

Сразу нужно сказать, что в Android API я не нашёл метода, позволяющего определить подобный список. Поэтому первое, что приходит в голову, это проверка возможных путей самостоятельно и тут появляется первое «НО». Всё было бы просто, если бы не производители устройств, которые так и хотят что-то изменить в Android, вот и в этом случае они постарались. Я поэкспериментировал и выяснил, что количество возможных вариантов путей достаточно большое и узнать их все почти невозможно, разве что начать собирать общую базу таких вариантов со всех владельцев Android устройств.

В моих экспериментах участвовали (моё только одно - SGS2:):

  • Samsung Galaxy S Plus – Android 2.3.6
  • Samsung Galaxy S2 – Android 4.1.2
  • HTC Sensation Z710e – Android 4.0.3
  • HTC One X – Android 4.2.2
  • HTC Rhyme – Android 4.0.3

Теперь давайте посмотрим, какие пути доступны на этих устройствах, нам важны путь до внутренней карты (если есть), внешней карты (если есть) и usb устройств (если есть).

Как видите пути везде разные.

Вариант #1.

Составляем массив возможных значений и в цикле проверяем каждое на доступность при помощи обычной проверки на существование папки (TDirectory.Exists ), а также на пустоту папки (TDirectory.IsEmpty ).

Я составил общий список для данных устройств и написал небольшое приложение для проверки.

Мой список (основан на 5-ти популярных устройствах):

  • /mnt/sdcard
  • /mnt/sdcard/external_sd
  • /mnt/extSdCard
  • /mnt/usb
  • /mnt/UsbDriveA
  • /mnt/UsbDriveB
  • /mnt/UsbDriveC
  • /mnt/UsbDriveD
  • /mnt/UsbDriveE
  • /mnt/UsbDriveF

Поискав подобные пути в интернете, нашёл ещё 3 возможных пункта:

  • /mnt/external_sd
  • /mnt/usb_storage
  • /mnt/external

Дополнение от Дмитрия Кузьменко :

Sony Xperia V - 4.1.2

  • /mnt/sdcard
  • /mnt/ext_card
  • /mnt/usbdisk

Ещё немного:
Sony Xperia Go - 4.1.2

  • /mnt/sdcard
  • /mnt/ext_card
  • /mnt/usbdisk
Samsung Galaxy S4 - 4.2.2
  • /mnt/sdcard
  • /mnt/extSdCard
  • /mnt/UsbDriveA
  • /mnt/UsbDriveB
  • /mnt/UsbDriveC
  • /mnt/UsbDriveD
  • /mnt/UsbDriveE
  • /mnt/UsbDriveF
Готовый массив вы найдёте в коде ниже. Вы можете оставить в комментариях информацию о путях на ваших устройствах в таком виде:

Название устройства – версия Android

Прямой путь до внутренней памяти

Прямой путь до внешней карты памяти

Прямые пути до USB устройств

Все пути начинаются с папки /mnt/.


Или скопируйте и вышлите мне файл "/etc/vold.fstab" на почту infocean @ gmail.com или в комменты (не забудьте указать модель устройства и версию Android"а). Пожалуйста, указывайте также все папки, которые есть в директории /mnt/, это очень важно.

Приложение:

Uses System.IOUtils; const pathmnt: Array of String = ("/mnt/sdcard", "/mnt/sdcard/external_sd", "/mnt/extSdCard", "/mnt/usb", "/mnt/UsbDriveA", "/mnt/UsbDriveB", "/mnt/UsbDriveC", "/mnt/UsbDriveD", "/mnt/UsbDriveE", "/mnt/UsbDriveF", "/mnt/external_sd", "/mnt/usb_storage", "/mnt/external", "/mnt/ext_card", "/mnt/usbdisk"); procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin Memo1.Lines.Clear; Memo2.Lines.Clear; for i:= 0 to Length(pathmnt) - 1 do begin if TDirectory.Exists(pathmnt[i]) AND not TDirectory.IsEmpty(pathmnt[i]) then begin Memo1.Lines.Add(pathmnt[i]); Memo2.Lines.Add("True"); end else begin Memo1.Lines.Add(pathmnt[i]); Memo2.Lines.Add("False"); end; end; end;

Вариант #2.

Первый вариант имеет как плюсы, так и минусы (главный из которых это неполнота списка возможных путей), поэтому попробуем решить данную задачу другим способом.

Есть такой файлик «vold.fstab », лежит тут «/etc/»(«/system/etc/»). Это один из конфигурационных файлов в UNIX-подобных системах, который содержит информацию о различных файловых системах и устройствах хранения информации. Описывает, как диск (раздел) будет использоваться или как будет интегрирован в систему.

И есть файл «mounts », лежит тут «/proc/». Содержит информацию обо всех точках монтирования, используемых в устройстве. Важно понимать, что если карта памяти не упоминается в данном файле, то она не подключена. Это означает, что файл постоянно обновляется.

Пошагово:

  1. Читаем файл «vold.fstab »
  2. Проверяем каждое устройство на доступность, при помощи чтения файла «mounts » и поиска в нём нужной строки.

В этом варианте пока не будет кода, т.к. по какой-то неведомой мне причине, у меня не получается прочитать файл «mounts». В связи с этим предлагаю третий вариант.


Вариант #3.

Объединяем первый и второй варианты. Список будем брать из файла «vold.fstab », а проверять своими силами, не открывая при этом файл «mounts ». Зачем каждый раз мучать два файла, когда можно работать только с одним.

Пошагово:

  1. Читаем файл «vold.fstab »
  2. Составляем список устройств хранения информации (половина дела сделали)
  3. Теперь в цикле пробегаемся по списку и проверяем каждый путь с помощью «TDirectory.Exists » и «TDirectory.IsEmpty »
  4. Составляем список реально доступных устройств хранения информации

Update-17.02.14: Благодаря Дмитрию Кузьменко и общим усилиям выяснили, что файл «/etc/vold.fstab» в Sony Xperia V немного отличается от остальных, поэтому были внесены изменения в исходный код приложения. Всё проверили, работает! :) Исходники везде обновил.

Update2-17.02.14: В файле "/etc/vold.fstab" иногда встречаются (на некоторых устройствах) закомментированные строчки, которые очень похожи на искомые в моём коде, в связи с этим происходило ложное срабатывание. Эту особенность я пофиксил в новой версии кода.
Также пофиксил поиск нужных строчек, теперь он более универсален!

В общем, теперь код должен нормально отрабатывать на разных устройствах. Пробуйте, отписывайтесь в комменты, прикладывайте свой файл "/etc/vold.fstab" (не забывайте указывать модель устройства и версию Android).

Update3 - 15.07.14:
Читатель блога Sergey Yakimenko , обнаружил не правильную работу (чтение файла) третьего варианта на устройствах Huawei Ascend P6 и Reellex TAB-07 , о чём сообщил в комментариях.

После личной переписки и некоторого анализа, я выяснил, что за проблемы мешали работе.

Обнаруженные и исправленные проблемы:

  1. Пробелы в начале каждой найденной строчке. Исправлено при помощи "Trim"
  2. В найденных строчках используется табуляция вместо пробелов. Исправлено заменой символов табуляции на пробелы.
Код обновлён. Сергею большое спасибо.

Приложение:

Uses System.StrUtils, System.IOUtils; procedure TForm1.Button1Click(Sender: TObject); var OpenFileVold: TStringList; i: Integer; pathtemp: TStringDynArray; begin OpenFileVold:= TStringList.Create; try // Читаем файл OpenFileVold.LoadFromFile("/etc/vold.fstab"); for i:= 0 to OpenFileVold.Count - 1 do begin if (Pos("dev_mount", OpenFileVold.Strings[i]) > 0) OR (Pos("fuse_mount", OpenFileVold.Strings[i]) > 0) then begin // Update(15.07.14) // 1 - Удаляем пробелы в начале и в конце строке (избавляемся от AV) // 2 - Заменяем символы табуляции на пробелы pathtemp:= SplitString(StringReplace(Trim(OpenFileVold.Strings[i]), #9, " ", ), " "); // Проверяем первый символ строки на совпадение с символом "#" или "##", // чтобы не было ложных срабатываний if (pathtemp <> "#") AND (pathtemp <> "##") then begin if TDirectory.Exists(pathtemp) AND not TDirectory.IsEmpty(pathtemp) then begin Memo1.Lines.Add(pathtemp); end; end; end; end; finally OpenFileVold.Free; // FreeAndNil(SourceFile); end; end;

Итог: Научились получать список доступных устройств хранения информации (я использовал бы третий вариант). Текста (без кода и картинок) вышло на 3 страницы, скорее всего, заскучать не успели:)

Всем спасибо за внимание и удачной разработки.

P.s. Дополнения приветствуются.
p.s.2. Потратил немало времени на одни только эксперименты и сравнение файлов vold.fstab, mounts, с разных устройств...
p.s.3. В следующей статье, я покажу, как избавиться от проблемы обновления базы данных при обновлении приложения вручную.

Практически каждое приложение на Андроид устанавливается во внутреннюю память устройства. А она ведь не резиновая, так что ей свойственно заполняться. Так что с такой ситуацией может столкнуться любой пользователь. На помощь придет SD-карта, объемы которой могут доходить до десятков и даже сотен ГБ. Сейчас мы во всех деталях расскажем, как перенести приложение и кэш на SD карту.

Также стоит отметить, что не каждая карта подойдет для процедуры замены внутренней памяти на внешнюю. Все дело в классах скорости SD-карт, которые разняться от медленных (C2 и С4), до быстрых (С10 и С16). Если рассматриваемые ниже процедуры производить на медленных SD, то перенос данных отразится на общем быстродействии устройства, потому рекомендуется пользоваться только быстрыми флешками.

Способов замены внутренней памяти на внешнюю не так уж и много, потому мы остановимся лишь на самых эффективных, причем они будут описываться последовательно: от простых к более сложным.

Перенос кэша для версий Android 4.0+

Стоит заметить, что данный способ не требует наличия ROOT-прав, но подходит не для всех приложений. Так что, если в описании приложения нет нужных кнопок, расстраиваться не стоит, ведь это был самый легкий способ. Для еще большего облегчения можно воспользоваться утилитой или ей подобной, где все приложения удобно структурированы, что ускоряет поиск нужных.

ВНИМАНИЕ! Представленные ниже способы можно применить только на устройствах с РУТ-правами. Все дальнейшие операции делаются на ваш страх и риск, никто не дает 100% гарантии, что в случае неудачи вы не получите кирпич. Также мы не несем никакой ответственности за потерю личных данных.

Перенос при помощи сторонних программ

Если приложение не поддерживает стандартный перенос данных, то можно это сделать насильственно при помощи сторонних утилит, таких как:

Принцип работы данных программ очень схож, так что рассмотрим способ на примере Link2SD.

Этот способ, в отличии от следующего, не требует от пользователя особых знаний, кроме элементарных понятий о Рут-правах.

Полный перенос android приложений на SD карту памяти

Внимательный пользователь смог заметить, что у Link2SD и других схожих утилит есть интересная функция «Сослать». С ее помощью переносятся не отдельные части программы, как в предыдущих пунктах, а абсолютно все данные. При этом программа будет считать, что работает она во внутренней памяти устройства, что для некоторых из них является важным условием нормальной работоспособности.

Для реализации этого способа SD-карту надо «разбить» на два раздела, после чего с нее удалятся все данные, потому будьте внимательны и сделайте резервную копию важной информации.

Разделы на карте памяти можно делать как на компьютере, с помощью таких программ как Paragon Hard Disk Manager 12 Server или MiniTool Partition Wizard Home Edition. Но это достаточно трудоемкий процесс, а потому мы все сделаем прямо на смартфоне, воспользовавшись .

  1. Скачиваем и инсталлируем утилиту.
  2. В настройках устройства находим раздел «Память», где жмем «Извлечь SD».

  3. Заходим непосредственно в AParted и в первой вкладке Create, два раза нажимаем ADD.

  4. В Part 1 оставляем Fat32, а в Part 2 выбираем ext2 или любой другой формат, если знаете для чего они вообще нужны.
  5. Смотрим чтоб поле Format было отмечено и выбираем необходимый размер памяти для каждого из разделов. При этом Part 1 будет оставаться нашей стандартной «флешкой», а вот на Part 2 будут ссылаться приложения.
  6. Жмем APPLY и подтверждаем действие.

  7. Терпеливо дожидаемся окончания процесса.

Теперь приложения и игры можно безопасно ссылать во второй раздел карты памяти, с помощью соответствующей функции Link2SD или его аналога.

Перенос кэша на флешку

Данный способ пригодится для пользователей, которые любят игры с большим кэшем. Сейчас многие крупные проекты (к примеру, серия игр , ) занимают несколько гигабайт. То же самое касается и навигационных карт. Не все устройства могут похвастаться таким объемом встроенной памяти, поэтому на помощь приходит FolderMount. Оно позволяет создавать виртуальные папки, чтобы система по-прежнему считала, что данные приложения находятся во внутренней памяти, хотя фактически все файлы расположены на флешке.

  1. Устанавливаем .
  2. Запускаем и предоставляем права Суперпользователя.
  3. Открываем выдвигающееся меню в левой части экрана.

  4. Переходим в «Анализатор приложений», ищем нужную игру и кликаем по ней.

  5. В открывшемся окне видим объем, который занимают отдельно данные приложения и его кэш.
  6. Нажимаем кнопку «Создать пару» напротив размера кэша.

  7. На вопрос отвечаем «Да» и нажимаем галочку в верхней части экрана, после этого снова необходимо ответить «Да».

  8. В строке уведомлений можно будет увидеть процесс переноса файлов.
  9. Как только перенос завершится (достигнет 100%), снова открываем выдвигающееся меню и выбираем «Список пар».
  10. Осталось лишь нажать переключатель напротив названия игры, которые вы переносили.

Замена внутренней памяти на внешнюю

Этот способ позволяет обмануть систему, т.е Android будет считать SD-карту памятью устройства. Одним из главных преимуществ является тот факт, что все приложения будут автоматически устанавливаться на флешку. Идеально подходит для устройств с очень маленьким объемом внутренней памяти. Для его осуществления понадобится файловый менеджер, лучше всего использовать Total Commander. Смысл способа – поменять местами пути к памяти устройства и флешке.

  1. Устанавливаем
  2. Кликаем по файл, далее «Редактировать».

  3. В файле содержится множество строк, которые начинаются с # (символ решетки). Но нам нужна строка, начинающаяся со слов «dev_mount» и без (!!!) решетки в начале.
    Таких строк должно быть 2: первая обозначает внутреннюю память, вторая – внешнюю.

    Например, если ваши строки:
    dev_mount sdcard/mnt/sdcard
    dev_mount extsd/mnt/extsd

    То они должны стать:
    dev_mount sdcard/mnt/extsd
    dev_mount extsd/mnt/sdcard

    То есть самое главное – поменять местами слова после /mnt/.

  4. Больше ничего изменять не нужно, нажимаем кнопку «Сохранить» (иконка дискеты).
  5. Перезагружаем устройство.

Сразу оговорюсь, что речь пойдет не о программах типа link2sd. Принцип похож, но связывать мы будем не программные каталоги, а каталоги данных этих программ, например /sdcard2/Navigon -> /sdcard/Navigon или /mnt/extSdCard/Books -> /sdcard/Books и т.д.
Кроме того, нам нужен рут (куда ж без него). Кстати, после того как я узнал про эту программу, это для меня очередной аргумент за root.

Многие владельцы андроид смартфонов или таблеток с небольшей встроеной памятью наверняка сталкивались со следущей проблемой: вставлена большая sd карта (например 16, 32 или даже 64 Гигабайт), но после установки нескольких тяжеловесных программ наше устройство или очередная программа с наглостью заявляет, что на карте не хватает места. Иногда сама программа небольшая, но после установки лезет в интернет и тянет на смартфон гигабайты данных.
В очередной раз получив сообщение «Нет места» и заглянув на карточку видим, что она практически пуста, зато внутренняя память устройства забита под завязку.
Это происходит потому, что внутренняя память часто используется как каталог по умолчанию для многих программ. Дело в том, что она монтируется как /sdcard , что исторически всегда было внешней sd картой (раньше так оно и было на всех смартфонах). Внешняя же sd карта монтируется в этом случае как /sdcard2 , /mnt/sdcard2 , /mnt/extSdCard или даже /sdcard/.externalSD . Я так понимаю, что это делается изготовителями, чтобы устройство работало из коробки, т.е. совсем без sd карты.

Многие «недобросовестные» программы всегда хотят читать/писать данные из/в каталог /sdcard/НазваниеПодставить. Редко это можно изменить в настройках программы.
В результате имеем, что имеем, и несколько возможностей чтобы поправить сложившееся положение:
Два последних способа тоже не являются панацеей, т.к. требуют определенных навыков от пользователя, кроме того не достаточно «чисты», например известны проблемы при подключении смартфона к компьютеру через usb (не отмонтируются) и т.д.

Поправить положение поможет программа DirectoryBind , которую хороший человек slig из xda написал для себя и выложил на форуме для всеобщего пользования.

QR-код


Хоть публика здесь технически подкованная, но для неискушенных читателей хабра нужно сделать пару пояснений. Как он сам написал (программа not idiot-proof), т.е. врядли пройдет тест на дурака.

После установки запускаем программу (первый раз естественно навечно разрешаем права Root), нажимаем меню затем «Preferences» и выставляем пути по умолчанию на внешнюю память «Default data path» например /sdcard/external_sd/ и внутреннюю память «Default target path» /sdcard/ . Выходим из меню.

Нажимаем меню, затем «Add new entry»

Теперь создадим новую связь каталогов, например перенесем папку CamScanner на внешнюю карту. Долгое нажатие на путь к папкам открывает небольшой встроеный файловый менеджер, в котором можно создать и/или выбрать папку. Папка на внешней карте должна быть создана (и пуста).

Установив галочку в «Transfer files from target to data» файлы и папки будут перенесены из каталога /sdcard/CamScanner/ в каталог /sdcard/external_sd/CamScanner .

Нужно заметить, что связи после создания не активируются автоматически (серая иконка дискеты, как на скрине внизу для gameloft). Для завершения связывания папок, выбираем галочками нужные связи и нажимаем меню -> «Bind checked». Иконки активных (связанных) папок должны стать зелеными.

Кстати если вы хотите присоединить еще и всю внешнюю карточку полностью рекомендую это сделать не так /sdcard/externalSD/ , а с точкой впереди /sdcard/.externalSD/ . Это спасет вас от таких неприятностей как двойные превьюшки в галереях, и т.д. Правда поможет не для всех галерей и плееров, т.к. некоторые ищут медиа и в скрытых каталогах.
Помучившись, я для себя решил, связывать только отдельные каталоги.

UPD. Кстати, внешняя SD карта значительно медленнее внутренней памяти, поэтому перенос данных программы на внешнюю SD, естественно замедляет работу этой программы. Это особенно нужно помнить решившим полностью поменять маунт-пойнты внутренней и внешней памяти, т.к. скорее всего все ваше устройство будет работать медленнее, чем раньше.

Надеюсь эта программа дополнит и вашу копилку полезных утилит для андроид устройств.

Если вы все-таки решились поменять местами внутреннюю и внешнюю память, т.е. переназначить внешнюю sd карту на /sdcard и в настройках устройства нет такой опции - имея рут, это можно легко сделать выполнив следущую операцию:
В Root-Explorer монтируем "/etc" как R/W (если R/O), находим файл "/etc/vold.fstab", сохраняем копию и открываем (длинным кликом) его в Text Editor.
В следующих двух строчках меняем название моунт точек местами: dev_mount sdcard /mnt/sdcard emmc@fat /devices/platform/goldfish_mmc.0 ... dev_mount sdcard /mnt/external_sd auto /devices/platform/goldfish_mmc.1 ... на dev_mount sdcard /mnt/external_sd emmc@fat /devices/platform/goldfish_mmc.0 ... dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.1 ...
Подробнее можно почитать . Там же предлагают, как альтернативу, использовать другую интересную программу Root External 2 Internal SD .
Добавлю, что в обоих случаях, перед переключением, вам нужно скопировать все содержимое папки /sdcard на внешнюю sd карту.
Помните, что после переключения вся ваша система может работать , чем раньше.
Будьте осторожны - нужно понимать, что все что вы делаете под рутом, вы делаете на свой страх и риск, и например сохранение неправильного «vold.fstab» может привести к невозможности загрузить устройство и для лечения нужно будет грузится в рекавери и править «vold.fstab» уже там.

Этот способ можно использовать совместно с DirectoryBind, только теперь наоборот «Default target path» (/sdcard) и все связи созданные в DirectoryBind будут указывать на внешнюю карту.

Проблема нехватки памяти – одна из основоположных как для ПК, так и для мобильных устройств. При малом количестве свободной памяти система обычно начинает подтормаживать, подвисать, работает нестабильно и ненадёжно. Особенно актуально это для Андроид-устройств, многие из которых изначально обладают довольно небольшим объёмом основной памяти (т.н. «Internal Storage»). В такой ситуации у некоторых пользователей может возникнуть идея попробовать использовать внешнюю SD-карту в качестве основной памяти на их Андроид-устройстве. В данном материале я расскажу, как SD-карту сделать основной памятью на гаджетах Андроид, и какие способы нам в этом помогут.

Разбираем, как SD-карту сделать основной памятью на Андроид

Для осуществления данной задачи вам понадобится скоростная SD-карта (желательно, 10 класса или быстрее). Карты 6, а особенно 4 и 2 классов для таких целей не пригодны, ваша система вследствие их использования существенно замедлит свою работу, что вряд ли понравится кому-то из пользователей.

Также важно понимать, что срок действия такой SD-карты вследствие активной на неё нагрузки будет существенно меньше, нежели если бы нагрузка на карту проходила в стандартном режиме.


Способ №1. Изменяем содержимое файла Vold.fstab

Первый из описанных способов предполагает изменение содержимого файла системных настроек «Vold.fstab». После осуществления указанных изменений ОС Андроид будет считать вашу SD-карту внутренней памятью устройства, при этом учтите, что ряд установленных ранее приложений могут перестать работать.

Важно знать, что данный способ работает только на рутированных устройствах, на которых установлена ОС Андроид ниже (!) , нежели версия 4.4.2. В версиях ОС Андроид 4.4.2 и выше указанный файл, скорее всего, вы попросту не найдёте.

Также учтите, что ошибка в реализации данного способа (в частности, добавление в нужные строки лишних символов) может самым печальным образом сказаться на работоспособности вашего устройства. Потому тщательно взвесьте возможные риски, и если, всё-таки, приняли решение, тогда приступайте к его реализации.

Итак, для осуществления данного способа выполните следующее:

Например, это могут быть такие строки:

  • dev_mount sdcard/storage/sdcard0 emmc@xxxxxx
  • dev_mount sdcard2/storage/sdcard1 auto/xxxxxx

Для осуществления нужных изменений нам необходимо поменять путь в указанных строках местами, то есть, проще говоря, вместо 0 поставьте единичку в первой строке, а во второй вместо 1 поставьте 0.

После изменений эти строки будут иметь вид:

  • dev_mount sdcard/storage/sdcard1 emmc@xxxxxx
  • dev_mount sdcard2/storage/sdcard0 auto/xxxxx

Сохраните произведёнными вами изменения, а затем перезагрузите гаджет.

Ещё один вариант как сделать карту памяти основной на андроид:


Способ №2. Используем настройки ОС Андроид 6.0 и выше

Кроме первого способа, в котором я рассмотрел, как переключить память телефона на карту памяти, существует и другой способ, работающий только на настройках ОС Андроид 6.0 (Marshmallow) или выше, и позволяющий задействовать SD-карту как основную для сохранения файлов и работы с ними. Для его реализации рекомендую сделать копию данных с вашей SD-карты (если таковые на ней имеются), так как данная карта будет отформатирована системой.

Сразу оговорюсь, что речь пойдет не о программах типа link2sd. Принцип похож, но связывать мы будем не программные каталоги, а каталоги данных этих программ, например /sdcard2/Navigon -> /sdcard/Navigon или /mnt/extSdCard/Books -> /sdcard/Books и т.д.
Кроме того, нам нужен рут (куда ж без него). Кстати, после того как я узнал про эту программу, это для меня очередной аргумент за root.

Многие владельцы андроид смартфонов или таблеток с небольшей встроеной памятью наверняка сталкивались со следущей проблемой: вставлена большая sd карта (например 16, 32 или даже 64 Гигабайт), но после установки нескольких тяжеловесных программ наше устройство или очередная программа с наглостью заявляет, что на карте не хватает места. Иногда сама программа небольшая, но после установки лезет в интернет и тянет на смартфон гигабайты данных.
В очередной раз получив сообщение «Нет места» и заглянув на карточку видим, что она практически пуста, зато внутренняя память устройства забита под завязку.
Это происходит потому, что внутренняя память часто используется как каталог по умолчанию для многих программ. Дело в том, что она монтируется как /sdcard , что исторически всегда было внешней sd картой (раньше так оно и было на всех смартфонах). Внешняя же sd карта монтируется в этом случае как /sdcard2 , /mnt/sdcard2 , /mnt/extSdCard или даже /sdcard/.externalSD . Я так понимаю, что это делается изготовителями, чтобы устройство работало из коробки, т.е. совсем без sd карты.

Многие «недобросовестные» программы всегда хотят читать/писать данные из/в каталог /sdcard/НазваниеПодставить. Редко это можно изменить в настройках программы.
В результате имеем, что имеем, и несколько возможностей чтобы поправить сложившееся положение:
Два последних способа тоже не являются панацеей, т.к. требуют определенных навыков от пользователя, кроме того не достаточно «чисты», например известны проблемы при подключении смартфона к компьютеру через usb (не отмонтируются) и т.д.

Поправить положение поможет программа DirectoryBind , которую хороший человек slig из xda написал для себя и выложил на форуме для всеобщего пользования.

QR-код


Хоть публика здесь технически подкованная, но для неискушенных читателей хабра нужно сделать пару пояснений. Как он сам написал (программа not idiot-proof), т.е. врядли пройдет тест на дурака.

После установки запускаем программу (первый раз естественно навечно разрешаем права Root), нажимаем меню затем «Preferences» и выставляем пути по умолчанию на внешнюю память «Default data path» например /sdcard/external_sd/ и внутреннюю память «Default target path» /sdcard/ . Выходим из меню.

Нажимаем меню, затем «Add new entry»

Теперь создадим новую связь каталогов, например перенесем папку CamScanner на внешнюю карту. Долгое нажатие на путь к папкам открывает небольшой встроеный файловый менеджер, в котором можно создать и/или выбрать папку. Папка на внешней карте должна быть создана (и пуста).

Установив галочку в «Transfer files from target to data» файлы и папки будут перенесены из каталога /sdcard/CamScanner/ в каталог /sdcard/external_sd/CamScanner .

Нужно заметить, что связи после создания не активируются автоматически (серая иконка дискеты, как на скрине внизу для gameloft). Для завершения связывания папок, выбираем галочками нужные связи и нажимаем меню -> «Bind checked». Иконки активных (связанных) папок должны стать зелеными.

Кстати если вы хотите присоединить еще и всю внешнюю карточку полностью рекомендую это сделать не так /sdcard/externalSD/ , а с точкой впереди /sdcard/.externalSD/ . Это спасет вас от таких неприятностей как двойные превьюшки в галереях, и т.д. Правда поможет не для всех галерей и плееров, т.к. некоторые ищут медиа и в скрытых каталогах.
Помучившись, я для себя решил, связывать только отдельные каталоги.

UPD. Кстати, внешняя SD карта значительно медленнее внутренней памяти, поэтому перенос данных программы на внешнюю SD, естественно замедляет работу этой программы. Это особенно нужно помнить решившим полностью поменять маунт-пойнты внутренней и внешней памяти, т.к. скорее всего все ваше устройство будет работать медленнее, чем раньше.

Надеюсь эта программа дополнит и вашу копилку полезных утилит для андроид устройств.

Если вы все-таки решились поменять местами внутреннюю и внешнюю память, т.е. переназначить внешнюю sd карту на /sdcard и в настройках устройства нет такой опции - имея рут, это можно легко сделать выполнив следущую операцию:
В Root-Explorer монтируем "/etc" как R/W (если R/O), находим файл "/etc/vold.fstab", сохраняем копию и открываем (длинным кликом) его в Text Editor.
В следующих двух строчках меняем название моунт точек местами: dev_mount sdcard /mnt/sdcard emmc@fat /devices/platform/goldfish_mmc.0 ... dev_mount sdcard /mnt/external_sd auto /devices/platform/goldfish_mmc.1 ... на dev_mount sdcard /mnt/external_sd emmc@fat /devices/platform/goldfish_mmc.0 ... dev_mount sdcard /mnt/sdcard auto /devices/platform/goldfish_mmc.1 ...
Подробнее можно почитать . Там же предлагают, как альтернативу, использовать другую интересную программу Root External 2 Internal SD .
Добавлю, что в обоих случаях, перед переключением, вам нужно скопировать все содержимое папки /sdcard на внешнюю sd карту.
Помните, что после переключения вся ваша система может работать , чем раньше.
Будьте осторожны - нужно понимать, что все что вы делаете под рутом, вы делаете на свой страх и риск, и например сохранение неправильного «vold.fstab» может привести к невозможности загрузить устройство и для лечения нужно будет грузится в рекавери и править «vold.fstab» уже там.

Этот способ можно использовать совместно с DirectoryBind, только теперь наоборот «Default target path» (/sdcard) и все связи созданные в DirectoryBind будут указывать на внешнюю карту.



 

Пожалуйста, поделитесь этим материалом в социальных сетях, если он оказался полезен!