суббота, 8 февраля 2014 г.

Deployment Manager или куда ещё можно задеплоить файлы

Решил посмотреть, куда ещё можно задеплоить файлы и что происходит при обновлении приложения вручную, не из гугл маркета. Почему-то во всех статьях/заметках говорят только про путь ".\assets\internal\", исправляем ситуацию (смотрите скриншот).

Из этой заметки вы узнаете:
Куда можно задеплоить или программно сохранить файлы, так чтобы их можно было вытащить любым файловым менеджером и без прав супер пользователя. В общем, небольшой разбор полётов, основываясь на официальной справке и моих экспериментах (на SGS2 и HTC Rhyme).



Описывать процедуру прикрепления файла к приложению через Deployment Manager я не буду, просто приведу вам скриншот таблицы, которую я сделал для удобства.


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

Особенность #1 – При каждом запуске приложения на устройстве, оно проверяет существование задеплоиных файлов и если какой-то файл не найден, то он автоматически копируется из ".apk".

Особенность #2 – При обновлении приложения вручную (т.е. не из гугл маркета), все данные (файлы) старой версии приложения сохраняются. (По поводу темы с обновлением базы, варианты, которые, скорее всего, будут работать (проверю позже), смотрите в комментах к статье Несколько особенностей и вопросы по ним)

Особенность #3 – Папки типа "Pictures", "tmp", "DCIM" и т.д. не создаются на устройстве, если в них ни чего не поместили, что логично. Однако, если мы ни чего не задеплоили, но где-то в коде упомянули строчку "TPath.GetTempPath" и т.п., например, в обработчике события OnClick для кнопки, то сразу после нажатия на кнопку будет создана пустая папка "tmp".

Спасибо за внимание.

p.s. Дополнения приветствуются.

11 комментариев:

  1. спасибо, круто. А есть пример, как получить список доступного storage на устройстве, и например, будет ли являться общедоступной папка, созданная на sdcard1... ?

    ОтветитьУдалить
    Ответы
    1. К сожалению, я не нашёл готовых методов (в Android API) для получения списка список доступного storage на устройстве. Значит нужно писать самостоятельно и тут-то возникает много подводных камней, т.к. по сути устройства по-разному эмулируют внешнюю карту памяти, например на SGS2 "/storage/extSdCard", а на HTC "/mnt/sdcard", внутренняя память будет на SGS2 "/storage/sdcard0", а на HTC "/mnt/sdcard". И это только начало раскопок по вашему вопросу :), я обязательно постараюсь докопаться до истины и обновлю эту статью (или новую напишу…). Могу только сказать, что копать нужно примерно сюда /proc/mounts, /etc/vold.conf, /etc/vold.fstab. Обязательно потом всё опишу, сейчас только начал идти на поправку после болезни.
      По поводу второго вопроса, не совсем понял, что вы имеете ввиду под "sdcard1". Папки созданные в ExternalStorage доступны всем приложениям, а также при подключении к ПК.

      Удалить
  2. Доброго времени суток! Такой вопрос,допустим я в deploiment указал путь .\assets\internal\ и по этому путь положил допустим файл 1.txt. Как мне загрузить при работе приложения этот файл,1.txt,в memo? как указать путь к нему?

    ОтветитьУдалить
  3. Ответы
    1. :) Поспешил вопросом. Я тоже разобрался

      Удалить
  4. Какой путь указать при сохранении на устройство фала?
    Image1.bitmap.SaveTofile('/1.jpg');

    ОтветитьУдалить
  5. не очень полезная статья, для "особых" вписал бы как пользоваться delpoyment, а в частности загрузки картинки в img из delpoyment'a

    ОтветитьУдалить
  6. Спасибо, очень познавательно.
    А не подскажет ли уважаемый автор, как задеплоить шрифты?
    Например, Rage.
    В IDE смотрится нормально, а на планшете какой-то другой...

    ОтветитьУдалить
    Ответы
    1. Посмотрите этот пост: http://delphifmandroid.blogspot.ru/2015/01/true-type.html

      Удалить