本地备份通常将数据存储在设备内部或外部存储中,适合不需要跨设备同步的场景。
SharedPreferences.edit().commit()
保存数据。SharedPreferences
文件并复制到指定目录。// 备份SharedPreferences File backupFile = new File(context.getExternalFilesDir(null), "prefs_backup.xml"); SharedPreferences preferences = context.getSharedPreferences("app_prefs", MODE_PRIVATE); try (OutputStream os = new FileOutputStream(backupFile)) { preferences.save(os); }
SQLiteDatabase.backup()
方法生成备份文件。// 复制数据库文件 File dbFile = context.getDatabasePath("app.db"); File backupFile = new File(context.getExternalFilesDir(null), "app_backup.db"); try (InputStream is = new FileInputStream(dbFile); OutputStream os = new FileOutputStream(backupFile)) { byte[] buffer = new byte[1024]; int len; while ((len = is.read(buffer)) > 0) { os.write(buffer, 0, len); } }
递归复制应用专属目录下的文件到备份路径。
Robocopier
)简化文件复制逻辑。通过云服务实现跨设备数据同步,适合需要高可用性和多端一致的场景。
云服务厂商 | 适用场景 | 关键API | 数据安全 |
---|---|---|---|
Firebase Realtime Database | 实时同步小型数据(如配置、用户状态) | setValue() , onChildChanged() | 内置规则限制访问 |
AWS S3 | 存储大文件或数据库备份 | uploadObject() , getObject() | 客户端加密+IAM权限控制 |
Google Drive API | 备份用户文档类数据 | DriveContents.create() , download() | OAuth 2.0授权 |
Tencent Cloud COS | 国内用户大文件备份 | putObject() , getObject() | 支持HTTPS+私有桶 |
// 初始化Firebase FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference ref = database.getReference("user_data"); // 上传数据 Map<String, Object> data = new HashMap<>(); data.put("username", "test_user"); ref.setValue(data).addOnCompleteListener(task -> { if (task.isSuccessful()) { Log.d("Backup", "Data uploaded to Firebase"); } });
Android 6.0+ 提供自动备份机制,需在 AndroidManifest.xml
中声明:
<application android:allowBackup="true" android:fullBackupContent="@xml/autobackup" > ... </application>
<!-仅备份SharedPreferences和数据库 --> <full-backup-content> <include domain="sharedpref" path="app_prefs.xml" /> <include domain="database" path="app.db" /> <exclude domain="file" path="./cache/." /> <!-排除缓存文件 --> </full-backup-content>
BackupAgent
或 Key/ValueBackupManager
加密敏感数据。// 自定义BackupAgent public class MyBackupAgent extends BackupAgentHelper { @Override public void onCreate() { // 加密逻辑 } }
加密阶段 | 推荐方案 | 示例工具 |
---|---|---|
本地存储 | AES-256对称加密 | Android Cipher 类 |
传输过程 | SSL/TLS协议 | OkHttp + HTTPS |
云存储 | 客户端加密+服务器端验证 | Firebase规则+AWS KMS |
// 加密数据 String plaintext = "sensitive_data"; Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); SecretKeySpec key = new SecretKeySpec(keyBytes, "AES"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encrypted = cipher.doFinal(plaintext.getBytes()); // 存储加密后的数据 SharedPreferences.Editor editor = sharedPreferences.edit(); editor.putString("encrypted_key", Base64.encodeToString(encrypted, Base64.DEFAULT)); editor.apply();
解答:
onComplete
回调)。BackupManager
的 dataChanged()
触发备份状态检查。解答:
ZipOutputStream
)。WorkManager
在空闲时执行备份,避免阻塞主线程