Установить новую версию приложения для Android программно

История Сейчас я работаю над проектом, в котором Android-приложение работает на пользовательском устройстве, и это приложение не устанавливается через Play Store, а APK-файл вручную загружается, устанавливается и запускается на устройство.

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

Мы хотим автоматизировать этот процесс и построить процесс следующим образом:

  • Установите приложение
  • Запустить приложение
  • Запустите фоновый процесс, чтобы проверить наличие новой версии на сервере.
  • Загрузите новый APK-файл
  • Удалить текущее приложение / Обновить приложение
  • Установить новое приложение / Обновить приложение

Вопросы:

Можем ли мы удалить и установить файл APK программно?

Оболочка, мы используем существующее приложение для этой работы или создаем новое приложение для Android, которое будет обрабатывать проверку новой версии и обновлять приложение в фоновом режиме?


person MrVasilev    schedule 29.08.2019    source источник


Ответы (3)


Автоматический скрипт ADB может работать, может быть, в паре со скриптом Python? Вам нужно будет запустить боковую загрузку APK, а затем удалить

person Jack Roden    schedule 29.08.2019

Вместо удаления APK поместите обновленный APK-файл на свой сервер и загрузите его в свое приложение.

Используйте функцию ниже, чтобы установить приложение

fun install(context: Context, packageName: String, apkPath: String) {

// PackageManager provides an instance of PackageInstaller
val packageInstaller = context.packageManager.packageInstaller

// Prepare params for installing one APK file with MODE_FULL_INSTALL
// We could use MODE_INHERIT_EXISTING to install multiple split APKs
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(packageName)

// Get a PackageInstaller.Session for performing the actual update
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)

// Copy APK file bytes into OutputStream provided by install Session
val out = session.openWrite(packageName, 0, -1)
val fis = File(apkPath).inputStream()
fis.copyTo(out)
session.fsync(out)
out.close()

// The app gets killed after installation session commit
session.commit(PendingIntent.getBroadcast(context, sessionId,
        Intent("android.intent.action.MAIN"), 0).intentSender)
}

Перезапуск приложения после обновления

class UpdateReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

    // Restart your app here
    val i = Intent(context, MainActivity::class.java)
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startActivity(i)        
}
}

полный процесс автоматического обновления приложения в фоновом режиме описан по ссылке ниже.

https://www.sisik.eu/blog/android/dev-admin/update-app

person Kailash Chouhan    schedule 29.08.2019
comment
вы тестировали это на Android 10? - person Mark Plumpton; 22.04.2020

Вы не можете программно установить APK автоматически с самого устройства.

  • Вы можете либо автоматизировать процесс, если устройство рутировано, используя сценарий оболочки и команду pm
  • Вы можете включить USB Debugging на всех устройствах и написать сценарий adb для установки apk с помощью компьютера.
  • У вас может быть другое приложение, которое только проверяет наличие новых APK, загружает и запускает Intent для установки APK (для Oreo и выше требуется явное разрешение), а затем пользователь должен нажать кнопку Install

Однако вы идете неверным путем, потому что все упомянутые выше методы очень громоздки. Потому что PlayStore точно соответствует указанным вами требованиям. Я настоятельно рекомендую вам опубликовать на Playstore.

person Sharukh Mohammed    schedule 29.08.2019