Автообновление для (частных) приложений Android - PullRequest
50 голосов
/ 30 ноября 2010

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

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

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

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

Ответы [ 6 ]

18 голосов
/ 21 мая 2012

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

enter image description here

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

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

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

6 голосов
/ 30 ноября 2010

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

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

3 голосов
/ 01 июня 2015

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

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

2 голосов
/ 19 сентября 2014

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

<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. :-(
}
0 голосов
/ 04 октября 2017

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

}
0 голосов
/ 04 февраля 2016

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

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

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

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

...