From fdc147b663f0bc689920f7aa7df27acb99f429b0 Mon Sep 17 00:00:00 2001 From: sakuradairong Date: Sat, 23 May 2026 14:26:13 +0800 Subject: [PATCH] refactor: replace RemoteStorage with restic rclone backend, redesign config UI Remove the old WebDAV/SMB remote storage layer (RemoteStorage, WebDavClient, SmbClient) and replace it with restic's built-in rclone backend. Unify the two config cards into a single "Restic remote backup" card with backend selector (local/WebDAV/SMB). Fix binary execution on Android 10+ via linker trampoline to bypass W^X restrictions. Co-Authored-By: Claude Opus 4.7 --- .github/copilot-instructions.md | 15 - app/MainActivity.kt | 44 -- app/activity_main.xml | 29 -- app/build.gradle | 22 +- app/proguard-rules.pro | 1 + app/{ => src/main}/AndroidManifest.xml | 15 +- app/src/main/assets/restic/arm64-v8a/restic | Bin 0 -> 23986176 bytes .../example/androidbackupgui/MainActivity.kt | 74 +++ .../androidbackupgui/backup/AppScanner.kt | 103 ++++ .../androidbackupgui/backup/BackupConfig.kt | 179 +++++++ .../backup/BackupOperation.kt | 210 ++++++++ .../androidbackupgui/backup/ResticBinary.kt | 110 ++++ .../androidbackupgui/backup/ResticWrapper.kt | 488 ++++++++++++++++++ .../backup/RestoreOperation.kt | 276 ++++++++++ .../androidbackupgui/backup/WifiManager.kt | 77 +++ .../androidbackupgui/root/RootShell.kt | 177 +++++++ .../androidbackupgui/ui/BackupFragment.kt | 224 ++++++++ .../androidbackupgui/ui/ConfigFragment.kt | 286 ++++++++++ .../androidbackupgui/ui/RestoreFragment.kt | 352 +++++++++++++ app/src/main/res/drawable/ic_backup.xml | 11 + app/src/main/res/drawable/ic_config.xml | 11 + .../res/drawable/ic_launcher_foreground.xml | 13 + app/src/main/res/drawable/ic_restore.xml | 11 + app/src/main/res/layout/activity_main.xml | 33 ++ app/src/main/res/layout/fragment_backup.xml | 69 +++ app/src/main/res/layout/fragment_config.xml | 347 +++++++++++++ app/src/main/res/layout/fragment_restore.xml | 89 ++++ app/src/main/res/menu/bottom_nav.xml | 15 + .../res/mipmap-anydpi-v26/ic_launcher.xml | 5 + app/src/main/res/values-night/colors.xml | 51 ++ app/src/main/res/values-night/themes.xml | 54 ++ app/src/main/res/values/colors.xml | 51 ++ app/src/main/res/values/ids.xml | 5 + app/src/main/res/values/strings.xml | 16 + app/src/main/res/values/themes.xml | 55 ++ gradle.properties | 3 + gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 56921 bytes gradle/wrapper/gradle-wrapper.properties | 7 + gradlew | 176 +++++++ scripts/README.md | 2 - 40 files changed, 3608 insertions(+), 98 deletions(-) delete mode 100644 .github/copilot-instructions.md delete mode 100644 app/MainActivity.kt delete mode 100644 app/activity_main.xml create mode 100644 app/proguard-rules.pro rename app/{ => src/main}/AndroidManifest.xml (55%) create mode 100755 app/src/main/assets/restic/arm64-v8a/restic create mode 100644 app/src/main/java/com/example/androidbackupgui/MainActivity.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/AppScanner.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/BackupConfig.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/BackupOperation.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/ResticBinary.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/ResticWrapper.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/RestoreOperation.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/backup/WifiManager.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/root/RootShell.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/ui/BackupFragment.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/ui/ConfigFragment.kt create mode 100644 app/src/main/java/com/example/androidbackupgui/ui/RestoreFragment.kt create mode 100644 app/src/main/res/drawable/ic_backup.xml create mode 100644 app/src/main/res/drawable/ic_config.xml create mode 100644 app/src/main/res/drawable/ic_launcher_foreground.xml create mode 100644 app/src/main/res/drawable/ic_restore.xml create mode 100644 app/src/main/res/layout/activity_main.xml create mode 100644 app/src/main/res/layout/fragment_backup.xml create mode 100644 app/src/main/res/layout/fragment_config.xml create mode 100644 app/src/main/res/layout/fragment_restore.xml create mode 100644 app/src/main/res/menu/bottom_nav.xml create mode 100644 app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml create mode 100644 app/src/main/res/values-night/colors.xml create mode 100644 app/src/main/res/values-night/themes.xml create mode 100644 app/src/main/res/values/colors.xml create mode 100644 app/src/main/res/values/ids.xml create mode 100644 app/src/main/res/values/strings.xml create mode 100644 app/src/main/res/values/themes.xml create mode 100644 gradle.properties create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew delete mode 100644 scripts/README.md diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md deleted file mode 100644 index c640e20..0000000 --- a/.github/copilot-instructions.md +++ /dev/null @@ -1,15 +0,0 @@ -- [ ] Clarify Project Requirements -- [x] Scaffold the Project -- [ ] Customize the Project -- [ ] Install Required Extensions -- [ ] Compile the Project -- [ ] Create and Run Task -- [ ] Launch the Project -- [ ] Ensure Documentation is Complete - -# 项目说明 -本项目为 backup_script 脚本提供 Android 图形化操作界面,支持本地运行脚本、参数配置、结果展示。 - -## 进度说明 -- 已完成项目结构搭建与主要文件生成。 -- 下一步将完善脚本调用、参数配置与界面交互细节。 diff --git a/app/MainActivity.kt b/app/MainActivity.kt deleted file mode 100644 index bc721fd..0000000 --- a/app/MainActivity.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.example.androidbackupgui - -import android.os.Bundle -import android.widget.* -import androidx.appcompat.app.AppCompatActivity -import java.io.BufferedReader -import java.io.DataOutputStream -import java.io.InputStreamReader - -class MainActivity : AppCompatActivity() { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_main) - - val paramInput = findViewById(R.id.paramInput) - val runButton = findViewById