【问题标题】:Android Q: Permissions maintaining state after uninstallAndroid Q:卸载后保持状态的权限
【发布时间】:2019-09-02 09:53:52
【问题描述】:

我有一个针对 android 27 API 的应用程序。我正在设备 Android Q 上的 playstore 测试这个应用程序,该设备工作托管设备。 Steps i followed on device Android Q having build build 6-

  1. 已安装应用并允许所有权限(附加权限也是自定义权限)。
  2. 从设备卸载应用程序。
  3. 再次从 Playstore 安装应用,发现该应用只请求自定义权限而不是没有权限。

这是预期的行为吗?有谁知道这是怎么回事?

【问题讨论】:

  • 根据Android's official site的说法,好像没有你所说的变化。
  • @BugsHappen 是的,但是这个链接没有任何与工作管理设备相关的信息。
  • Rahul 的回答是正确的。您可以通过转到设置、应用程序、存储、ClearData 手动清除存储的信息。最困扰我的是应用程序不能控制它的一部分,谷歌备份是全有或全无,默认是启用的。

标签: android android-10.0


【解决方案1】:

这叫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官方网站上找到了更多有用的信息。见here

注意:用户授予您的应用程序的任何权限都是自动的 由系统在运行 Android 7.0 的设备上备份和恢复 (API 24) 或更新版本。但是,如果用户卸载您的应用程序,那么 系统清除所有授予的权限,用户必须授予他们 再次。

我最好的猜测是在用户设置/权限从系统设备/云中删除之前应该会有一些差异(比如 24 小时)。

希望这会以某种方式回答您的问题。

【讨论】:

  • 此问题与 Android Q 和工作托管设备有关。它不存在于低于 Q(p 或低于)。
  • @Manmohan 只需将 android:allowBackup 设置为 false 并进行测试。如果您仍然遇到同样的问题,请告诉我
  • @Manmohan 在多个设备上对其进行测试。你在用小米手机吗?
  • 我正在 Android 10 上进行测试,这在大多数操作系统上都不可用。我正在 Google 像素上对其进行测试。
  • 模拟器上出现不同行为的问题与Play Service有关,并非所有模拟器都可用。
【解决方案2】:

关于这是否是 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 &amp;&amp; adb shell cat /data/system/users/0/runtime-permissions.xml | grep your.app.id -A 10

(此命令需要可调试的手机固件版本)

查看removePackageDataLIF 的来源并在我的带有可调试固件的Pixel 上尝试它,如果您保留其数据,应用程序权限将保持不变。


另一种解释

PackageManagerService 有另一个有趣的方法setKeepUninstalledPackages 基本上强制 android 保留指定应用程序的所有数据,即使它们已被卸载。

正如您所说,该设备是工作管理的。通常使用DevicePolicyManager 进行管理。其中一个可用的策略是setKeepUninstalledPackages,它调用了上面提到的PackageManagerService方法。

请检查您的设备管理应用代码以进行验证。

【讨论】:

  • 问题只会在附加权限(自定义权限)和工作管理设备的情况下重现。管理员应用程序保留所有权限,直到 Android p。但是 Q 要求额外的许可。
  • 让我先澄清一下。所以你有两个应用程序:一个声明自定义权限,一个请求它。在 android P 设备上,该权限已被授予,而不会显示在系统权限对话框中。在 android Q 工作托管设备上,您会在对话框中看到该权限。你的问题是为什么会这样。对吗?
  • 是的。正确的。我想知道这背后的原因
  • 你能给我更多关于这个许可的信息吗?至少它的防护等级?如果不是您的应用程序,您可以拨打adb shell dumpsys package packagename
  • 这些权限用于从其他应用程序(也是管理应用程序)读取数据(从需要这些权限的自定义应用程序提供的 uri)。
猜你喜欢
  • 2019-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-08
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 2013-03-17
  • 1970-01-01
相关资源
最近更新 更多