Почему SD-карта подключена к «/ sdcard / external_sd» вместо «/ sdcard» (или «/ mnt / sdcard»)?

18

Я недавно обновил свой телефон до LG Motion 4G (Android 4 ICS). Я вижу, что SDCard установлен в /sdcard/external_sd. Я также заметил, что это похоже на то же самое с некоторыми другими более новыми моделями. Приложения ожидают, что SDCard будет в /sdcard. Я предполагаю, что производители хотят включить много внутренней памяти, но зачем монтировать внутреннюю память на /sdcard? Разве это не должно противоречить какой-либо форме стандарта спецификации Android?

Sepero
источник
4
Что касается «стандарта спецификации», это не должно вызывать проблем: как вы можете прочитать в документации для разработчиков по внешнему хранилищу , приложения должны определять местоположение / доступность, используя вызовы API (здесь: getExternalStorageState () ), не используя жестко закодированные пути ,
Иззи
Хорошая мысль Иззи, но, видимо, некоторые производители ошибочно перенаправляют приложения во внутреннее пространство через getExternalStorageDirectory (). stackoverflow.com/questions/11281010/…
Sepero
Ах, хороший момент - как не разработчик, я не знал об этом. Но я вижу, что Поток дал очень хорошее объяснение - опять же, с точками, о которых я не знал ...
Иззи

Ответы:

26

Причина в истории Android: первое поколение Android-устройств имело только небольшой объем внутренней памяти (около 100-400MiB), который был установлен под ним /data.

Затем появились устройства с внешней на тот момент SD-картой. SD-карта была установлена ​​под /mnt/sdcard.

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

Эта ситуация была улучшена с Android 3.0: /dataи /mnt/sdcardтеперь указывают на тот же раздел. Хорошая работа Google, это могло быть сделано версии назад. Это также причина, по которой app2sd больше не требуется на Android 3.0 или выше: вы будете перемещать данные только в том же объеме.

Теперь перейдем к ответу на ваш вопрос: поскольку /mnt/sdcardвнешняя SD-карта уже смонтирована во внутренней памяти, она должна использовать другую точку монтирования. И эта точка монтирования не указана Google. Возможно

  • /mnt/sdcard/ext_sd
  • /mnt/external
  • /mnt/extSdCard
  • /mnt/sdcard/external_sd
  • и т.п.

Вызов API getExternalStorageDirectory()обычно указывает на каталог внутреннего хранилища. Такое поведение задокументировано. Существуют проекты с открытым исходным кодом, которые предоставляют инструменты для поиска каталога внешних SD-карт каноническим способом.

поток
источник
Означает ли это, что для приложений не существует «прозрачного способа» определения SD-карты? Конечно, стоит isExternalStorageRemovable()посмотреть, является ли «внешнее» хранилище съемным, плюс можно определить точки монтирования (используя mountкоманду), проверить флаги монтирования и т. Д. Но если я не ошибаюсь, это все равно означает, что каждому разработчику нужно самому разобраться с его приложением, и нет простого API-вызова для этого?
Иззи
Правильно. Есть библиотеки, которые я связал, которые пытаются добавить эту функцию, но официального вызова API для этого нет.
Поток
Если и внешнее хранилище, и /dataраздел объединены, как я могу безопасно смонтировать / размонтировать мою SD-карту, чтобы подключить ее, скажем, к моему ПК? Мне кажется, что иметь отдельные разделы логично, и я не понимаю, почему все это должно было случиться.
jadkik94
Это не внешнее хранилище, это, так называемый, «внутренний SD» и /dataраздел, который объединяется.
поток
This situation was improved with Android 3.0: /data and /mnt/sdcard are now pointing to the same parition, Просто к сведению, это НЕ верно, по крайней мере, на одном телефоне под управлением Android 4.0 (Pantech Burst), где /data1 ГБ раздел ext4 и 12 /mnt/sdcardГБ FAT32 раздел.
netvope
3

Отказ от монтирования внешнего SD /mnt/sdcardне имеет технических преимуществ, это способ Google помочь поставщикам оборудования создать точку дифференциации для телефонов с большей внутренней памятью.

Нет никаких причин, по которым приложениям приходится искать способ найти внешнюю карту, когда это /mnt/sdcardбыло именно то место, где должна была быть SD-карта, а неопределенный способ загрузки внешней SD-карты Google - еще один менее удобный для пользователя способ сделать внешнюю SD-карту менее полезной в новые устройства Android. Существует причина , почему НЕТ /dataи должны /mnt/sdcardбыли быть объединены в одном разделе на новой версии Android для производителей , чтобы дифференцировать телефоны с большей внутренней памяти с более низкой стоимости единицы с менее внутренней памяти , за исключением. Даже если бы слияние было сделано, Google мог бы четко определить СТАНДАРТновая точка монтирования для внешних SD-карт вместо того, чтобы оставить ее совершенно расплывчатой. Это полностью работает против предотвращения дальнейшей «сегментации» экосистемы Android за счет неуклюжего дизайна, чтобы помочь поставщикам отличать более дорогие телефоны от более дешевых устройств с меньшей встроенной памятью.

Двоичные файлы приложений Android крошечные, телефоны с 1-2 гигабайтами встроенной памяти должны иметь более чем достаточно места для сотен приложений, и все большие данные можно безопасно спрятать на внешней SD-карте. Но затем поставщики осознали, что им нужен способ дифференциации своего более высокого конечного продукта, и заявив, что более высокая внутренняя память становится частью этой схемы, а снижение полезности внешней памяти является другой интегрированной частью, которая необходима этой схеме для полноценной работы, поэтому Менее полезный API для поиска внешних SD-карт и нестандартных точек подключения.

Итак: Нет, установка SD-карты в другом месте /mnt/sdcard- это не что иное, как бизнес-стратегия продажи более дорогих новых телефонов под новую версию Android, не более того. Представьте себе, если Nexus 4 8 ГБ и Nexus 16 ГБ могут использовать 64 ГБ внешней SD-карты для приложений и носителей, есть ли причина для кого-либо покупать версию 16 ГБ? Эти дополнительные 8 ГБ памяти NAND не стоят разницы в цене в 50 долларов, если используются внешние SD-карты. Поскольку большинство компонентов смартфона должны быть одинаковыми (ОЗУ, процессор, радиоприемники), единственная область, оставшаяся для большей прибыли, - это пространство внутренней памяти и, следовательно, странная точка подключения внешней памяти.

Также все ли заметили отсутствие поддержки внешней SD от нынешнего урожая Android-устройств с маркой Google? Эта тенденция будет продолжать расширяться в устройствах Android «высшего уровня». Поддержка внешних SD-карт была ключевым отличием для устройств Android, чтобы превзойти доминирование iPhone на рынке мобильных устройств. Теперь, когда Android играет главную роль в игре с числами, нет необходимости в том, чтобы эта практика снижения прибыли сохранялась гораздо дольше.

Я не удивлюсь Android 5.0, поддержка внешней SD-карты уйдет в прошлое. Потому что если приложениям сложно найти внешнюю SD-карту, то большинство программ просто использует известные /dataи /mnt/sdcardместоположения, а большинство приложений используют все больше и больше хранимых данных для своей работы, поэтому стратегия «живого» продукта создается из «воздуха». "просто не монтируйте внешнюю SD-карту в /mnt/sdcard.

Deecee
источник
1
Это то, что я называю текстовой стеной . Кажется также немного разглагольствования. Пожалуйста, добавьте несколько абзацев к вашему ответу. Также я не понимаю, почему нет «причин для слияния /dataи /mnt/sdcard», поскольку я ясно вижу причину: избегать фрагментации внутреннего хранилища.
Поток
1
Это определенно была напыщенная речь, Дизи, но, тем не менее, я ценю твой вклад. Приветствия
Sepero
И есть еще одна вещь: с устройствами, помещающими внешнюю SD-карту внутрь внутренней (например, /sdcard/external_sdна LG P880), резервное копирование «общего хранилища» включает в себя и то , и создает огромный архив. Нет способа сделать резервную копию внутренней SD-карты только при простом подходе. Что не имеет особого смысла, так как есть гораздо более простые способы сделать резервную копию внешней карты. Факт, который сводит меня с ума, так как у меня есть упомянутое устройство ...
Иззи
2

Вы должны знать (если они укоренены), вы можете зайти в /system/etc/vold.fstab и поменять местами монтирования для / sdcard, и /mnt/external_sd....this позволит вашей sdcard быть на / sdcard, как вы ожидаете а оставшаяся «внутренняя память» будет смонтирована в / mnt / external_sd или, если вы предпочитаете / sdcard / external_sd /

Руди Питтман
источник
Это работает с некоторыми моделями телефонов, но не со всеми. Это не работает для моего LG Motion 4G, Android 4.0.4. Thx
Sepero