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

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

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

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

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

Ответ 1

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

enter image description here

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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

<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. :-(
}

Ответ 5

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

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

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

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

Ответ 6

Обновить приложение Убедитесь, что у вас уже есть новая загрузка 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);

}