Android Q: сохранение состояния разрешений после удаления

У меня есть приложение, ориентированное на Android 27 API. Я тестирую это приложение из игрового магазина на устройстве Android Q, которое работает с управляемым устройством. Steps i followed on device Android Q having build build 6-

  1. Установленное приложение и разрешены все разрешения (дополнительные разрешения, которые также являются пользовательскими разрешениями).
  2. Удалил приложение с устройства.
  3. Снова установил приложение из игрового магазина и обнаружил, что приложение запрашивает только пользовательское разрешение, а не разрешение.

Это ожидаемое поведение? Кто-нибудь знает, как это?


person Manmohan Badaya    schedule 02.09.2019    source источник
comment
Согласно официальному сайту Android, никаких изменений, подобных тем, что ты упомянул.   -  person Bugs Happen    schedule 02.09.2019
comment
@BugsHappen Да, но по этой ссылке нет информации о рабочем управляемом устройстве.   -  person Manmohan Badaya    schedule 02.09.2019
comment
Ответ Рахула правильный. Вы можете очистить сохраненную информацию вручную, выбрав «Настройки», «Приложения», «Хранилище», «Очистить данные». Что меня больше всего беспокоит в этом, так это то, что приложение не может контролировать только его части, резервное копирование Google — это все или ничего, а по умолчанию включено.   -  person The Tahaan    schedule 12.09.2019


Ответы (2)


Это так называемое автоматическое резервное копирование.

Файлы, для которых созданы резервные копии

По умолчанию Auto Backup включает файлы в большинстве каталогов, назначенных вашему приложению системой:

  1. Файлы общих настроек.
  2. Файлы, сохраненные во внутренней памяти вашего приложения, доступ к которым осуществляется с помощью getFilesDir() или getDir(String, int).
  3. Файлы в каталоге, возвращаемом функцией getDatabasePath(String), который также включает файлы, созданные с помощью класса SQLiteOpenHelper.
  4. Файлы на внешнем хранилище в каталоге, возвращенном getExternalFilesDir(String).

Автоматическое резервное копирование исключает файлы в каталогах, возвращаемых функциями getCacheDir(), getCodeCacheDir() или getNoBackupFilesDir(). Файлы, сохраненные в этих местах, нужны только временно или намеренно исключены из операций резервного копирования.

Вы можете управлять им с помощью AndroidManifest.xml. См. раздел android:allowBackup.

<manifest ... >
    ...
    <application android:allowBackup="true" ... >
        ...
    </application>
</manifest>

ИЗМЕНИТЬ

android:fullBackupContent="false"
android:fullBackupOnly="false"

Есть еще 2 правила, которые можно установить.

ИЗМЕНИТЬ 2

Я только что нашел больше полезной информации на официальном сайте Android. см. здесь

Примечание. Любые разрешения, которые пользователь предоставляет вашему приложению, автоматически резервируются и восстанавливаются системой на устройствах под управлением Android 7.0 (API 24) или новее. Однако если пользователь удалит ваше приложение, система аннулирует все предоставленные разрешения, и пользователь должен предоставить их снова.

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

Надеюсь, это каким-то образом ответит на ваш вопрос.

person Rahul Khurana    schedule 05.09.2019
comment
Эта проблема связана с Android Q и рабочим управляемым устройством. Он не существует ниже Q (p или ниже). - person Manmohan Badaya; 05.09.2019
comment
@Manmohan просто установил для android:allowBackup значение false и проверил. Дайте мне знать, если вы все еще сталкивались с той же проблемой - person Rahul Khurana; 05.09.2019
comment
@Manmohan протестируйте его на нескольких устройствах. Вы используете телефон MI? - person Rahul Khurana; 05.09.2019
comment
Я тестирую Android 10, который недоступен на большинстве ОС. Я тестирую его на Google Pixel. - person Manmohan Badaya; 05.09.2019
comment
@Manmohan Я немного изменил свой ответ - person Rahul Khurana; 05.09.2019
comment
Прежде чем настраивать это, почему это применимо только к Android Q с рабочим управляемым устройством? Любая подсказка? - person Manmohan Badaya; 05.09.2019
comment
@Manmohan Не могу рассказать вам об устройствах, управляемых работой, но в Android Q они выпустили много серьезных изменений, таких как scoped storage, а также адаптивные изменения батареи, возможно, это просто еще один умный шаг, сделанный разработчиками Google для улучшения взаимодействия с пользователем. Потому что обычный пользователь был бы счастлив увидеть настройки, которые он/она применил в последний раз. - person Rahul Khurana; 05.09.2019
comment
Давайте продолжим обсуждение в чате. - person Manmohan Badaya; 06.09.2019
comment
Проблема с другим поведением на эмуляторе связана с сервисом Play, который доступен не на всех эмуляторах. - person The Tahaan; 12.09.2019

Относительно того, является ли это ожидаемым поведением в Android Q: эта проблема не воспроизводится в эмуляторе Android Q. Думаю, это считается базовым.

Подробнее о технических деталях:

Логика разрешений во время выполнения в Android в основном находится в PackageManagerService (в основном бухгалтерский учет для каждого пакета) и ActivityManagerService (в основном логика разрешений во время выполнения запроса)

Когда пакет удаляется, метод очистки данных removePackageDataLIF вызывается. Он отвечает за очистку всего, включая разрешения приложений. Эта логика не изменила Android Q.

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

Но остается вопрос: как такое могло произойти?

Одним из возможных объяснений может быть флаг PackageManager.DELETE_KEEP_DATA

Вы можете легко удалить пакет, сохранив его каталог данных после удаления:

$ adb shell cmd package uninstall -k your.app.id

(-k для хранения данных)

Теперь, чтобы проверить, сохраняются ли разрешения вместе с каталогом данных:

$ adb root && adb shell cat /data/system/users/0/runtime-permissions.xml | grep your.app.id -A 10

(для этой команды требуется отлаживаемая сборка прошивки телефона)

Глядя на источник removePackageDataLIF и попробовав его на моем пикселе с отлаживаемой прошивкой, разрешение приложения сохраняется, если вы сохранили его данные.


Еще одно объяснение

PackageManagerService есть еще один интересный метод setKeepUninstalledPackages Что в основном заставляет Android сохранять все данные для указанных приложений, даже если они были удалены.

Как вы сказали, устройство работает управляемо. Обычно управление осуществляется с помощью DevicePolicyManager. Одной из доступных политик является setKeepUninstalledPackages, который вызывает упомянутый выше метод PackageManagerService.

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

person Amaksoft    schedule 05.09.2019
comment
Проблема будет воспроизводиться только для дополнительного разрешения (настраиваемого разрешения) и рабочего управляемого устройства. Приложение администратора сохраняет все разрешения до Android p. Но с Q, запрашивающим дополнительное разрешение. - person Manmohan Badaya; 05.09.2019
comment
Позвольте мне сначала уточнить. Итак, у вас есть два приложения: одно объявляет пользовательское разрешение, а другое запрашивает его. На устройстве Android P это разрешение было предоставлено без отображения в диалоговом окне системных разрешений. На рабочем управляемом устройстве Android Q вы видите это разрешение в диалоговом окне. И ваш вопрос, почему это происходит. Верно? - person Amaksoft; 05.09.2019
comment
Да. правильный. Я хочу знать причину этого - person Manmohan Badaya; 05.09.2019
comment
Можете ли вы хотя бы дать мне больше информации об этом разрешении? Хотя бы уровень защиты? Если это не ваше приложение, вы можете сделать это, позвонив adb shell dumpsys package packagename - person Amaksoft; 05.09.2019
comment
Эти разрешения предназначены для чтения данных из другого приложения, которое также является приложением администратора (URI предоставляется из пользовательского приложения, для которого требуются эти разрешения). - person Manmohan Badaya; 05.09.2019
comment
Каково protectionLevel вашего пользовательского разрешения? - person Amaksoft; 05.09.2019
comment
Давайте продолжим обсуждение в чате. - person Amaksoft; 05.09.2019
comment
...скорее всего это подпись. - person Martin Zeitler; 12.09.2019