From 8034dc7b6b43cdb13cbba6fe094bec0448a85813 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Mon, 14 Aug 2017 20:10:33 +0800 Subject: [PATCH] fix: RootAutomatorEngine.forceStop not working --- app/build.gradle | 4 +- app/src/main/assets/help/catalogue.json | 5 +++ .../assets/help/documentation/脚本引擎.md | 2 + .../需要Root权限的自动操作函数.md | 4 ++ .../需要Root权限的触摸与多点触摸.md | 22 +++++++--- .../删除全部空间留言.js | 19 ++++---- autojs/src/main/assets/binary/root_automator | Bin 13668 -> 13668 bytes .../main/assets/modules/__RootAutomator__.js | 2 +- autojs/src/main/assets/modules/__engines__.js | 13 +++--- autojs/src/main/assets/modules/__general__.js | 12 ++--- .../accessibility/SimpleActionAutomator.java | 1 + .../autojs/engine/JavaScriptEngine.java | 3 ++ .../autojs/engine/RootAutomatorEngine.java | 23 +++++++--- .../autojs/runtime/api/ProcessShell.java | 4 ++ .../autojs/runtime/api/RootAutomator.java | 41 ++++++++++++++---- .../stardust/autojs/runtime/api/Shell.java | 19 ++++++-- .../stardust/autojs/util/ProcessUtils.java | 2 +- 17 files changed, 125 insertions(+), 51 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 55db92e7..9c21e662 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 159 - versionName "2.0.16 Beta" + versionCode 160 + versionName "2.0.16 Alpha3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/app/src/main/assets/help/catalogue.json b/app/src/main/assets/help/catalogue.json index ab01a3bd..b4d48365 100644 --- a/app/src/main/assets/help/catalogue.json +++ b/app/src/main/assets/help/catalogue.json @@ -69,6 +69,11 @@ "type": "markdown", "path":"documentation" }, + { + "title": "需要Root权限的触摸与多点触摸", + "type": "markdown", + "path":"documentation" + }, { "title": "UI(用户界面)", "type": "markdown", diff --git a/app/src/main/assets/help/documentation/脚本引擎.md b/app/src/main/assets/help/documentation/脚本引擎.md index f0acfdcb..9e5872d6 100644 --- a/app/src/main/assets/help/documentation/脚本引擎.md +++ b/app/src/main/assets/help/documentation/脚本引擎.md @@ -41,6 +41,8 @@ engines模块包含了一些与脚本引擎有关的函数,包括运行其他 停止所有正在运行的脚本并显示停止的脚本数量。包括当前脚本自身。 +### engines.myEngine() + # ScriptExecution 执行脚本时返回的对象,可以通过他获取执行的引擎、 diff --git a/app/src/main/assets/help/documentation/需要Root权限的自动操作函数.md b/app/src/main/assets/help/documentation/需要Root权限的自动操作函数.md index d9ca0e29..15fb4bfe 100644 --- a/app/src/main/assets/help/documentation/需要Root权限的自动操作函数.md +++ b/app/src/main/assets/help/documentation/需要Root权限的自动操作函数.md @@ -1,9 +1,13 @@ + +注意:本章节的函数在后续版本很可能有改动!请勿过分依赖本章节函数的副作用。推荐使用RootAutomator(见《需要Root权限的触摸与多点触摸》)代替本章的触摸函数。 + 以下函数均需要root权限,可以实现任意位置的点击、滑动、长按、模拟物理按键等。 这些函数通常首字母大写以表示其特殊的权限。 这些函数均不返回任何值。 并且,这些函数的执行是异步的、非实时的,在不同机型上所用的时间不同。脚本不会等待动作执行完成才继续执行。因此最好在每个函数之后加上适当的sleep来达到期望的效果。 + 例如: ``` Tap(100, 100); diff --git a/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md b/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md index 212e03de..2898bed5 100644 --- a/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md +++ b/app/src/main/assets/help/documentation/需要Root权限的触摸与多点触摸.md @@ -10,7 +10,7 @@ var ra = RootAutomator(context); ### RootAutomator.tap(x, y\[, id\]) * x \ 横坐标 * y \ 纵坐标 -* id \ 多点触摸id。默认值为1,可以通过setDefaultId指定。 +* id \ 多点触摸id,可选,默认为1,可以通过setDefaultId指定。 点击位置(x, y)。其中id是一个整数值,用于区分多点触摸,不同的id表示不同的"手指",例如: ``` @@ -29,7 +29,7 @@ ra.exit(); * x2 \ 滑动终点横坐标 * y2 \ 滑动终点纵坐标 * duration \ 滑动时长,单位毫秒,默认值为300 -* id \ 多点触摸id +* id \ 多点触摸id,可选,默认为1 模拟一次从(x1, y1)到(x2, y2)的时间为duration毫秒的滑动。 @@ -37,28 +37,36 @@ ra.exit(); * x \ 横坐标 * y \ 纵坐标 * duration \ 按下时长 -* id \ 多点触摸id +* id \ 多点触摸id,可选,默认为1 模拟按下位置(x, y),时长为duration毫秒。 +### RootAutomator.longPress(x, y[\, id\]) +* x \ 横坐标 +* y \ 纵坐标 +* duration \ 按下时长 +* id \ 多点触摸id,可选,默认为1 + +模拟长按位置(x, y)。 + 以上为简单模拟触摸操作的函数。如果要模拟一些复杂的手势,需要更底层的函数。 ### RootAutomator.touchDown(x, y[\, id\]) * x \ 横坐标 * y \ 纵坐标 -* id \ 多点触摸id +* id \ 多点触摸id,可选,默认为1 模拟手指按下位置(x, y)。 ### RootAutomator.touchMove(x, y[\, id\]) * x \ 横坐标 * y \ 纵坐标 -* id \ 多点触摸id +* id \ 多点触摸id,可选,默认为1 模拟移动手指到位置(x, y)。 -### RootAutomator.touchUp([\id\]) -* id \ 多点触摸id +### RootAutomator.touchUp(\[id\]) +* id \ 多点触摸id,可选,默认为1 模拟手指弹起。 diff --git a/app/src/main/assets/sample/需要Root权限的自动操作/删除全部空间留言.js b/app/src/main/assets/sample/需要Root权限的自动操作/删除全部空间留言.js index fcd82996..4f36bedd 100644 --- a/app/src/main/assets/sample/需要Root权限的自动操作/删除全部空间留言.js +++ b/app/src/main/assets/sample/需要Root权限的自动操作/删除全部空间留言.js @@ -1,27 +1,28 @@ -"auto"; +var ra = new RootAutomator(); +ra.setScreenMetrics(1080, 1920); -setScreenMetrics(1080, 1920); launchApp("QQ"); sleep(1500); //点击动态图标 -Tap(891, 1851); +ra.tap(891, 1851); //点击好友动态 -Tap(192, 453); +ra.tap(192, 453); //点击头像 -Tap(155, 638); +ra.tap(155, 638); //点击留言 -Tap(747, 775); +ra.tap(747, 775); while(true){ if(currentPackage() == 'com.tencent.mobileqq'){ //点击箭头图标 - Tap(1029, 433); + ra.tap(1029, 433); //点击删除 - Tap(530, 820); + ra.tap(530, 820); //点击确定 - Tap(331, 1122); + ra.tap(331, 1122); } sleep(200); } + diff --git a/autojs/src/main/assets/binary/root_automator b/autojs/src/main/assets/binary/root_automator index 2fcfbcc5d8b5f39164c309d99cdf8a70d54c24de..4e296d1497ea848e1f54ef028a6c90b60a4f33cf 100644 GIT binary patch delta 5199 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 diff --git a/autojs/src/main/assets/modules/__RootAutomator__.js b/autojs/src/main/assets/modules/__RootAutomator__.js index 31669b09..3bc1acf8 100644 --- a/autojs/src/main/assets/modules/__RootAutomator__.js +++ b/autojs/src/main/assets/modules/__RootAutomator__.js @@ -2,7 +2,7 @@ module.exports = function(__runtime__, scope){ function RootAutomator(){ this.__ra__ = Object.create(new com.stardust.autojs.runtime.api.RootAutomator(scope.context)); var methods = ["sendEvent", "touch", "setScreenMetrics", "touchX", "touchY", "sendSync", "sendMtSync", "tap", - "swipe","touchDown", "touchUp", "touchMove", "getDefaultId", "setDefaultId", "exit"]; + "swipe", "press", "longPress", "touchDown", "touchUp", "touchMove", "getDefaultId", "setDefaultId", "exit"]; for(var i = 0; i < methods.length; i++){ var method = methods[i]; this[method] = this.__ra__[method].bind(this.__ra__); diff --git a/autojs/src/main/assets/modules/__engines__.js b/autojs/src/main/assets/modules/__engines__.js index cd1d532e..b491308f 100644 --- a/autojs/src/main/assets/modules/__engines__.js +++ b/autojs/src/main/assets/modules/__engines__.js @@ -5,18 +5,19 @@ module.exports = function(__runtime__, scope){ var engines = {}; engines.execScript = function(name, script, config){ - config = fillConfig(config); - return rtEngines.execScript(name, script, config); + return rtEngines.execScript(name, script, fillConfig(config)); } engines.execScriptFile = function(path, config){ - config = fillConfig(config); - return rtEngines.execScriptFile(path, config); + return rtEngines.execScriptFile(path, fillConfig(config)); } engines.execAutoFile = function(path, config){ - config = fillConfig(config); - return rtEngines.execAutoFile(path, config); + return rtEngines.execAutoFile(path, fillConfig(config)); + } + + engines.myEngine = function(){ + return scope.__engine__; } engines.stopAll = rtEngines.stopAll.bind(rtEngines); diff --git a/autojs/src/main/assets/modules/__general__.js b/autojs/src/main/assets/modules/__general__.js index 94768a3f..996b6dca 100644 --- a/autojs/src/main/assets/modules/__general__.js +++ b/autojs/src/main/assets/modules/__general__.js @@ -45,17 +45,17 @@ module.exports = function(__runtime__, scope){ return __runtime__.info.getLatestActivity(); } - scope.waitForActivity = function(activity, delay){ - delay = delay || 200; + scope.waitForActivity = function(activity, period){ + period = period || 200; while(scope.currentActivity() != activity){ - sleep(delay); + sleep(period); } } - scope.waitForPackage = function(packageName, delay){ - delay = delay || 200; + scope.waitForPackage = function(packageName, period){ + period = period || 200; while(scope.currentPackage() != packageName){ - sleep(delay); + sleep(period); } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java b/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java index c9c4eaca..f0ef7e52 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java +++ b/autojs/src/main/java/com/stardust/autojs/core/accessibility/SimpleActionAutomator.java @@ -245,6 +245,7 @@ public class SimpleActionAutomator { mAccessibilityBridge.ensureServiceEnabled(); } + @SuppressWarnings("unchecked") private boolean performAction(SimpleAction simpleAction) { ensureAccessibilityServiceEnabled(); diff --git a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java index 894c01f0..7b1f68a7 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/JavaScriptEngine.java @@ -28,6 +28,9 @@ public abstract class JavaScriptEngine extends ScriptEngine.AbstractScriptEngine } public void setRuntime(ScriptRuntime runtime) { + if (mRuntime != null) { + throw new IllegalStateException("a runtime has been set"); + } mRuntime = runtime; put("__runtime__", runtime); } 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 8b5daaf2..41d78e61 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RootAutomatorEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RootAutomatorEngine.java @@ -7,7 +7,10 @@ import android.util.Log; import com.stardust.autojs.runtime.api.AbstractShell; import com.stardust.autojs.runtime.api.ProcessShell; import com.stardust.autojs.core.inputevent.InputDevices; +import com.stardust.autojs.runtime.api.Shell; +import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.autojs.script.AutoFileSource; +import com.stardust.concurrent.VolatileBox; import com.stardust.pio.PFile; import java.io.File; @@ -34,7 +37,6 @@ public class RootAutomatorEngine extends ScriptEngine.AbstractScriptEngine