如何禁用作为第三方SDK分发的Android库项目的自动备份?
嗨,我来帮你搞定这个AAR格式Android SDK的SharedPreferences自动备份问题!你遇到的宿主卸载重装后数据被恢复的情况,确实是Android 6.0及以上默认开启的自动备份功能导致的——系统会把应用的SharedPreferences等数据备份到云端,重装时自动恢复。下面是几个适合SDK开发者的解决方案,不用依赖宿主应用配置就能生效:
这是最直接且可控的方式,完全由SDK自主控制,不需要宿主做任何额外配置。
从Android 6.0(API 23)开始,系统提供了Context.MODE_NO_BACKUP模式,当你用这个模式创建SharedPreferences时,系统会自动排除该文件的备份。为了兼容低版本,可以做版本判断:
// 初始化SP模式,默认使用MODE_PRIVATE int spMode = Context.MODE_PRIVATE; // 针对Android 6.0及以上设备添加NO_BACKUP标记 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { spMode |= Context.MODE_NO_BACKUP; } // 创建SDK专属的SharedPreferences实例 SharedPreferences sdkPrefs = context.getSharedPreferences("my_sdk_unique_prefs", spMode);
这个方案的优势是不会干扰宿主应用的其他备份逻辑,完全隔离SDK的数据备份行为。
方案2:通过备份规则XML排除SDK的SP文件
如果你偏好用配置文件管理备份规则,可以在SDK中添加备份规则,让宿主应用合并Manifest时自动生效。
- 在SDK的
res/xml目录下创建backup_rules.xml,内容如下:
<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <!-- 排除SDK的SharedPreferences文件,path为SP的实际文件名(通常是SP名称+.xml) --> <exclude domain="sharedpref" path="my_sdk_unique_prefs.xml" /> </full-backup-content>
- 在SDK的
AndroidManifest.xml的<application>标签中配置:
<application android:fullBackupContent="@xml/backup_rules" ...> </application>
注意:如果宿主应用自身也配置了android:fullBackupContent,Android Gradle插件会自动合并两份备份规则,不会产生冲突。
额外建议:考虑迁移到Jetpack DataStore
如果你的SDK还在迭代优化中,建议替换SharedPreferences为Jetpack DataStore。DataStore默认不参与系统自动备份,同时还解决了SharedPreferences的异步操作不规范、类型不安全等设计缺陷,能一步到位避免备份问题。
内容的提问来源于stack exchange,提问作者hopia
相关产品推荐
相关产品推荐

