diff --git a/.idea/statistic.xml b/.idea/statistic.xml
new file mode 100644
index 00000000..67cee7cb
--- /dev/null
+++ b/.idea/statistic.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Readme.md b/Readme.md
index 9002bc85..5536a13f 100644
--- a/Readme.md
+++ b/Readme.md
@@ -1,6 +1,16 @@
# 免Root脚本机器人
-#简介
-一个**不需要**root权限的类似脚本精灵、按键精灵的自动操作的软件。可以实现自动点击、滑动、输入文字、打开应用等,例如QQ自动抢红包。当然了你也可以把它当做js的IDE来写JavaScript(作为IDE而言目前还比较弱,没有自动补全和包列表等)。另外由于不使用root权限,要点击屏幕上的精确位置是不能实现的,像游戏刷副本自动签到什么的基本上不能做到,这些还是用root权限的脚本精灵吧~~
+## 简介
+一个**不需要Root权限**的类似按键精灵的自动操作软件,可以实现自动点击、滑动、输入文字、打开应用等。
+> 注意:这里的不需要Root权限指的是一般软件,**游戏的自动点击等是需要Root权限的**。
+
+特性:
+* 简单易用的自动操作函数
+* 悬浮窗录制和运行
+* 丰富的文档、教程与示例
+* 更专业&强大的选择器API,提供对屏幕上的控件的寻找、遍历、获取信息、操作等。类似于Google的UI测试框架UiAutomator,您也可以把他当做移动版UI测试框架使用
+* 采用JavaScript为脚本语言,支持简单的代码补全。您也可以把他当作简便的JavaScript IDE使用
+* 带有界面分析工具,类似Android Studio的LayoutInspector,可以分析界面层次和范围、获取界面上的控件信息
+* 支持使用Root权限以提供更强大的屏幕点击、滑动、录制功能和运行shell命令

@@ -10,68 +20,9 @@

-#基本语法与API
-目前支持的自动操作函数还比较少,未来会逐渐增加。
-###一、语法
-本软件使用JavaScript语言([ECMAscript E5/E5.1](http://www.ecma-international.org/ecma-262/5.1/)),基于[Duktape](http://www.duktape.org/)引擎拓展一些自动操作(点击、长按、滑动等)函数。因而语法参见JavaScript(例如[w3cschool教程](http://www.w3school.com.cn/js/))。
+
-###二、自动操作函数
-**自动操作的函数都需要开启"自动操作服务"才能执行,否则执行到相应函数时脚本会停止运行。**
-* `click(text)` 点击文本text所在的区域,并返回是否点击成功。当前界面没有出现该文本或者该文本所在区域不可点击时返回false。例如`click("发现")`,是点击"发现"。如果要点击"发现"直至点击成功可以用`while(!click("发现"))`。
-
-> 文本所在区域指的是,从文本处向其父视图寻找,直至发现一个可点击的部件为止。
-
-* `click(left, top, bottom, right)`
-
-> 有些按钮或者部件是图标而不是文字(例如发送朋友圈的照相机图标以及QQ下方的消息、联系人、动态图标),这时不能通过`click(text)`来点击,只能通过描述图标所在的区域来点击。left, bottom, top, right描述的就是点击的区域。至于要定位点击的区域,可以在侧拉菜单开启"点击区域辅助"(或者安卓7.0以上在通知栏点击"修改"添加点击区域辅助快捷设定图标),之后每次点击或长按都会提示这次点击或长按的区域并自动保存,可以在编辑器的右侧拉菜单中插入。
-
- 点击与长方形范围严格匹配的区域,并返回是否点击成功。其中left为长方形左边与屏幕左边的像素距离,top为上边与屏幕上边的像素距离,right为右边与**屏幕左边**的像素距离, bottom为下边与**屏幕上边**的距离。区域严格匹配。
-
-> 以下的longClick、select、scrollUp、scrollDown的参数均与click类似,不再赘述。
-
-* `longClick` 长按
-* `select` 选择
-* `scrollUp` 上滑。不加参数时会寻找"最大"的可滑动的控件上滑,例如微信消息列表等。
-* `scrollDown` 下滑。不加参数时与scrollUp类似。
-* `input(text)` 把所有输入框的文本都置为text。例如input("测试")。
-* `input(i, text)` 把第i个输入框的文本设为text。i从0开始。
-
-###三、其他函数
-* `sleep(n)` 暂停执行n**毫秒**时间。
-* `toast(text)` 显示提示文本。
-* `launch(packageName)` 运行包名为packageName的应用。例如launch("com.tencent.mm")是运行微信,应用包名可以通过一些工具获取;获取通过函数launchApp代替
-* `launch(packageName, className)` 运行包名为packageName,类名(Activity)为className的应用。
-* `launchApp(appName)` 运存应用名称为appName的应用。例如launchApp("QQ")。不同应用名称可能相同,这时只运行其中某一个应用。
-* `notStopped` 若当前脚本处于运行状态时返回`true`, 否则返回`false`。对于某些循环, 例如`while(true)`,请用`while(notStopped())`代替,以免死循环造成的脚本无法正常停止。
-* `isStoppd` 若当前脚本处于停止状态时返回`true`, 否则返回`false`。
-
-###四、全局变量
-* `context` ApplicationContext,参见安卓[android.content.Context](https://developer.android.com/reference/android/content/Context.html)
-
-> 这里的context由于是ApplicationContext,是不可见的,不能用于dialog和其他UI相关。如果要显示弹窗或者视图,请启动UI模式(代码的第一行为`"ui";`既可)并使用activity代替。
-
-* `activity` UI模式下会启动一个Activity来运行脚本,并在UI线程下运行。可通过该变量来获取该activity。
-
-###五、在脚本中调用Java
-使用importClass来引入要使用的库,例如:
-```javascript
-importClass("android.view.View.OnClickListener")
-view.setOnClickListener(new OnClickListener(function(){
- Toast.makeText(activity, "Button1 Clicked", Toast.LENGTH_SHORT).show();
- var intent = new Intent(activity, "com.furture.react.activity.DetailActivity");
- activity.startActivity(intent);
-}));
-
-view2.setOnClickListener(new OnClickListener({
- onClick: function(){
- Toast.makeText(activity, "Button2 Clicked", Toast.LENGTH_SHORT).show();
- }
-}));
-```
-
-详细文档参见[DuktapeJava Java Docs](http://gubaojian.github.io/DuktapeJava/javadoc/)。
-
-#License
+## License
[CC-BY-NC-SA](https://github.com/hyb1996/NoRootScriptDroid/blob/master/LICENSE.md)
* 署名 — You must give appropriate credit, provide a link to the license, and indicate if changes were made. You may do so in any reasonable manner, but not in any way that suggests the licensor endorses you or your use.
* **非商业性使用** — 您不得将本作品用于商业与盈利目的。
diff --git a/app-release-2.0.0 Beta.apk b/app-release-2.0.0 Beta.apk
new file mode 100644
index 00000000..07132001
Binary files /dev/null and b/app-release-2.0.0 Beta.apk differ
diff --git a/app-release-2.0.0内测.apk b/app-release-2.0.0内测.apk
new file mode 100644
index 00000000..7881edff
Binary files /dev/null and b/app-release-2.0.0内测.apk differ
diff --git a/app-release-2.0.1 Beta.apk b/app-release-2.0.1 Beta.apk
new file mode 100644
index 00000000..b485f679
Binary files /dev/null and b/app-release-2.0.1 Beta.apk differ
diff --git a/app/build.gradle b/app/build.gradle
index 7cefafed..8f3322ba 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -1,4 +1,5 @@
apply plugin: 'com.android.application'
+def AAVersion = '4.2.0'
android {
compileSdkVersion 25
@@ -7,8 +8,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 19
targetSdkVersion 23
- versionCode 41
- versionName "1.17.0314内测"
+ versionCode 103
+ versionName "2.0.1 Beta"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
@@ -51,6 +52,8 @@ dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
+ annotationProcessor "org.androidannotations:androidannotations:$AAVersion"
+ compile "org.androidannotations:androidannotations-api:$AAVersion"
compile 'com.android.support:appcompat-v7:25.1.0'
compile 'com.android.support:design:25.1.0'
compile 'com.github.hyb1996:MutableTheme:0.2.2'
@@ -67,7 +70,6 @@ dependencies {
compile 'io.mattcarroll.hover:hover:0.9.7'
compile 'org.greenrobot:eventbus:3.0.0'
compile 'com.bignerdranch.android:expandablerecyclerview:3.0.0-RC1'
-
compile(name: 'libtermexec-release', ext: 'aar')
compile(name: 'emulatorview-release', ext: 'aar')
compile(name: 'term-debug', ext: 'aar')
@@ -80,8 +82,4 @@ dependencies {
compile(name: '920-file_explorer-release', ext: 'aar')
compile(name: '920-app-debug', ext: 'aar')
compile project(':automator')
-}
-
-configurations {
- all*.exclude group: 'org.mozilla', module: 'rhino'
}
\ No newline at end of file
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index c7c5b804..f7586b98 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -78,8 +78,7 @@
android:theme="@style/IssueReportTheme"/>
-
-
+
diff --git a/app/src/main/assets/help/catalogue.json b/app/src/main/assets/help/catalogue.json
index bbe379db..55a9d639 100644
--- a/app/src/main/assets/help/catalogue.json
+++ b/app/src/main/assets/help/catalogue.json
@@ -53,6 +53,11 @@
"title": "需要Root权限的自动操作函数",
"type": "markdown",
"path":"documentation"
+ },
+ {
+ "title": "调用Java API",
+ "type": "markdown",
+ "path":"documentation"
}
],
"EMCAScript教程": [
diff --git a/app/src/main/assets/help/documentation/shell命令.md b/app/src/main/assets/help/documentation/shell命令.md
index 1e4de15b..49bcc133 100644
--- a/app/src/main/assets/help/documentation/shell命令.md
+++ b/app/src/main/assets/help/documentation/shell命令.md
@@ -27,6 +27,7 @@ if(result.code == 1){
* [应用包名](#应用包名)
* [pm命令](#pm命令)
* [其他命令](#其他命令)
+* [Shell类](#Shell类)
## am命令
@@ -356,4 +357,41 @@ ls filepath
例如:
```
log(shell("ls /system/bin"));
-```
\ No newline at end of file
+```
+
+## Shell类
+
+当需要连续执行很多命令时,每条命令都需要申请Root权限,执行时间会大大增加。这时可以使用Shell类。
+### new Shell(root = false)
+* root \ 是否以root权限执行。默认为false。
+
+Shell类的构造函数。
+
+### Shell.execute(cmd)
+* cmd \ 要执行的命令
+
+执行命令cmd,例如:
+```
+var sh = Shell(true);
+sh.execute("rm /sdcard/1.txt"); //删除SD卡上的1.txt文件
+```
+
+### Shell.exitAndWaitFor()
+退出Shell,并等待所有命令执行完成。
+一个完整的例子如下:
+```
+var sh = Shell(true);
+sh.execute("rm /sdcard/1.txt");
+sh.execute("input keyevent 26");
+sh.exitAndWaitFor();
+```
+
+### Shell.waitFor()
+等待当前所有命令执行完成。返回一个整数作为返回码,1为执行成功,其他数字为错误。
+
+### Shell.exit()
+退出Shell。调用该函数后再执行的命令无效。
+
+
+
+除以上命令之外, Shell也包含自动操作的命令,例如Shell.Tap,参见《需要Root权限的自动操作函数》。
\ No newline at end of file
diff --git a/app/src/main/assets/help/documentation/一般常用函数.md b/app/src/main/assets/help/documentation/一般常用函数.md
index c8502969..05827e69 100644
--- a/app/src/main/assets/help/documentation/一般常用函数.md
+++ b/app/src/main/assets/help/documentation/一般常用函数.md
@@ -20,10 +20,10 @@ launchPackage("com.tencent.mm");
launchApp("微信");
```
-### getPackageName()
+### currentPackage()
返回最近一次监测到的正在运行的应用的包名,一般可以认为就是当前正在运行的应用的包名。
-### getActivityName()
+### currentActivity()
返回最近一次监测到的正在运行的Activity的名称,一般可以认为就是当前正在运行的Activity的名称。
### setClip(text)
diff --git a/app/src/main/assets/help/documentation/常见问题.md b/app/src/main/assets/help/documentation/常见问题.md
index fcb6d8cf..1612c1bb 100644
--- a/app/src/main/assets/help/documentation/常见问题.md
+++ b/app/src/main/assets/help/documentation/常见问题.md
@@ -1,16 +1,21 @@
目录
* [没有root权限是否支持游戏](#没有root权限是否支持游戏)
* [如何重复做某些操作n次](#如何重复做某些操作n次)
+* [如何循环做某些操作](#如何循环做某些操作)
* [某些有文字的按键点击无效怎么办](#某些有文字的按键点击无效怎么办)
* [如何点击图标按钮](#如何点击图标按钮)
+* [如何支持Tasker调用](#如何支持Tasker调用)
### 没有root权限是否支持游戏
+
+**游戏需要root权限!!!**
+**游戏需要root权限!!!**
+**游戏需要root权限!!!**
100%的游戏在没有root权限的情况下都不支持。
-**游戏需要root权限!!!**
-**游戏需要root权限!!!**
-**游戏需要root权限!!!**
+不管是录制脚本还是运行脚本,在没有root权限的情况下都无法做到,在游戏界面不使用root权限录制脚本录制出来的是空白的。
### 如何重复做某些操作n次
+
使用循环语句实现实现。例如每个1秒执行一个操作,总共执行20次的代码如下:
```
for(var i = 1; i <= 20; i++){
@@ -19,10 +24,27 @@ for(var i = 1; i <= 20; i++){
}
```
+### 如何循环做某些操作
+
+使用while(true)语句实现。例如QQ无限发送消息的脚本如下:
+```
+while(true){
+ input("测试");
+ click("发送");
+}
+```
+
### 某些有文字的按键点击无效怎么办
+
例如QQ下方的"联系人"按钮,用click("联系人")是无效的。这是因为这些按钮上的文字并不是真正的文字,而是一个图标。参见[如何点击图标按钮](#如何点击图标按钮)。
### 如何点击图标按钮
+
有以下几种方法:
* 录制脚本
* 通过图标在屏幕上的位置来点击。要获取图标在屏幕上的位置,可以开启悬浮窗,选择布局范围查看,之后点击要点击的图标,在弹出的窗口中的"bounds"一栏即图标在屏幕上的区域。例如:
+* 通过id, desc等选择器来定位图片
+
+### 如何支持Tasker调用
+
+新建任务时选择文件,点击浏览找到要运行的脚本文件,在MimeType处填入application/x-javascript。
\ No newline at end of file
diff --git a/app/src/main/assets/help/documentation/控制台与输出.md b/app/src/main/assets/help/documentation/控制台与输出.md
index 70597e8c..b437681c 100644
--- a/app/src/main/assets/help/documentation/控制台与输出.md
+++ b/app/src/main/assets/help/documentation/控制台与输出.md
@@ -8,6 +8,9 @@
### log(text)
* text \ | \