среда, 7 января 2015 г.

Android KitKat и запись на карту памяти microSD

Как я уже писал, у меня произошла смена планшета: вместо заслуженного ветерана Samsung Galaxy Tab 7.0 Plus на вахту заступил Asus MeMO Pad 7. Помимо того, что в новом планшете установлены четырехъядерный Intel Z3560 с частотой 1.83 ГГц и два гигабайта ОЗУ, на борту также находится Android KitKat 4.4.2. Если честно, до этого момента, самой старшей версией Android, установленной на моих устройствах, была 4.2.1 на Minix Neo G4. А тут такой сразу такой скачок. Со всеми вытекающими.


Когда я приобрел Samaung Galaxy Tab 7.0 Plus, на нем был установлен Android 3.2. Так как все это дела давно прошедших дней, я уже мало что могу рассказать про ту версию операционки. Но одну вещь помню наверняка: запись на  карту памяти microSD была весьма проблематичной. Кроме родного файлового менеджера, входящего в прошивку, никакой другой софт писать на  карту microSD не мог.

Тут надо сделать небольшое отступление, чтобы пояснить один момент. Очень часто люди, разговаривая и обсуждая всевозможные гаджеты, которые работают под управлением Android, говоря про карту microSD, употребляют слово "внешняя". Но важно понимать, что термин "внешняя" (или "external" в оригинале) это не совсем то, что понимает человек, владеющий простым русским языком и называющий так карту misroSD. Для правильного понимания надо владеть "андроидным" русским языком. Так вот, на этом языке термин "внешняя" относится к памяти, которая является видимой для внешних устройств, при условии, что они получили доступ к вашему гаджету.

То есть, представим, что вы подключили свой планшет, или смартфон, к компьютеру. Пользователь, сидящий за компьютером (наверное, это вы), получает доступ к файлам вашего устройства. При этом, он видит как файлы на внутренней карте памяти, так и файлы на карточке microSD, если она, конечно, есть. Так вот, и видимая часть внутренней карты памяти, и карточка microSD - это все внешняя, с точки зрения Android, память.

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

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

Но вернемся к Android 3.2  и невозможности писать на карту microSD, вставляемую в гаджет. Объяснялось это тем, что большинство софта не учитывало особенностей системы прав и разрешений относительно новой, на тот момент, версии Android 3.2, предназначенной только для планшетов. Карта  microSD монтировалась в режиме r/w, то есть, запись была возможной. Но владельцем была группа media_rw, которая была связана с разрешением WRITE_MEDIA_STORAGE. Однако, большинство софта не запрашивало этого разрешения, так как до версии 3.2 оно не требовалось, и для записи на карту памяти microSD достаточно было запросить разрешение на запись во внешнюю память. Поэтому знающие люди предлагали редактировать файл /system/etc/permissions/platform.xml, добавляя группу media_rw к разрешению WRITE_EXTERNAL_STORAGE. Таким образом, программа, запросившая разрешение WRITE_EXTERNAL_STORAGE, а это делали, например, все файловые менеджеры, автоматом получала возможность записи на карту памяти microSD, так как становилась членом группы media_rw, которая являлась владельцем соответствующего примонтированного устройства, а именно, вставленной в планшет карточки.

Для того, чтобы отредактировать файл platform.xml надо было обладать правами root. Но, в случае с планшетом Samsung, мне удалось избежать процедуры получения прав суперпользователя. В то время на Android уже была работающая версия файлового менеджера Total Commander. Так вот, в определенный момент вышло обновление этой программы, которое позволяло, эксплуатируя какую-то там уязвимость в программно-аппаратном компоте Samsung - Android 3.2, получить в обычном режиме работы доступ к файлам, к которым доступ должен был иметь только пользователь root. Не знаю, может это работало не только для Samsung и не только для Android 3.2, но для этой комбинации Total Commander сработал безупречно: с его помощью я сделал все необходимые изменения в вышеобозначенном файле, после чего способность писать информацию на карту microSD вернулась ко всем программам. Ладно, по крайней мере, к тем программам, которыми пользовался я.

Если вы являетесь счастливым обладателем устройства с Android KitKat на борту, вы, наверное, уже поняли, к чему все это долгое и нудное вступление. Для остальных же поясню: да, получив в свои руки новый планшет, я сразу понял, что мои проги не могут писать на карту microSD. Мои - не в смысле те, которые я написал, а те, которыми я пользуюсь.

Например, я поставил программку Видеорегистратор. Она тут же на внутренней карте памяти создала каталог VideoReg с четырьмя подкаталогами, вознамерившись писать в один из них, с красноречивым названием Temp, файлы, получаемые в результате своей жизнедеятельности.

Я, как закоренелый ретроград, твердо верю в ограниченное число циклов записи на флеш память. Конечно, разум кричит о том, что сам планшет не будет использоваться так долго, как долго сможет протянуть его память. Но... С завидным упорством я стараюсь направить все, что требует частой записи информации, на microSD, избавив внутреннюю карту памяти от лишних нагрузок. И ничего не могу с собой поделать.

На Samsung-e для Видеоригистратора я скопировал созданную им структуру каталогов из корня внутренней карты памяти в корень microSD,  указав этот новый путь в настройках программы. Все работало просто замечательно (конечно, только после манипуляций, описанных чуть раньше). На моем новом планшете цепочка оборвалась уже на первом шаге: скопировать каталог VideoReg в корень microSD просто не получилось. Потому, что копировал я при помощи Total Commander.

Попытка номер два - скопировать при помощи родного файлового менеджера, успешно завершилась, но я уже знал, что Видеорегистратор писать туда ничего не сможет. Лишь для очистки совести я сделал изменения в настройках программы и попробовал записать тестовый ролик. Ожидаемый результат не заставил себя ждать: ошибка записи.

Поиск в интернете подтвердил, что проблема существует. Ну и, как всегда, предлагалось решение: получить права доступа root и, после этого, воспользоваться специальной программой NextApp SDFix. В принципе, программу можно не устанавливать, достаточно отредактировать файл ... да-да, platform.xml. Причем, надо сделать примерно такие же изменения, более подробно можно посмотреть по этой ссылке.

Но я не стал спешить получать root права, решил разобраться в причинах, которые побудили Google пойти на этот непопулярный шаг. Ведь первое, на что натыкаешься при поиске в интернете по запросу "KitKat microSD write problem" - это, мягко говоря, нелестные отзывы о Google, причем, и на русскоязычных и на англоязычных сайтах.

Так в чем, собственно, дело, из-за чего весь сыр-бор, так сказать. Одна из версий, широко распространенных в интернете, предполагает, что таким образом Google пытается задушить использование microSD карт в устройствах под управлением Android на корню. Ну согласитесь, зачем покупать устройство со слотом под microSD, если на саму карточку записать что либо будет, если и можно, то с большими трудностями. А ведь платить за этот слот все равно придется. Есть и другие версии, но эта уж больно красочная и распространенная.

Помимо обвинительных версий, нет-нет да и попадется какая нибудь оправдательная. Типа, Google заботится о безопасности, и так далее и тому подобное.

А что же Google? Сама Корпорация Добра заявляет, что они практически ничего не меняли. И, если внимательно почитать различные материалы, действительно, получается, что при переходе к KitKat, изменений они сделали не так уж и много.

Во-первых, добавили новое разрешение - READ_EXTERNAL_STORAGE. Это разрешение теперь надо предоставлять приложению, которое хочет читать данные из внешней памяти. Разрешение же WRITE_EXTERNAL_STORAGE надо предоставлять тем приложениям, которые хотят не только читать, но и писать во внешнюю память.

Во-вторых, приложениям теперь вообще не нужны никакие разрешения для того, чтобы писать в каталоги, для которых они выступают владельцами. Примером такого каталога может служить /Android/data/[package_name], где [package_name] - имя пакета приложения. Такой же каталог, что, на самом деле, очень ценно, может размещаться и на карточке microSD.

В-третьих, в KitKat появилось официальное API для вторичных устройств внешней памяти. И вот это очень важный момент. Раньше для вторичных устройств вообще не было API. Как утверждает Google, приложения на некоторых устройствах пользовались внутренними особенностями организации вторичных устройств внешней памяти, и, предоставляя специальный путь, использовали вторичные устройства так, как будто это обычные первичные устройства, ну, или часть первичного устройства. Не трудно догадаться, что под первичным внешним устройством Android понимает внутреннюю, несъемную, память, а под вторичным устройством - карточку microSD.

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

Эти правила одинаковы для всех приложений. И, конечно, как всегда, существуют приложения, которые наиболее равны. Это - так называемые системные приложения. Они принадлежат к группе media_rw, благодаря чему имеют возможность писать в любое место как первичного, так и вторичного устройства - во всю внешнюю память Android-устройства.
На самом деле, существует еще пара возможностей дать доступ на запись программам в те места, куда им такой доступ, вроде как, запрещен. Например, программа хочет разрешить писать в свой собственный каталог другим программам. Разработчик может реализовать ContentProvider, и другие приложения, используя его, смогут писать туда, куда просто так им не достучаться. Другая возможность - использовать интенты OPEN_DOCUMENT и CREATE_DOCUMENT. За этим решением стоит мысль, что пользователь непосредственно участвует в процессе принятия решения - выборе файла.

Несмотря на то, что изменений вроде как не много, потребительские свойства изменились очень сильно. Google утверждает, что эти изменения были необходимы, чтобы у пользователей был более полный контроль над приложениями и их данными. В качестве примера они приводят случай с приложением, которое понасоздает кучу файлов в разных местах, а после удаления этой программы ее файлы остаются, замусоривая систему. Якобы, пользователи от этого сильно страдали. Теперь же, в процессе удаления программы будут удалены и все каталоги, которыми она владеет. И мусора не будет.

Однако, этот пример, мягко говоря, притянут за уши. Кто-нибудь пытался после пары лет использования гаджета разобраться в том, что творится на внутренней карте памяти? Это же кошмар! При этом, по утверждению самой Корпорации Добра, работа с первичным устройством не изменилась. То есть, как имели там бардак, так и будем иметь.

Опять же, карточки microSD, как правило, используются для размещения на них контента, изначально предназначенного для использования в отрыве от программ, создавших этот контент. Это документы, фотографии, видео и так далее и тому подобное. А теперь представьте себе приложение для камеры, после удаления которого вы не найдете ни одной сделанной с ее помощью фотографии, потому что каталог на microSD карте удалился вместе с программой и... фотографиями. Вот будет сюрприз!

То есть, понятно, что Google что-то хотел сделать, чего-то добиться. Но, то ли это было большущим архитектурным промахом (с потребительской точки зрения), в котором они не хотят признаваться, то ли они действительно преследовали далеко идущие планы, например, по завоеванию корпоративного рынка, на который службы безопасности предприятий очень неохотно допускают устройства под управлением Android, в отличии от тех же Apple и даже Nokia, которые с самого начала не давали доступа к тому, что на Android-е можно было использовать как угодно... и удобно. Боюсь, мы этого не узнаем.

Но, хорошо уже то, что от этой напасти можно, все-таки, избавиться - ну, root права и все такое. Я же, пока, решил не спешить. От карточки памяти microSD мне нужно хранение карт для пары навигационных программ и запись роликов видеорегистратором. Вот, пожалуй, и все. А эти задачи можно решить и в тех рамках, которые оставляет официальный KitKat. И вот, как я поступил.

В корне карты microSD, вставленной в планшет, создается каталог /Android/data. Далее, в этом каталоге, для каждой программы, которую вы хотите, по тем или иным причинам, переориентировать на использование карты microSD вместо внутренней карты устройства, создаете подкаталог с именем пакета программы.

Имя пакета программы можно узнать в браузере на сайте play.google.com. Как? Очень просто! Ищете интересующую вас программу, и переходите по найденной ссылке. В адресной строке браузера будет указан полный URL, например:

Заканчивается этот адрес на ?id=[package_name],  в нашем случае, [package_name] это ru.yandex.yandexmaps.

Итак, имя пакета определено, подкаталог создан. После этого запускаем программу и настраиваем ее на использование только что созданного подкаталога на карте microSD. В случае с Яндекс.Картами, эта настройка доступна через меню Настройка - Дополнительная настройка - Папка с картами - Внешняя SD карта. Для Видеорегистратора пришлось в настройках выбрать нужный каталог:

/storage/MicroSD/Android/data/rubberbigpepper.VideoRegPro

Так же и для навигационной программы 7 ways:

/storage/MicroSD/Android/data/com.navikey.seven_ways

Вот для чего не удалось сделать настройку, так это для Яндекс.Навигатора - в интерфейсе программы обнаружить что-то, подходящее по смыслу, не удалось.

Вот, пожалуй, и все, что хотел написать по этому поводу.

P.S. Прошло какое-то время и Android на планшете обновился до пятой версии. Почитать про первые впечатления от использования новой версии можно тут, ну а если хочется узнать только про то, как организована работа с внешней картой памяти в Lollipop, то милости прошу сюда.

Комментариев нет:

Отправить комментарий