У меня есть системно-привилегированное приложение с android: persistent = true в < Приложение > . Когда я обновляю его (через ADB или любым другим способом), он не может корректно обновляться и сбой.
Что я вижу, так это то, что система устанавливает обновление, пока текущая (системная) версия все еще работает. Во время обновления система не останавливает процесс (либо пытается остановиться, либо не работает, либо вообще не пытается). После завершения обновления приложение, похоже, подвергнется "перезагрузке" - я вижу инициализацию компонентов, таких как Application:: onCreate(). Но это происходит в том же процессе, что и до обновления!
Следовательно (при запуске некоторой активности приложения) приложение вылетает с "странными" исключениями, такими как отказ от использования класса для себя:
Вызвано: java.lang.ClassCastException: com.XX.YY.ZZ.ClassName не может быть добавлено в com.XX.YY.ZZ.ClassName
Во время исследования я увидел, что ClassLoader, используемый после обновления, не ссылается на путь обновленного APK, но остается указывать на путь исходной версии:
Ожидаемый загрузчик классов:
dalvik.system.PathClassLoader [DexPathList [[zip файл]/data/app/com.app.package-1/base.apk"],nativeLibraryDirectories=[/data/app/com.app.package-1/lib/x86_64,/data/app/com.app.package-1/base.apk!/lib/x86_64,/system/lib64,/vendor/lib64]]]
Фактический загрузчик классов:
dalvik.system.PathClassLoader [DexPathList [[zip файл]/system/priv-app/Appname.apk"],nativeLibraryDirectories=[/system/lib64/Start,/system/priv-app/Appname.apk!/lib/x86_64,/system/lib64,/vendor/lib64,/system/lib64,/vendor/lib64]]]
Я предполагаю, что это результат не перезапуска процесса во время обновления.
Есть ли способ обновить приложение с помощью persistent = true? Или это ожидаемое поведение, такое приложение не может быть обновлено общей процедурой обновления (например, публикация более новой версии в Google Play)?