• 0
x11

Как правильно запускать программу из Delphi на Android?

Вопросы

Для Windows всё и так давно понятно - зупустил, работает. Никаких установок и delpoy выполнять не требуется. Винда/среда не даст запустить второй раз программу, если она уже запущена (по этому пути).

 

А вот для Андроида всё сложнее. Например, в настройках deployment есть колонка Overwrite. и везде, у всех строк - Always.

И тут проблема в том, что overwrite (перезапись) не работает. Т.е. я в базу добавил поле, запускаю на устройстве аппликацию и получаю ошибку, т.к. оказывается, что на устройство новый файл sqlite базы не попал. Странность в том, что когда я запускаю приложение из среды по F9, то я вижу, что и Deploy выполняется и в строке проскакивает имя базы. Так выполняется или не выполняется?

Т.е. какие вообще приготовления нужно сделать, чтобы на устройство попало всё, что в deploy?

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

Нужно ли перед запуском закрывать на устройстве приложение или Андроид его сам закроет перед установкой?

Какие ещё могут быть тонкости/нюансы?

Спасибо.

Screenshot_1.png

Изменено пользователем x11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

12 ответов на этот вопрос

  • 0

На устройство попадает все, что указано в deployment. Но, при развертывании новой версии приложения, без разницы, через adb или маркет, эти файли не перезаписываются, только разворачиваются новые. Что вполне логично и являеися нормальным поведением системы. 

Винда даст запустить сколько угодно копий приложения, если это руками не ограничить. Из студии тоже получится, если не пересобирать заново.

Если нужно обновить имеющиеся ресурсы, смотрите в сторону System. StartupCopy, он за это отвечает, ну или используйте AssetManager.

Так же приложение можно не удалять полностью, а в настройках "стереть данные" перед запуском

Но для работы с БД, лучше сразу продумать логику ее обновления в коде. Если данные в базе не важны для пользователя, то возможно, лучшим вариантом будет создавать БД программно. Если данные нужны, проверять версию БД и в коде ее обновлять. Откуда брать обновление-вам решать, или с сервера, или из ресурсов, или из assets выдергивать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
3 минуты назад, mazayhin сказал:

Винда даст запустить сколько угодно копий приложения, если это руками не ограничить. Из студии тоже получится, если не пересобирать заново.

Нет, Среда ругается и пишет, что приложение уже запущено :). С Виндой у меня опыта побольше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 минуты назад, mazayhin сказал:

Так же приложение можно не удалять полностью, а в настройках "стереть данные" перед запуском

И исполняемые so-библиотеки перезапишутся и уже новые запустятся?

 

а как же:

5 минут назад, mazayhin сказал:

файли не перезаписываются

?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
14 минуты назад, x11 сказал:

Нет, Среда ругается и пишет, что приложение уже запущено :). С Виндой у меня опыта побольше.

Ну правильно, если студия хочет при запуске открыть на чтение, то не запустится. Если не пересобирать (build) то все запустится.

13 минуты назад, x11 сказал:

И исполняемые so-библиотеки перезапишутся и уже новые запустятся?

 

а как же:

?

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

Если в настройках сделать сброс, то развернутые из ассетов фалы удалятся, и при следующем запуске приложения, развернутся вновь. Так же потрет все, что приложение разместило по пути TPath.GetDocumentsPath.

Если сделать сброс, то удалятся как раз те 2,07 мб, которые записал мне убер

 

 

Screenshot_2018-02-10-18-33-38.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
11 минуту назад, mazayhin сказал:

Библиотеки самого приложения и сервисов, если есть, перезапишутся точно.

да, проверил - подтверждаю

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
4 минуты назад, x11 сказал:

да, проверил - подтверждаю

Ну дак это и подтверждать не надо, все и так это делают регулярно

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Чтобы узнать, есть ли файл базы на телефоне и какой он, нужно:

0. Получить ROOT-доступ, если база хранится в системной папке приложения

1. Узнать точное местоположение файла и найти его по этому адресу. Все пути перечислены в справке. Для их получения вызовите справку TPath.GetHomePath

Файл мог попасть не в ту папку, если указан неправильный Remote Path в Deployment или не указан вовсе. К примеру, я храню большинство данных своего приложения в TPath.GetHomePath, поэтому для всех в Deployment пишу assets/internal. Есть другие пути и Remote Path для каждого из них. Вам следует проверить этот пункт. Подробнее на developer.android.com 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Вы о каком именно файле базы?

Если нужен доступ к моей базе, то никакого рута не нужно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
19 минут назад, МихаилЪ чайковЪ сказал:

Файл мог попасть не в ту папку

я это перепроверял, файл базы ложиться в ".\assets\internal\db" и доступен  в коде так:

UniConnection1.Database := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db' + PathDelim + 'base.sqlite';

 

Изменено пользователем x11

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0
20 минут назад, x11 сказал:

я это перепроверял, файл базы ложиться в ".\assets\internal\db" и доступен  в коде так:


UniConnection1.Database := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) + 'db' + PathDelim + 'CallerId.sqlite';

 

Тогда 100% файл должен был попасть на устройство. И да, каждый раз он перезаписывается, если не менять настроек. Root я предлагал как способ узнать папку.

Может быть я не понял вопрос

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

А я что, написал, что не попадает?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
  • 0

Где физически на устройстве находится файл нам знать и не надо, а для работы со своей и общими папками никакой root не нужен.

Опять же, не должно ничто само обновляться и перезаписываться из apk на устройстве!

В функции CopyAssetToFile даже специально комментарий оставлен в месте, где идет проверка наличия файла на устройстве.

х11, делайте обновление своей базы в коде, при запуске, а не перезаписывайте ее пустой (прямо представил, как при обновлении того же вайбера затирается вся переписка, прямо прелесть)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу