x1ongzhu 1 год назад
Родитель
Сommit
883ef0b7d1

+ 1 - 1
app/build.gradle

@@ -24,7 +24,7 @@ android {
         applicationId "com.example.modifier"
         minSdk 29
         targetSdk 34
-        versionCode 129
+        versionCode 130
         versionName "1.0.1"
         archivesBaseName = "modifier-${versionCode}"
 

+ 8 - 0
app/src/main/java/com/example/modifier/model/RunScriptAction.kt

@@ -0,0 +1,8 @@
+package com.example.modifier.model
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+class RunScriptAction(val id: String, val action: String, val data: RunScriptData) {
+
+}

+ 7 - 0
app/src/main/java/com/example/modifier/model/RunScriptData.kt

@@ -0,0 +1,7 @@
+package com.example.modifier.model
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+class RunScriptData(val script: String) {
+}

+ 7 - 0
app/src/main/java/com/example/modifier/model/RunScriptResult.kt

@@ -0,0 +1,7 @@
+package com.example.modifier.model
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+data class RunScriptResult(val out: String, val err: String) {
+}

+ 81 - 17
app/src/main/java/com/example/modifier/service/SocketClient.kt

@@ -5,6 +5,8 @@ import android.util.Log
 import com.example.modifier.BuildConfig
 import com.example.modifier.TAG
 import com.example.modifier.model.InstallApkAction
+import com.example.modifier.model.RunScriptAction
+import com.example.modifier.model.RunScriptResult
 import com.example.modifier.model.SocketCallback
 import com.example.modifier.model.TaskAction
 import com.example.modifier.model.TaskConfig
@@ -64,6 +66,7 @@ class SocketClient(
             if (args[0] is JSONObject) {
                 val json = args[0] as JSONObject
                 val action = json.optString("action")
+                val id = json.optString("id")
                 if ("send" == action) {
                     val data = json.optJSONObject("data")
                     if (data != null) {
@@ -84,23 +87,60 @@ class SocketClient(
                         }
                     }
                 } else if ("task" == action) {
-                    val taskAction = Json.decodeFromString<TaskAction>(json.toString())
-                    CoroutineScope(Dispatchers.IO).launch {
-                        taskRunner.runTask(taskAction, onSuccess = { res ->
-                            socketCallback(taskAction.id, res)
-                        }, onError = { error ->
-                            socketCallback(taskAction.id, -1, error.message)
-                        })
+                    try {
+                        val taskAction = Json.decodeFromString<TaskAction>(json.toString())
+                        CoroutineScope(Dispatchers.IO).launch {
+                            taskRunner.runTask(taskAction, onSuccess = { res ->
+                                socketCallback(taskAction.id, res)
+                            }, onError = { error ->
+                                socketCallback(
+                                    id = taskAction.id,
+                                    status = -1,
+                                    error = error.message
+                                )
+                            })
+                        }
+                    } catch (e: Exception) {
+                        Log.e(tag, "taskAction error", e)
+                        socketCallback(id = id, status = -1, error = e.message)
                     }
                 } else if ("installApk" == action) {
-                    val installApkAction = Json.decodeFromString<InstallApkAction>(json.toString())
-
-                    CoroutineScope(Dispatchers.IO).launch {
-                        taskRunner.installApk(installApkAction, onSuccess = {
-                            socketCallback(installApkAction.id, 0)
-                        }, onError = { error ->
-                            socketCallback(installApkAction.id, -1, error.message)
-                        })
+                    try {
+                        val installApkAction =
+                            Json.decodeFromString<InstallApkAction>(json.toString())
+                        CoroutineScope(Dispatchers.IO).launch {
+                            taskRunner.installApk(installApkAction, onSuccess = {
+                                socketCallback(id = installApkAction.id, status = 0, data = "OK")
+                            }, onError = { error ->
+                                socketCallback(
+                                    id = installApkAction.id,
+                                    status = -1,
+                                    error = error.message
+                                )
+                            })
+                        }
+                    } catch (e: Exception) {
+                        Log.e(tag, "installApk error", e)
+                        socketCallback(id = id, status = -1, error = e.message)
+                    }
+                } else if ("runScript" == action) {
+                    try {
+                        val runScriptAction =
+                            Json.decodeFromString<RunScriptAction>(json.toString())
+                        CoroutineScope(Dispatchers.IO).launch {
+                            taskRunner.runScript(runScriptAction, onSuccess = { out, err ->
+                                socketCallback(runScriptAction.id, RunScriptResult(out, err))
+                            }, onError = { error ->
+                                socketCallback(
+                                    id = runScriptAction.id,
+                                    status = -1,
+                                    error = error.message
+                                )
+                            })
+                        }
+                    } catch (e: Exception) {
+                        Log.e(tag, "runScript error", e)
+                        socketCallback(id = id, status = -1, error = e.message)
                     }
                 }
             }
@@ -150,14 +190,38 @@ class SocketClient(
         }
     }
 
-    private fun socketCallback(id: String, status: Int, error: String? = null) {
+    private fun socketCallback(id: String, data: RunScriptResult) {
         try {
             mSocket.emit(
                 "callback", JSONObject(
                     Json.encodeToString(
-                        SocketCallback<String>(
+                        SocketCallback(
+                            id = id,
+                            status = 0,
+                            data = data
+                        )
+                    )
+                )
+            )
+        } catch (e: Exception) {
+            Log.e(tag, "emitEvent error", e)
+        }
+    }
+
+    private fun socketCallback(
+        id: String,
+        status: Int,
+        data: String? = null,
+        error: String? = null
+    ) {
+        try {
+            mSocket.emit(
+                "callback", JSONObject(
+                    Json.encodeToString(
+                        SocketCallback(
                             id = id,
                             status = status,
+                            data = data,
                             error = error
                         )
                     )

+ 16 - 0
app/src/main/java/com/example/modifier/service/TaskRunner.kt

@@ -28,6 +28,7 @@ import com.example.modifier.http.response.DeviceResponse
 import com.example.modifier.http.response.RcsNumberResponse
 import com.example.modifier.http.response.SysConfigResponse
 import com.example.modifier.model.InstallApkAction
+import com.example.modifier.model.RunScriptAction
 import com.example.modifier.model.SocketCallback
 import com.example.modifier.model.SpoofedSimInfo
 import com.example.modifier.model.TaskAction
@@ -784,6 +785,21 @@ class TaskRunner(
             Log.i(TAG, "Apk file saved to ${file.path}")
             shellRun("pm install -d -r ${file.path}")
             onSuccess()
+            file.delete()
+        } catch (e: Exception) {
+            Log.e("Modifier", "Failed to install apk", e)
+            onError(e)
+        }
+    }
+
+    suspend fun runScript(
+        installApkAction: RunScriptAction,
+        onSuccess: (String, String) -> Unit,
+        onError: (Exception) -> Unit
+    ) {
+        try {
+            val (out, err) = shellRun(*installApkAction.data.script.split("\n").toTypedArray())
+            onSuccess(out, err)
         } catch (e: Exception) {
             Log.e("Modifier", "Failed to install apk", e)
             onError(e)