Автообновление для (частных) приложений Android

Я разрабатываю частное приложение для Android, т. Е. Приложение не будет доступно в глобальном Android Маркете. Приложение будет установлено на ограниченное количество клиентов, например с помощью файла apk. Как я могу включить функцию автоматического обновления в этом приложении?

Я вижу разные потенциальные варианты (я не знаю, технически сложно или даже невозможно реализовать их, или есть ли какие-либо существующие функции, которые можно использовать повторно):

  • При каждом запуске приложение проверяет, существует ли новая версия (запрашивая сервер), если да, загружает новый apk и заменяет себя новой версией.
  • Используйте (или разработайте?) Отдельное приложение или сервис, который выполняет проверку обновлений и процесс замены.
  • Используйте (или разработайте?) Приложение для частного рынка с функцией автоматического обновления. Этот вариант аналогичен второму, но имеет более общий характер: приложение Market будет подключено к репозиторию, то есть будет обрабатывать произвольное количество (частных) приложений.

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


person janjonas    schedule 29.11.2010    source источник
comment
and replaces itself with the new version Для этого потребуются привилегии root. Как и, вероятно, любое решение для этого. Я верю в прошивку Android по умолчанию, пользователю НЕОБХОДИМО взаимодействовать для установки приложения. Невозможно издеваться над этим без рута или кастомной прошивки.   -  person Falmarri    schedule 30.11.2010
comment
Конечно, для утверждения обновления потребуется взаимодействие с пользователем - оно также применимо ко всему, что есть на рынке. Если вы действительно хотите заставить их работать, старая версия может перестать работать после того, как обнаружится, что доступна новая.   -  person Chris Stratton    schedule 30.11.2010
comment
Google должен предоставить функцию автоматического обновления приложения из APK-файла, размещенного на частном сервере, поэтому всем не нужно изобретать велосипед с помощью специальных средств обновления.   -  person Jim    schedule 11.04.2013
comment
Попробуйте следующее: github.com/commonsguy/cwac-updater Пользоваться им довольно просто.   -  person AVEbrahimi    schedule 03.08.2013
comment
Есть хороший сервис, который помогает вашему приложению обновляться. Взгляните на push-link.com   -  person CelinHC    schedule 08.08.2013
comment
@ Джим, Йепп. Больше блокировки. Именно то, что нам нужно.   -  person Pacerier    schedule 26.11.2014
comment
Если вы уверены в лучшем предложенном решении, примите его.   -  person Vahid Ghadiri    schedule 16.08.2015
comment


Ответы (6)


janjonas, в компании, в которой я работаю, у нас была аналогичная проблема с Windows Mobile 6.x, и мы используем почти то же решение, указанное EboMike:

введите описание изображения здесь

Основное приложение проверяет, обновлено ли оно, с помощью WebService. Он получает текущую версию и URL-адрес, откуда при необходимости загрузите новую версию. Затем основное приложение запускает приложение Updater, передавая URL-адрес, и закрывается.

Updater выполняет загрузку новой программы через HTTP, показывая пользователю% загруженных. Пользователь может отменить загрузку в любое время контролируемым образом, и Updater может зарегистрировать эту отмену.

Поскольку новое приложение загружено, Updater запускает новое приложение и закрывается.

person tcbrazil    schedule 21.05.2012

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

У вас уже все обрисовано в общих чертах - проверьте наличие новой версии на сервере (было бы неплохо дать пользователю возможность отключить ее), и если есть новая версия, вы можете просто указать ссылку на URL-адрес с помощью APK. (который, IIRC, будет использовать диспетчер загрузок браузера для его загрузки), или вы можете загрузить его вместе со своим приложением, а затем указать намерение на свой локальный файл. Использование HTTP-ссылки технически менее трудоемко и чище - чем больше вы позволяете операционной системе делать, тем лучше - если нет причин не делать этого.

person EboMike    schedule 29.11.2010
comment
Спасибо за Ваш ответ. Я попробую вариант один: приложение загружает файл apk и запускает процесс установки. Как упоминалось в других комментариях, для подтверждения обновления требуется взаимодействие с пользователем. Этот вопрос stackoverflow.com/questions/3938926/ показывает, как запустить скачанный apk-файл. - person janjonas; 08.12.2010

Включение «Установить приложение не из магазина» по-прежнему необходимо для любого приложения за пределами Google Play. Если он не включен, процесс установки запросит его и перенаправит пользователя в настройки приложения, после чего пользователь сможет установить приложение.

В зависимости от ваших потребностей вы можете делегировать третьему лицу lib.

person CelinHC    schedule 01.06.2015

Вот некоторые из разрешений, которые мы будем использовать для этого:

<uses-permission android:name="android.permission.ACCESS_SUPERUSER" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

Позвольте мне немного пояснить ... Последнее, WRITE_EXTERNAL_STORAGE, не требует пояснений. С помощью ACCESS_SUPERUSER мы сообщим системе, что намерены использовать привилегии root. READ_EXTERNAL_STORAGE понадобится в будущем, чтобы ваше приложение могло читать файлы на SD-карте.

Предполагая, что вы загрузили файл и все эти устройства могут быть рутированы (ограниченное количество клиентов, не в Play и т. Д.), Вы можете сделать это:

String filePath = Environment.getExternalStorageDirectory().toString() + "/your_app_directory/your_app_filename.apk";
Process installProcess = null;
int installResult = -1337;

try {
    installProcess = Runtime.getRuntime().exec("su -c pm install -r " + filePath);
} catch (IOException e) {
    // Handle IOException the way you like.
}

if (installProcess != null) {
    try {
        installResult = installProcess.waitFor();
    } catch(InterruptedException e) {
        // Handle InterruptedException the way you like.
    }

    if (installResult == 0) {
        // Success!
    } else {
        // Failure. :-/
    }
} else {
    // Failure 2. :-(
}
person Budimir Grom    schedule 18.09.2014
comment
Здравствуйте, Никола, я выполнил ваш шаг, но apk не устанавливается. installProcess.waitFor () возвращает значение 255, и установка не удалась. Вы знаете решение? - person Santosh Prasad Sah; 08.05.2015
comment
@SantoshSah: Я не знаю, чем это вызвано, но этот код выхода говорит вам то, что вы уже знаете - установка не удалась. Устройство рутировано? - person Budimir Grom; 18.05.2015

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

  • Создайте экран пароля (passwordActivity), который запрашивает пароль для доступа к приложению.
  • После ввода пароля поднимите флаг (установите логическое значение с false на true, используя общие настройки)
  • Поместите файл .apk в Google Store.
  • Измените пароль, как только все установят приложение, и выпустите новое обновление в Google Play Store.

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

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

person 0014    schedule 04.02.2016

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

void installNewVersion(String location) {

 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setDataAndType(Uri.fromFile(new File(location + "app-debug.apk")),
            "application/vnd.android.package-archive");
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

}
person wizmea    schedule 04.10.2017