Как удалить динамический функциональный модуль после удаления?

Мое приложение имеет 2 функции: "база" и "расширение".

особенность расширения манифеста:

<dist:module
    dist:onDemand="true"
    dist:title="@string/title_extend">
    <dist:fusing dist:include="true" />
</dist:module>

функция загрузки с помощью SplitInstallManager -> startInstall

удаление с помощью SplitInstallManager -> deferredUninstall

Проверьте установленные модули с помощью SplitInstallManager -> getInstalledModules

Функция расширения загружается из магазина успехов и работает как положено. Когда эта функция стала ненужной - удалите ее.

Более того, SplitInstallManager имеет обратные вызовы: SuccessListener, FailureListener, CompleteListener. Установите и удалите полностью с успехом (без ошибок).

Но после удаления функции расширения (и после перезапуска приложения) она остается установленной.

Как удалить неустановленную функцию из приложения (нужно удалить неиспользуемый код и ресурсы)?

1 ответ

Как объяснено в API deferredUninstall метод:

После вызова Play Store попытается удалить эти модули в фоновом режиме.

Деинсталлированные модули будут удалены, пока приложение не будет работать в какой-то момент в течение следующих 24 часов.

Вот что я заметил.

1) При удалении приложения удаляются загруженные модули, поэтому при следующем запуске приложения приложение снова загрузит модули.

2) Очистка данных приложения (например, adb shell pm clear APP_PACKAGE_NAME) делает модуль недоступным для приложения немедленно, но если модуль уже загружен до очистки данных приложения, он не будет загружен снова. Другими словами, ты не увидишьSplitInstallSessionStatus.DOWNLOADING.

3) Как только загружаемый модуль станет доступным для приложения, очистите данные приложения от "Сервисов Google Play" (т. Е. adb shell pm clear com.google.android.gms) не имеет значения. Но иногда загружаемый модуль остается даже после удаления приложения, особенно при изменении имени модуля. Затем 3) становится удобным для очистки устаревших модулей.

Я думаю, что здесь происходит, когда приложение запрашивает загружаемый модуль, Google Play servicesзагружает модуль, передает его приложению и кэширует его копию на случай, если приложение снова запросит его. Если приложение удалено,Google Play services удаляет кешированный модуль. deferredUninstall() просто спрашивает Google Play services при необходимости удалить модули, но мы не можем контролировать, когда это произойдет, если вообще.

Насколько я знаю, удаление откладывается до тех пор, пока приложение не будет обновлено в Play Store. В противном случае я предполагаю, что службы Play Store в конечном итоге будут ждать полной деактивации приложения, чтобы обновить удаленный модуль (приложение должно быть перезапущено, чтобы это обновление произошло).

Я заполнил ошибку, чтобы узнать, есть ли способ принудительно (не) установить модули по требованию: https://issuetracker.google.com/u/1/issues/172108742. И способ узнать, какие модули действительно установлены.

То же самое и с установкой, пока приложение не будет обновлено, модули по запросу "эмулируются", что предотвращает эти 2 вещи:

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

Как объясняется здесь: https://developer.android.com/guide/playcore/play-feature-delivery#access_downloaded_modules

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

Из https://developer.android.com/guide/app-bundle/playcore:

Удаление модуля происходит не сразу. То есть устройство удаляет их в фоновом режиме по мере необходимости для экономии места для хранения. Вы можете подтвердить, что устройство удалило модуль, вызвав SplitInstallManager.getInstalledModules() и проверив результат, как описано в предыдущем разделе.

Итак, вы можете попробовать заполнить место для хранения на вашем устройстве и посмотреть, приведет ли это к удалению:)

Кстати: на странице магазина воспроизведения для приложения, которое я сейчас тестирую с помощью "внутреннего раннего доступа", есть раздел "отложенные действия", в котором перечислены все модули, отмеченные для отложенного удаления. Также есть кнопка "запустить отложенные действия", которая фактически полностью удаляет эти модули.

Другие вопросы по тегам