From f2c10154703771e3477e3f7a8dd52052e8951cc1 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Thu, 3 Aug 2017 15:11:16 +0800 Subject: [PATCH] fix(RootAutomatorEngine): forceStop() not working --- .../content/ScriptListNavigatorContent.java | 16 +++++- .../stardust/scriptdroid/script/Scripts.java | 2 +- .../ui/main/task/TaskListRecyclerView.java | 12 +++- .../autojs/engine/RootAutomatorEngine.java | 9 ++- .../autojs/runtime/api/AbstractShell.java | 7 ++- .../autojs/runtime/api/ProcessShell.java | 57 +++++++++---------- .../stardust/autojs/runtime/api/Shell.java | 6 +- .../InputEventToAutoFileConverter.java | 8 ++- .../record/inputevent/TouchRecorder.java | 2 +- .../stardust/autojs/util/ProcessUtils.java | 43 ++++++++++++++ .../java/com/stardust/auojs/inrt/App.java | 1 + 11 files changed, 118 insertions(+), 45 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java diff --git a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java index 618d3ebf..079f94cb 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/floatingwindow/menu/content/ScriptListNavigatorContent.java @@ -8,6 +8,7 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; +import android.widget.ImageView; import android.workground.WrapContentLinearLayoutManager; import com.stardust.scriptdroid.R; @@ -90,9 +91,14 @@ public class ScriptListNavigatorContent implements NavigatorContent { private class FileViewHolder extends DirectoryViewHolder { + private ImageView mIcon; + private View mEdit; + FileViewHolder(final View itemView) { super(itemView); - itemView.findViewById(R.id.edit).setOnClickListener(new View.OnClickListener() { + mIcon = (ImageView) itemView.findViewById(R.id.icon); + mEdit = itemView.findViewById(R.id.edit); + mEdit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { EditActivity.editFile(v.getContext(), getScriptFile()); @@ -111,6 +117,14 @@ public class ScriptListNavigatorContent implements NavigatorContent { }); } + @Override + public void bind(ScriptFile file) { + super.bind(file); + mIcon.setImageResource(file.getType() == ScriptFile.TYPE_AUTO ? R.drawable.record_icon_18 + : R.drawable.ic_node_js_black); + mEdit.setVisibility(file.getType() == ScriptFile.TYPE_JAVA_SCRIPT ? View.VISIBLE : View.INVISIBLE); + } + private ScriptFile getScriptFile() { return mFloatingScriptFileListView.getAdapter().getScriptFileAt(getAdapterPosition()); diff --git a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java index 488d8c35..f71c789f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java +++ b/app/src/main/java/com/stardust/scriptdroid/script/Scripts.java @@ -109,7 +109,7 @@ public class Scripts { } public static ScriptExecution runRepeatedly(ScriptFile scriptFile, int loopTimes, long delay, long interval) { - ScriptSource source = new JavaScriptFileSource(scriptFile); + ScriptSource source = scriptFile.toSource(); String directoryPath = scriptFile.getParent(); return AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() .requirePath(directoryPath, StorageScriptProvider.DEFAULT_DIRECTORY_PATH) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java index 12b940f8..a4bcae58 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskListRecyclerView.java @@ -8,18 +8,23 @@ import android.util.AttributeSet; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.TextView; import android.workground.WrapContentLinearLayoutManager; import com.stardust.autojs.ScriptEngineService; +import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.ScriptEngineManager; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.execution.ScriptExecutionListener; import com.stardust.autojs.execution.SimpleScriptExecutionListener; import com.stardust.autojs.engine.ScriptEngine; +import com.stardust.autojs.script.AutoFileSource; +import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.script.ScriptFile; import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; import java.util.ArrayList; @@ -139,7 +144,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri } private void onScriptANR(final ScriptEngine engine) { - // TODO: 2017/7/19 强制停止 + // TODO: 2017/7/19 强制停止aq1sws2 } @Override @@ -192,6 +197,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri private class ViewHolder extends RecyclerView.ViewHolder { + ImageView icon; TextView name, detail; View stop; @@ -200,6 +206,7 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri itemView.setOnClickListener(mOnItemClickListenerProxy); name = (TextView) itemView.findViewById(R.id.name); detail = (TextView) itemView.findViewById(R.id.detail); + icon = (ImageView) itemView.findViewById(R.id.icon); stop = itemView.findViewById(R.id.stop); stop.setOnClickListener(mOnStopClickListener); } @@ -209,6 +216,9 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri return; name.setText(source.getName()); detail.setText(source.toString()); + //ignore android studio warning: use equals to compare string + icon.setImageResource(source.getEngineName() == AutoFileSource.ENGINE ? R.drawable.record_icon_18 + : R.drawable.ic_node_js_black); } } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RootAutomatorEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RootAutomatorEngine.java index b92d335d..7bec597f 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RootAutomatorEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RootAutomatorEngine.java @@ -6,6 +6,7 @@ import android.util.Log; import com.stardust.autojs.runtime.api.AbstractShell; import com.stardust.autojs.runtime.api.ProcessShell; +import com.stardust.autojs.runtime.api.Shell; import com.stardust.autojs.runtime.record.inputevent.InputDevices; import com.stardust.autojs.script.AutoFileSource; import com.stardust.autojs.script.JavaScriptFileSource; @@ -31,6 +32,7 @@ public class RootAutomatorEngine extends ScriptEngine.AbstractScriptEngine 0) + return; mTouchDevice = touchDevice; } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java index d990ff50..f156986f 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/ProcessShell.java @@ -3,12 +3,15 @@ package com.stardust.autojs.runtime.api; import android.util.Log; +import com.stardust.autojs.util.ProcessUtils; import com.stardust.pio.UncheckedIOException; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.InputStreamReader; +import java.io.OutputStream; import java.io.Reader; /** @@ -176,13 +179,10 @@ public class ProcessShell extends AbstractShell { public static Result execCommand(String[] commands, boolean isRoot) { Result commandResult = new Result(); - if (commands == null || commands.length == 0) return commandResult; + if (commands == null || commands.length == 0) + throw new IllegalArgumentException("command is empty"); Process process = null; DataOutputStream os = null; - BufferedReader successResult = null; - BufferedReader errorResult = null; - StringBuilder successMsg = null; - StringBuilder errorMsg = null; try { process = Runtime.getRuntime().exec(isRoot ? COMMAND_SU : COMMAND_SH); os = new DataOutputStream(process.getOutputStream()); @@ -196,41 +196,38 @@ public class ProcessShell extends AbstractShell { os.writeBytes(COMMAND_EXIT); os.flush(); commandResult.code = process.waitFor(); - successMsg = new StringBuilder(); - errorMsg = new StringBuilder(); - successResult = new BufferedReader(new InputStreamReader(process.getInputStream())); - errorResult = new BufferedReader(new InputStreamReader(process.getErrorStream())); - String s; - while ((s = successResult.readLine()) != null) successMsg.append(s); - while ((s = errorResult.readLine()) != null) errorMsg.append(s); - commandResult.result = successMsg.toString(); - commandResult.error = errorMsg.toString(); - Log.i(TAG, commandResult.toString()); + commandResult.result = readAll(process.getInputStream()); + commandResult.error = readAll(process.getErrorStream()); + Log.d(TAG, commandResult.toString()); } catch (Exception e) { - String errmsg = e.getMessage(); - if (errmsg != null) { - Log.e(TAG, errmsg); - } else { - e.printStackTrace(); - } + e.printStackTrace(); } finally { try { if (os != null) os.close(); - if (successResult != null) successResult.close(); - if (errorResult != null) errorResult.close(); - } catch (IOException e) { - String errMsg = e.getMessage(); - if (errMsg != null) { - Log.e(TAG, errMsg); - } else { - e.printStackTrace(); + if (process != null) { + process.getInputStream().close(); + process.getOutputStream().close(); } + } catch (IOException ignored) { + + } + if (process != null) { + process.destroy(); } - if (process != null) process.destroy(); } return commandResult; } + private static String readAll(InputStream inputStream) throws IOException { + String line; + StringBuilder builder = new StringBuilder(); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + while ((line = reader.readLine()) != null) { + builder.append(line); + } + return builder.toString(); + } + public static Result execCommand(String command, boolean isRoot) { String[] commands = command.split("\n"); return execCommand(commands, isRoot); diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java index 9e6dd008..4a3407fa 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Shell.java @@ -25,7 +25,7 @@ import jackpal.androidterm.util.TermSettings; * Created by Stardust on 2017/4/24. */ -public class Shell extends AbstractShell implements AutoCloseable { +public class Shell extends AbstractShell { public interface Callback { @@ -181,10 +181,6 @@ public class Shell extends AbstractShell implements AutoCloseable { } } - @Override - public void close() { - exit(); - } private class MyShellTermSession extends ShellTermSession { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/InputEventToAutoFileConverter.java b/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/InputEventToAutoFileConverter.java index deb2979a..b388c4ee 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/InputEventToAutoFileConverter.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/InputEventToAutoFileConverter.java @@ -1,5 +1,6 @@ package com.stardust.autojs.runtime.record.inputevent; +import android.content.Context; import android.support.annotation.NonNull; import com.stardust.autojs.engine.RootAutomatorEngine; @@ -11,6 +12,8 @@ import java.io.DataOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Date; /** * Created by Stardust on 2017/8/2. @@ -23,9 +26,10 @@ public class InputEventToAutoFileConverter extends InputEventConverter { private DataOutputStream mDataOutputStream; private File mTmpFile; - public InputEventToAutoFileConverter() { + public InputEventToAutoFileConverter(Context context) { try { - mTmpFile = File.createTempFile("Record" + System.currentTimeMillis(), ".auto"); + mTmpFile = new File(context.getCacheDir(), SimpleDateFormat.getDateTimeInstance().format(new Date()) + ".auto"); + mTmpFile.deleteOnExit(); mDataOutputStream = new DataOutputStream(new FileOutputStream(mTmpFile)); writeFileHeader(); } catch (IOException e) { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/TouchRecorder.java b/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/TouchRecorder.java index e63a44ee..bab35bcd 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/TouchRecorder.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/record/inputevent/TouchRecorder.java @@ -9,7 +9,7 @@ import android.content.Context; public class TouchRecorder extends InputEventRecorder { public TouchRecorder(Context context) { - super(context, new InputEventToAutoFileConverter()); + super(context, new InputEventToAutoFileConverter(context)); listen(); } diff --git a/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java b/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java new file mode 100644 index 00000000..130ac783 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/util/ProcessUtils.java @@ -0,0 +1,43 @@ +package com.stardust.autojs.util; + +import android.util.Log; + +import com.stardust.autojs.runtime.api.ProcessShell; + +import java.lang.reflect.Field; + +/** + * Created by Stardust on 2017/8/3. + */ + +public class ProcessUtils { + + + private static final String LOG_TAG = "ProcessUtils"; + + // FIXME: 2017/8/3 + public static void killProcessTree(Process process) { + int pid = getProcessPid(process); + if (pid >= 0) + kill(pid); + process.destroy(); + + } + + private static int getProcessPid(Process process) { + try { + Field pid = process.getClass().getDeclaredField("pid"); + pid.setAccessible(true); + return (int) pid.get(process); + } catch (Exception e) { + e.printStackTrace(); + return -1; + } + } + + public static void kill(int pid) { + String cmd = "kill -TERM -- -" + pid; + Log.d(LOG_TAG, cmd); + ProcessShell.exec(cmd, true); + } +} diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/App.java b/inrt/src/main/java/com/stardust/auojs/inrt/App.java index 7cf3505d..1f08a119 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/App.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/App.java @@ -12,4 +12,5 @@ public class App extends Application { public void onCreate() { super.onCreate(); } + }