|
@@ -7,6 +7,7 @@ import android.os.Build
|
|
|
import android.util.Log
|
|
import android.util.Log
|
|
|
import androidx.core.content.ContextCompat
|
|
import androidx.core.content.ContextCompat
|
|
|
import com.example.modifier.http.KtorClient
|
|
import com.example.modifier.http.KtorClient
|
|
|
|
|
+import com.example.modifier.model.Backup
|
|
|
import com.example.modifier.model.TelephonyConfig
|
|
import com.example.modifier.model.TelephonyConfig
|
|
|
import com.example.modifier.ui.shellRun
|
|
import com.example.modifier.ui.shellRun
|
|
|
import com.example.modifier.utils.RcsHackTool
|
|
import com.example.modifier.utils.RcsHackTool
|
|
@@ -23,6 +24,7 @@ import org.apache.commons.lang3.RandomStringUtils
|
|
|
import org.apache.commons.lang3.StringUtils
|
|
import org.apache.commons.lang3.StringUtils
|
|
|
import java.io.File
|
|
import java.io.File
|
|
|
import java.io.FileWriter
|
|
import java.io.FileWriter
|
|
|
|
|
+import java.nio.file.Files
|
|
|
import java.time.ZoneId
|
|
import java.time.ZoneId
|
|
|
import java.time.ZonedDateTime
|
|
import java.time.ZonedDateTime
|
|
|
import java.time.format.DateTimeFormatter
|
|
import java.time.format.DateTimeFormatter
|
|
@@ -520,43 +522,85 @@ object Global {
|
|
|
|
|
|
|
|
@SuppressLint("SdCardPath")
|
|
@SuppressLint("SdCardPath")
|
|
|
@JvmStatic
|
|
@JvmStatic
|
|
|
- suspend fun backup(packageName: String, dir: String) {
|
|
|
|
|
- val cmds = mutableListOf("pm suspend $packageName", "am force-stop $packageName")
|
|
|
|
|
-
|
|
|
|
|
- if (!shellRun("ls /data/data/$packageName")["error"]!!.contains("No such file or directory")) {
|
|
|
|
|
- cmds.add("cp -r /data/data/$packageName $dir/data")
|
|
|
|
|
|
|
+ suspend fun backup() {
|
|
|
|
|
+ val context = Utils.getContext()
|
|
|
|
|
+ val dest = File(
|
|
|
|
|
+ ContextCompat.getExternalFilesDirs(context, "backup")[0],
|
|
|
|
|
+ System.currentTimeMillis().toString()
|
|
|
|
|
+ )
|
|
|
|
|
+ dest.mkdirs()
|
|
|
|
|
+ val file = File(ContextCompat.getDataDir(context), "config.json")
|
|
|
|
|
+ if (!file.exists()) {
|
|
|
|
|
+ throw Exception("Config file not found")
|
|
|
|
|
+ }
|
|
|
|
|
+ withContext(Dispatchers.IO) {
|
|
|
|
|
+ IOUtils.copy(
|
|
|
|
|
+ Files.newInputStream(file.toPath()),
|
|
|
|
|
+ Files.newOutputStream(File(dest, "config.json").toPath())
|
|
|
|
|
+ )
|
|
|
}
|
|
}
|
|
|
- if (!shellRun("ls /data/user_de/0/$packageName")["error"]!!.contains("No such file or directory")) {
|
|
|
|
|
- cmds.add("cp -r /data/user_de/0/$packageName $dir/user_de")
|
|
|
|
|
|
|
+ val dataDir = File(dest, "data")
|
|
|
|
|
+ dataDir.mkdirs()
|
|
|
|
|
+
|
|
|
|
|
+ val packages = mutableListOf(
|
|
|
|
|
+ "com.google.android.apps.messaging",
|
|
|
|
|
+ "com.google.android.gms",
|
|
|
|
|
+ "com.google.android.gsf",
|
|
|
|
|
+ )
|
|
|
|
|
+ packages.forEach {
|
|
|
|
|
+ File(dataDir, it).mkdirs()
|
|
|
}
|
|
}
|
|
|
- if (!shellRun("ls /sdcard/Android/data/$packageName")["error"]!!.contains("No such file or directory")) {
|
|
|
|
|
- cmds.add("cp -r /sdcard/Android/data/$packageName $dir/external")
|
|
|
|
|
|
|
+
|
|
|
|
|
+ val cmds = mutableListOf<String>()
|
|
|
|
|
+ cmds.addAll(packages.flatMap { mutableListOf("pm suspend $it", "am force-stop $it") })
|
|
|
|
|
+
|
|
|
|
|
+ for (pkg in packages) {
|
|
|
|
|
+ if (!shellRun("ls /data/data/$pkg")["error"]!!.contains("No such file or directory")) {
|
|
|
|
|
+ cmds.add("cp -r /data/data/$pkg $dataDir/$pkg/data")
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!shellRun("ls /data/user_de/0/$pkg")["error"]!!.contains("No such file or directory")) {
|
|
|
|
|
+ cmds.add("cp -r /data/user_de/0/$pkg $dataDir/$pkg/user_de")
|
|
|
|
|
+ }
|
|
|
|
|
+ if (!shellRun("ls /sdcard/Android/data/$pkg")["error"]!!.contains("No such file or directory")) {
|
|
|
|
|
+ cmds.add("cp -r /sdcard/Android/data/$pkg $dataDir/$pkg/external")
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
- cmds.add("pm unsuspend $packageName")
|
|
|
|
|
|
|
+
|
|
|
|
|
+ cmds.addAll(packages.reversed().map { "pm unsuspend $it" })
|
|
|
shellRun(*cmds.toTypedArray())
|
|
shellRun(*cmds.toTypedArray())
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
@JvmStatic
|
|
@JvmStatic
|
|
|
- suspend fun restore(packageName: String, dir: String, uid: Int) {
|
|
|
|
|
- val cmds = mutableListOf("pm suspend $packageName", "am force-stop $packageName")
|
|
|
|
|
|
|
+ suspend fun restore(backup: Backup) {
|
|
|
|
|
+ save(backup.config, false)
|
|
|
|
|
+ val packages = mutableListOf(
|
|
|
|
|
+ "com.google.android.apps.messaging",
|
|
|
|
|
+ "com.google.android.gms",
|
|
|
|
|
+ "com.google.android.gsf",
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
- if (File("$dir/data").exists()) {
|
|
|
|
|
- cmds.add("rm -rf /data/data/$packageName/*")
|
|
|
|
|
- cmds.add("cp -r $dir/data/* /data/data/$packageName")
|
|
|
|
|
- cmds.add("chown -R $uid:$uid /data/data/$packageName")
|
|
|
|
|
- }
|
|
|
|
|
- if (File("$dir/user_de").exists()) {
|
|
|
|
|
- cmds.add("rm -rf /data/user_de/0/$packageName/*")
|
|
|
|
|
- cmds.add("cp -r $dir/user_de/* /data/user_de/0/$packageName")
|
|
|
|
|
- cmds.add("chown -R $uid:$uid /data/user_de/0/$packageName")
|
|
|
|
|
- }
|
|
|
|
|
- if (File("$dir/external").exists()) {
|
|
|
|
|
- cmds.add("rm -rf /sdcard/Android/data/$packageName/*")
|
|
|
|
|
- cmds.add("cp -r $dir/external/* /sdcard/Android/data/$packageName")
|
|
|
|
|
- cmds.add("chown -R $uid:$uid /sdcard/Android/data/$packageName")
|
|
|
|
|
|
|
+ val cmds = mutableListOf<String>()
|
|
|
|
|
+ cmds.addAll(packages.flatMap { mutableListOf("pm suspend $it", "am force-stop $it") })
|
|
|
|
|
+ val packageManager = Utils.getContext().packageManager
|
|
|
|
|
+ for (pkg in packages) {
|
|
|
|
|
+ val uid = packageManager.getApplicationInfo(pkg, 0).uid
|
|
|
|
|
+ if (File("${backup.path}/data/$pkg/data").exists()) {
|
|
|
|
|
+ cmds.add("rm -rf /data/data/$pkg/*")
|
|
|
|
|
+ cmds.add("cp -r ${backup.path}/data/$pkg/data/* /data/data/$pkg")
|
|
|
|
|
+ cmds.add("chown -R $uid:$uid /data/data/$pkg")
|
|
|
|
|
+ }
|
|
|
|
|
+ if (File("${backup.path}/data/$pkg/user_de").exists()) {
|
|
|
|
|
+ cmds.add("rm -rf /data/user_de/0/$pkg/*")
|
|
|
|
|
+ cmds.add("cp -r ${backup.path}/data/$pkg/user_de/* /data/user_de/0/$pkg")
|
|
|
|
|
+ cmds.add("chown -R $uid:$uid /data/user_de/0/$pkg")
|
|
|
|
|
+ }
|
|
|
|
|
+ if (File("${backup.path}/data/$pkg/external").exists()) {
|
|
|
|
|
+ cmds.add("rm -rf /sdcard/Android/data/$pkg/*")
|
|
|
|
|
+ cmds.add("cp -r ${backup.path}/data/$pkg/external/* /sdcard/Android/data/$pkg")
|
|
|
|
|
+ cmds.add("chown -R $uid:$uid /sdcard/Android/data/$pkg")
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
- cmds.add("pm unsuspend $packageName")
|
|
|
|
|
|
|
+ cmds.addAll(packages.reversed().map { "pm unsuspend $it" })
|
|
|
shellRun(*cmds.toTypedArray())
|
|
shellRun(*cmds.toTypedArray())
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|