Android Q:卸载后权限保持状态

时间:2019-09-02 09:53:52

标签: android android-10.0

我有一个针对android 27 API的应用程序。我正在从工作受管理的设备Android Q上的playstore测试此应用。 import os main_path = 'C:\\Users' top_folders_list = next(os.walk(main_path))[1] condition = '111' if condition in top_folders_list: ...do_something... -

  1. 已安装应用程序并允许所有权限(其他权限也属于自定义权限)。
  2. 从设备上卸载的应用程序。
  3. 再次从playstore安装了应用程序,发现该应用程序仅在询问自定义权限,而不是没有权限。

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

2 个答案:

答案 0 :(得分:2)

这叫Auto Backup

已备份的文件

  

默认情况下,自动备份在大多数目录中包含文件   由系统分配给您的应用:

     
      
  1. 共享的首选项文件。
  2.   
  3. 保存到应用程序内部存储中的文件,可以通过getFilesDir()或getDir(String,int)访问。
  4.   
  5. 文件中的   getDatabasePath(String)返回的目录,其中还包括   使用SQLiteOpenHelper类创建的文件。
  6.   
  7. 外部文件   存储在getExternalFilesDir(String)返回的目录中。
  8.   
     

自动备份排除了由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小时)。

希望这会以某种方式回答您的查询。

答案 1 :(得分:0)

关于这是否是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的来源,并在具有可调试固件的Pixel上尝试使用它,如果您保留其数据,则应用程序权限将保持不变。


另一种解释

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

正如您所说,设备是工作管理的。通常,管理是通过DevicePolicyManager完成的。可用的策略之一是setKeepUninstalledPackages,它会调用上述的PackageManagerService方法。

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

相关问题