Подтвердить что ты не робот

Обновление приложения для Android с помощью кордовы-webintent и принудительной остановки

Шаги: 1) Открытое приложение для Android (построено с помощью cordova)

2) Затем я назвал cordova-webintent для установки обновлений https://github.com/Initsogar/cordova-webintent

3) Я нажал "Установить", и он начнет установку, но через несколько секунд приложение перестанет останавливаться и закрывается вместо установки и открытия обновленного приложения.

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

4) После остановки приложения, я нажимаю значок приложения, но появляется сообщение о том, что "Приложение не установлено". Через несколько секунд приложение продолжит установку в фоновом режиме. Я снова коснусь значка приложения и откроется обновленное приложение.

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

Logs:

E:\work\hello1 > adb logcat ActivityManager: я com.example.hello1: D *: S

--------- начало системы

I/ActivityManager (715): [Настройка приоритета фоновой службы] Установите callerFg как false для service.getFlags(): 260

I/ActivityManager (715): START u0 {act = android.intent.action.VIEW dat = файл:///storage/emulated/0/filename1.apk typ = application/vnd.android.package-archive cmp = com.android.packageinstaller/.PackageInstallerActivity} из uid 10657 на дисплее 0

--------- начало основного

I/ActivityManager (715): START u0 {dat = file:///storage/emulated/0/filename1.apk cmp = com.android.packageinstaller/.InstallAppProgress(имеет дополнительные функции)} из uid 10072 на дисплее 0 I/ActivityManager (715): отображается [AppLaunch] Отображается com.android.packageinstaller/.InstallAppProgress: + 135ms

I/ActivityManager (715): принудительная остановка com.example.hello1 appid = 10657 user = -1: удалить pkg

I/ActivityManager (715): Killing 19149: com.example.hello1/u0a657 (adj 1): stop com.example.hello1

W/ActivityManager (715): уведомлять приложение switch quit packageName = com.example.hello1 I/ActivityManager (715): принудительная завершающая активность ActivityRecord {16a2ad7e u0 com.example.hello1/.MainActivity t2758}

I/ActivityManager (715): принудительно завершает работу ActivityRecord {32eb6933 u0 com.android.packageinstaller/.InstallAppProgress t2758}

W/ActivityManager (715): ложная смерть для ProcessRecord {2590ad4d 19149: com.example.hello1/u0a657}, curProc для 19149: null

I/ActivityManager (715): принудительная остановка com.example.hello1 appid = 10657 user = -1: update pkg I/ActivityManager (715): принудительная остановка com.example.hello1 appid = 10657 user = 0: pkg удален

4b9b3361

Ответ 1

Когда вы начинаете установку/операцию установки, ОС Android принудительно отключает ваше приложение, а затем очищает старые файлы приложений (в основном это удаляет их, за исключением внутренней папки данных/песочницы приложения) и то он копирует новые файлы приложений, и только после этого вы можете запустить приложение

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

Диалоговое окно "Силовая остановка" - это стандартное поведение андроида при выходе из режима безуспешного процесса. Вы можете переопределить весь механизм принудительной остановки, используя Thread.UncaughtExceptionHandler

public void uncaughtException(Thread t, Throwable e){
    e.printStackTrace()
    System.exit(0);// exit the app normally, with 0 (OK) signal - will bypass the "force close" UI
}

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

Чтобы обеспечить плавное обновление самообслуживания, вам необходимо:

  • Загрузите новый APK (он должен быть подписан тем же сертификатом, что и существующее приложение на телефоне).
  • Настроить задержанную установку/операцию установки с помощью PendingIntent с задержкой на столько времени, что ваше приложение должно закрыть + некоторый буфер время в зависимости от производительности устройства (например, 500 мс-1сек).
  • Выход из текущего приложения System.exit(0)