我有一个针对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...
-
这是预期的行为吗?有人知道这是怎么回事吗?
答案 0 :(得分:2)
这叫Auto Backup。
已备份的文件
默认情况下,自动备份在大多数目录中包含文件 由系统分配给您的应用:
- 共享的首选项文件。
- 保存到应用程序内部存储中的文件,可以通过getFilesDir()或getDir(String,int)访问。
- 文件中的 getDatabasePath(String)返回的目录,其中还包括 使用SQLiteOpenHelper类创建的文件。
- 外部文件 存储在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小时)。
希望这会以某种方式回答您的查询。
答案 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
方法。
请检查您的设备管理员应用代码以进行验证。