From 6dfd35683ae1f83c016d1f7ec9b23a0c1c0b7bbb Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Wed, 29 Nov 2017 16:07:52 +0800 Subject: [PATCH] add: apk builder plugin support; fix: inrt AutoJs.ensureServiceEnabled --- .idea/modules.xml | 3 +- app/build.gradle | 6 +- .../assets/sample/HTTP网络请求/获取网页.js | 9 + .../stardust/scriptdroid/autojs/AutoJs.java | 207 +++-------------- .../build/ApkBuilderPluginHelper.java | 36 +++ .../scriptdroid/timing/TimedTaskManager.java | 19 +- .../scriptdroid/ui/build/BuildActivity.java | 52 ++++- app/src/main/res/values/strings.xml | 2 + autojs/build.gradle | 2 + .../main/java/com/stardust/autojs/AutoJs.java | 217 ++++++++++++++++++ .../autojs/engine/RhinoJavaScriptEngine.java | 16 +- .../LoopedBasedJavaScriptExecution.java | 1 - .../execution/ScriptExecuteActivity.java | 4 +- .../autojs/runtime/ScriptRuntime.java | 2 +- .../stardust/autojs/runtime/api/Loopers.java | 8 +- .../com/stardust/util/DeveloperUtils.java | 12 +- inrt/src/main/AndroidManifest.xml | 1 + .../com/stardust/auojs/inrt/MainActivity.java | 3 +- .../inrt/rt/AccessibilityServiceTool.java | 3 +- .../com/stardust/auojs/inrt/rt/AutoJs.java | 178 ++------------ 20 files changed, 393 insertions(+), 388 deletions(-) create mode 100644 app/src/main/assets/sample/HTTP网络请求/获取网页.js create mode 100644 app/src/main/java/com/stardust/scriptdroid/build/ApkBuilderPluginHelper.java create mode 100644 autojs/src/main/java/com/stardust/autojs/AutoJs.java diff --git a/.idea/modules.xml b/.idea/modules.xml index f95bb89a..4fac18b4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,7 +2,8 @@ - + + diff --git a/app/build.gradle b/app/build.gradle index b3f150a5..0d4cb25f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -8,8 +8,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 224 - versionName "3.0.0 Alpha2" + versionCode 226 + versionName "3.0.0 Alpha26" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { @@ -83,8 +83,6 @@ dependencies { compile('com.afollestad.material-dialogs:core:0.9.2.3', { exclude group: 'com.android.support' }) - // Gson - compile 'com.google.code.gson:gson:2.8.0' // Common Markdown compile 'com.github.atlassian:commonmark-java:commonmark-parent-0.9.0' // AlipayZeroSdk diff --git a/app/src/main/assets/sample/HTTP网络请求/获取网页.js b/app/src/main/assets/sample/HTTP网络请求/获取网页.js new file mode 100644 index 00000000..f62a4d5c --- /dev/null +++ b/app/src/main/assets/sample/HTTP网络请求/获取网页.js @@ -0,0 +1,9 @@ +var url = "www.baidu.com"; +var res = http.get(url); +if(res.statusCode == 200){ + toast("请求成功"); + console.show(); + log(res.body.string()); +}else{ + toast("请求失败:" + res.statusMessage); +} \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java index 7e153e1e..22bf0ca9 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java @@ -1,6 +1,7 @@ package com.stardust.scriptdroid.autojs; import android.app.Activity; +import android.app.Application; import android.content.Context; import android.os.Build; import android.os.Bundle; @@ -52,7 +53,7 @@ import org.opencv.android.OpenCVLoader; * Created by Stardust on 2017/4/2. */ -public class AutoJs { +public class AutoJs extends com.stardust.autojs.AutoJs { private static AutoJs instance; @@ -64,24 +65,15 @@ public class AutoJs { instance = new AutoJs(context); } - private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder(); - private final AccessibilityNotificationObserver mNotificationObserver; - private ScriptEngineManager mScriptEngineManager; - private final LayoutInspector mLayoutInspector = new LayoutInspector(); - private final Context mContext; - private final UiHandler mUiHandler; - private final AppUtils mAppUtils; - private final AccessibilityInfoProvider mAccessibilityInfoProvider; - private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl(); - private final ScriptEngineService mScriptEngineService; - private final Console mGlobalConsole; - private AutoJs(final Context context) { - mContext = context; - mUiHandler = new UiHandler(context); - mAppUtils = new AppUtils(context); - mGlobalConsole = new GlobalStardustConsole(mUiHandler) { + super(context); + getScriptEngineService().registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener()); + } + + @Override + protected Console createGlobalConsole() { + return new GlobalStardustConsole(getUiHandler()) { @Override public String println(int level, CharSequence charSequence) { String log = super.println(level, charSequence); @@ -89,172 +81,33 @@ public class AutoJs { return log; } }; - mNotificationObserver = new AccessibilityNotificationObserver(context); - mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); - mScriptEngineService = buildScriptEngineService(); - addAccessibilityServiceDelegates(); - mScriptEngineService.registerGlobalScriptExecutionListener(new ScriptExecutionGlobalListener()); - registerActivityLifecycleCallbacks(); - InputEventObserver.initGlobal(context); - OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_13, context, new BaseLoaderCallback(context) { - }); - } - - private ScriptEngineService buildScriptEngineService() { - initScriptEngineManager(); - return new ScriptEngineServiceBuilder() - .uiHandler(mUiHandler) - .globalConsole(mGlobalConsole) - .engineManger(mScriptEngineManager) - .build(); - } - - private void initScriptEngineManager() { - mScriptEngineManager = new ScriptEngineManager(mContext); - mScriptEngineManager.registerEngine(JavaScriptSource.ENGINE, new Supplier() { - @Override - public ScriptEngine get() { - LoopBasedJavaScriptEngine engine = new LoopBasedJavaScriptEngine(mContext); - engine.setRuntime(new ScriptRuntime.Builder() - .setConsole(new StardustConsole(mUiHandler, mGlobalConsole)) - .setScreenCaptureRequester(mScreenCaptureRequester) - .setAccessibilityBridge(new AccessibilityBridgeImpl()) - .setUiHandler(mUiHandler) - .setAppUtils(mAppUtils) - .setEngineService(mScriptEngineService) - .setShellSupplier(new Supplier() { - @Override - public AbstractShell get() { - return new Shell(mContext, true); - } - }).build()); - return engine; - } - }); - mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, new Supplier() { - @Override - public ScriptEngine get() { - return new RootAutomatorEngine(mContext); - } - }); - - } - - private void registerActivityLifecycleCallbacks() { - App.getApp().registerActivityLifecycleCallbacks(new SimpleActivityLifecycleCallbacks() { - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - ScreenMetrics.initIfNeeded(activity); - mAppUtils.setCurrentActivity(activity); - } - - @Override - public void onActivityPaused(Activity activity) { - mAppUtils.setCurrentActivity(null); - } - - @Override - public void onActivityResumed(Activity activity) { - mAppUtils.setCurrentActivity(activity); - } - }); - } - - private void addAccessibilityServiceDelegates() { - AccessibilityService.addDelegate(100, mAccessibilityInfoProvider); - AccessibilityService.addDelegate(200, mNotificationObserver); - AccessibilityService.addDelegate(300, mAccessibilityActionRecorder); - } - - public AccessibilityActionRecorder getAccessibilityActionRecorder() { - return mAccessibilityActionRecorder; - } - - public AppUtils getAppUtils() { - return mAppUtils; - } - - public UiHandler getUiHandler() { - return mUiHandler; - } - - public LayoutInspector getLayoutInspector() { - return mLayoutInspector; - } - - public Console getGlobalConsole() { - return mGlobalConsole; - } - - public ScriptEngineService getScriptEngineService() { - return mScriptEngineService; - } - - public AccessibilityInfoProvider getInfoProvider() { - return mAccessibilityInfoProvider; } public void ensureAccessibilityServiceEnabled() { - if (AccessibilityService.getInstance() == null) { - String errorMessage = null; - if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) { - errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); - } else { - if (Pref.enableAccessibilityServiceByRoot()) { - if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) { - errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout); - } - } else { - errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission); + if (AccessibilityService.getInstance() != null) { + return; + } + String errorMessage = null; + if (AccessibilityServiceTool.isAccessibilityServiceEnabled(App.getApp())) { + errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); + } else { + if (Pref.enableAccessibilityServiceByRoot()) { + if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(2000)) { + errorMessage = App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout); } - } - if (errorMessage != null) { - AccessibilityServiceTool.goToAccessibilitySetting(); - throw new ScriptException(errorMessage); - } - } - } - - - private class AccessibilityBridgeImpl extends AccessibilityBridge { - - @Override - public void ensureServiceEnabled() { - AutoJs.this.ensureAccessibilityServiceEnabled(); - } - - @Nullable - @Override - public AccessibilityService getService() { - return AccessibilityService.getInstance(); - } - - @Override - public AccessibilityInfoProvider getInfoProvider() { - return mAccessibilityInfoProvider; - } - - @Override - public AccessibilityNotificationObserver getNotificationObserver() { - return mNotificationObserver; - } - - } - - private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester { - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - @Override - public void request() { - Activity activity = mAppUtils.getCurrentActivity(); - if (activity instanceof OnActivityResultDelegate.DelegateHost) { - ScreenCaptureRequester requester = new ActivityScreenCaptureRequester( - ((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity); - requester.setOnActivityResultCallback(mCallback); - requester.request(); } else { - ScreenCaptureRequestActivity.request(mContext, mCallback); + errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission); } } + if (errorMessage != null) { + AccessibilityServiceTool.goToAccessibilitySetting(); + throw new ScriptException(errorMessage); + } } + + @Override + protected Application getApplication() { + return App.getApp(); + } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/build/ApkBuilderPluginHelper.java b/app/src/main/java/com/stardust/scriptdroid/build/ApkBuilderPluginHelper.java new file mode 100644 index 00000000..94eeea86 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/build/ApkBuilderPluginHelper.java @@ -0,0 +1,36 @@ +package com.stardust.scriptdroid.build; + +import android.content.Context; +import android.content.pm.PackageManager; +import android.os.Build; + +import com.stardust.pio.UncheckedIOException; +import com.stardust.util.DeveloperUtils; + +import java.io.IOException; +import java.io.InputStream; + +/** + * Created by Stardust on 2017/11/29. + */ + +public class ApkBuilderPluginHelper { + + private static final String PLUGIN_PACKAGE_NAME = "org.autojs.apkbuilderplugin"; + private static final String TEMPLATE_APK_PATH = "template.apk"; + + public static boolean checkPlugin(Context context) { + return DeveloperUtils.checkSignature(context, PLUGIN_PACKAGE_NAME); + } + + public static InputStream openTemplateApk(Context context) { + try { + return context.getPackageManager().getResourcesForApplication(PLUGIN_PACKAGE_NAME) + .getAssets().open(TEMPLATE_APK_PATH); + } catch (IOException e) { + throw new UncheckedIOException(e); + } catch (PackageManager.NameNotFoundException e) { + throw new RuntimeException(e); + } + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java index e7309433..4f00cea2 100644 --- a/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java +++ b/app/src/main/java/com/stardust/scriptdroid/timing/TimedTaskManager.java @@ -26,7 +26,7 @@ import io.reactivex.subjects.PublishSubject; /** * Created by Stardust on 2017/11/27. */ - +//TODO rx public class TimedTaskManager { @@ -75,23 +75,6 @@ public class TimedTaskManager { } } - - private Flowable getTaskById(int id) { - return RXSQLite.rx(SQLite.select() - .from(TimedTask.class) - .where(TimedTask_Table.id.is(id))) - .queryStreamResults() - .subscribeOn(Schedulers.io()); - } - - private Completable removeTask(int id) { - return RXSQLite.rx(SQLite.delete(TimedTaskDatabase.class) - .where(TimedTask_Table.id.is(id))) - .execute() - .subscribeOn(Schedulers.io()); - - } - public void cancelTask(TimedTask timedTask) { TimedTaskScheduler.cancel(mContext, timedTask); mTimedTaskModelAdapter.delete(timedTask); diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java index 60a909cc..ffedab0a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/build/BuildActivity.java @@ -1,17 +1,22 @@ package com.stardust.scriptdroid.ui.build; import android.content.Intent; +import android.support.annotation.NonNull; import android.util.Log; import android.widget.EditText; import android.widget.Toast; +import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.build.AutoJsApkBuilder; +import com.stardust.scriptdroid.build.ApkBuilderPluginHelper; +import com.stardust.scriptdroid.network.download.DownloadManager; import com.stardust.scriptdroid.storage.file.StorageFileProvider; import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.filechooser.FileChooserDialogBuilder; +import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.util.IntentUtil; import org.androidannotations.annotations.AfterViews; @@ -20,6 +25,7 @@ import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; import java.io.File; +import java.io.InputStream; import io.reactivex.Observable; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -61,9 +67,28 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog if (sourcePath != null) { setupWithSourceFile(new ScriptFile(sourcePath)); } + showPluginDownloadDialogIfNeeded(); } + private void showPluginDownloadDialogIfNeeded() { + if (ApkBuilderPluginHelper.checkPlugin(this)) { + return; + } + new ThemeColorMaterialDialogBuilder(this) + .content(R.string.no_apk_builder_plugin) + .positiveText(R.string.ok) + .negativeText(R.string.text_exit) + .onPositive((dialog, which) -> downloadPlugin()) + .onNegative((dialog, which) -> finish()) + .show(); + + } + + private void downloadPlugin() { + // TODO: 2017/11/29 + } + private void setupWithSourceFile(ScriptFile file) { mSourcePath.setText(file.getPath()); mOutputPath.setText(file.getParent()); @@ -102,6 +127,14 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog @Click(R.id.fab) void buildApk() { + if (!ApkBuilderPluginHelper.checkPlugin(this)) { + Toast.makeText(this, R.string.text_apk_builder_plugin_unavailable, Toast.LENGTH_SHORT).show(); + return; + } + doBuildingApk(); + } + + private void doBuildingApk() { String jsPath = mSourcePath.getText().toString(); String versionName = mVersionName.getText().toString(); int versionCode = Integer.parseInt(mVersionCode.getText().toString()); @@ -110,20 +143,21 @@ public class BuildActivity extends BaseActivity implements AutoJsApkBuilder.Prog File outApk = new File(mOutputPath.getText().toString(), String.format("%s_v%s.apk", appName, versionName)); showProgressDialog(); - Observable.fromCallable(() -> - new AutoJsApkBuilder(getAssets().open("template.apk"), outApk, tmpDir.getPath()) - .setProgressCallback(BuildActivity.this) - .prepare() - .withConfig(new AutoJsApkBuilder.AppConfig(appName, versionName, versionCode, jsPath)) - .build() - .sign() - .cleanWorkspace() + Observable.fromCallable(() -> { + InputStream templateApk = ApkBuilderPluginHelper.openTemplateApk(BuildActivity.this); + return new AutoJsApkBuilder(templateApk, outApk, tmpDir.getPath()) + .setProgressCallback(BuildActivity.this) + .prepare() + .withConfig(new AutoJsApkBuilder.AppConfig(appName, versionName, versionCode, jsPath)) + .build() + .sign() + .cleanWorkspace(); + } ) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(apkBuilder -> onBuildSuccessful(outApk), this::onBuildFailed); - } private void showProgressDialog() { diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2570ca2f..3625b343 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -330,4 +330,6 @@ 至少选择一周中的一天 + 没有安装打包插件,是否立即下载? + 打包插件不可用 diff --git a/autojs/build.gradle b/autojs/build.gradle index 90bfd864..a8e26c6a 100644 --- a/autojs/build.gradle +++ b/autojs/build.gradle @@ -52,6 +52,8 @@ dependencies { compile 'com.android.support:appcompat-v7:25.4.0' compile 'com.github.hyb1996:EnhancedFloaty:0.17' compile 'com.github.hyb1996:OpenCvLib:2.4.13.4-imgproc' + // Gson + compile 'com.google.code.gson:gson:2.8.0' // Terminal emulator compile(name: 'libtermexec-release', ext: 'aar') compile(name: 'emulatorview-release', ext: 'aar') diff --git a/autojs/src/main/java/com/stardust/autojs/AutoJs.java b/autojs/src/main/java/com/stardust/autojs/AutoJs.java new file mode 100644 index 00000000..98050421 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/AutoJs.java @@ -0,0 +1,217 @@ +package com.stardust.autojs; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.os.Build; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.annotation.RequiresApi; + +import com.stardust.app.OnActivityResultDelegate; +import com.stardust.app.SimpleActivityLifecycleCallbacks; +import com.stardust.autojs.core.accessibility.AccessibilityBridge; +import com.stardust.autojs.core.console.GlobalStardustConsole; +import com.stardust.autojs.core.console.StardustConsole; +import com.stardust.autojs.core.image.ScreenCaptureRequestActivity; +import com.stardust.autojs.core.image.ScreenCaptureRequester; +import com.stardust.autojs.core.inputevent.InputEventObserver; +import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder; +import com.stardust.autojs.core.util.Shell; +import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; +import com.stardust.autojs.engine.RootAutomatorEngine; +import com.stardust.autojs.engine.ScriptEngine; +import com.stardust.autojs.engine.ScriptEngineManager; +import com.stardust.autojs.runtime.ScriptRuntime; +import com.stardust.autojs.runtime.api.AppUtils; +import com.stardust.autojs.runtime.api.Console; +import com.stardust.autojs.runtime.exception.ScriptException; +import com.stardust.autojs.script.AutoFileSource; +import com.stardust.autojs.script.JavaScriptSource; +import com.stardust.util.ScreenMetrics; +import com.stardust.util.Supplier; +import com.stardust.util.UiHandler; +import com.stardust.view.accessibility.AccessibilityInfoProvider; +import com.stardust.view.accessibility.AccessibilityNotificationObserver; +import com.stardust.view.accessibility.AccessibilityService; +import com.stardust.view.accessibility.LayoutInspector; + +import org.opencv.android.BaseLoaderCallback; +import org.opencv.android.OpenCVLoader; + +/** + * Created by Stardust on 2017/11/29. + */ + +public abstract class AutoJs { + + private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder(); + private final AccessibilityNotificationObserver mNotificationObserver; + private ScriptEngineManager mScriptEngineManager; + private final LayoutInspector mLayoutInspector = new LayoutInspector(); + private final Context mContext; + private final UiHandler mUiHandler; + private final AppUtils mAppUtils; + private final AccessibilityInfoProvider mAccessibilityInfoProvider; + private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl(); + private final ScriptEngineService mScriptEngineService; + private final Console mGlobalConsole; + + + protected AutoJs(final Context context) { + mContext = context; + mUiHandler = new UiHandler(context); + mAppUtils = new AppUtils(context); + mGlobalConsole = createGlobalConsole(); + mNotificationObserver = new AccessibilityNotificationObserver(context); + mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); + mScriptEngineService = buildScriptEngineService(); + init(); + } + + protected Console createGlobalConsole() { + return new GlobalStardustConsole(mUiHandler); + } + + protected void init() { + addAccessibilityServiceDelegates(); + registerActivityLifecycleCallbacks(); + InputEventObserver.initGlobal(mContext); + OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_13, mContext, new BaseLoaderCallback(mContext) { + }); + } + + public abstract void ensureAccessibilityServiceEnabled(); + + protected abstract Application getApplication(); + + protected ScriptEngineService buildScriptEngineService() { + initScriptEngineManager(); + return new ScriptEngineServiceBuilder() + .uiHandler(mUiHandler) + .globalConsole(mGlobalConsole) + .engineManger(mScriptEngineManager) + .build(); + } + + protected void initScriptEngineManager() { + mScriptEngineManager = new ScriptEngineManager(mContext); + mScriptEngineManager.registerEngine(JavaScriptSource.ENGINE, () -> { + LoopBasedJavaScriptEngine engine = new LoopBasedJavaScriptEngine(mContext); + engine.setRuntime(new ScriptRuntime.Builder() + .setConsole(new StardustConsole(mUiHandler, mGlobalConsole)) + .setScreenCaptureRequester(mScreenCaptureRequester) + .setAccessibilityBridge(new AccessibilityBridgeImpl()) + .setUiHandler(mUiHandler) + .setAppUtils(mAppUtils) + .setEngineService(mScriptEngineService) + .setShellSupplier(() -> new Shell(mContext, true)).build()); + return engine; + }); + mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, new Supplier() { + @Override + public ScriptEngine get() { + return new RootAutomatorEngine(mContext); + } + }); + + } + + protected void registerActivityLifecycleCallbacks() { + getApplication().registerActivityLifecycleCallbacks(new SimpleActivityLifecycleCallbacks() { + + @Override + public void onActivityCreated(Activity activity, Bundle savedInstanceState) { + ScreenMetrics.initIfNeeded(activity); + mAppUtils.setCurrentActivity(activity); + } + + @Override + public void onActivityPaused(Activity activity) { + mAppUtils.setCurrentActivity(null); + } + + @Override + public void onActivityResumed(Activity activity) { + mAppUtils.setCurrentActivity(activity); + } + }); + } + + + private void addAccessibilityServiceDelegates() { + AccessibilityService.addDelegate(100, mAccessibilityInfoProvider); + AccessibilityService.addDelegate(200, mNotificationObserver); + AccessibilityService.addDelegate(300, mAccessibilityActionRecorder); + } + + public AccessibilityActionRecorder getAccessibilityActionRecorder() { + return mAccessibilityActionRecorder; + } + + public AppUtils getAppUtils() { + return mAppUtils; + } + + public UiHandler getUiHandler() { + return mUiHandler; + } + + public LayoutInspector getLayoutInspector() { + return mLayoutInspector; + } + + public Console getGlobalConsole() { + return mGlobalConsole; + } + + public ScriptEngineService getScriptEngineService() { + return mScriptEngineService; + } + + public AccessibilityInfoProvider getInfoProvider() { + return mAccessibilityInfoProvider; + } + + + private class AccessibilityBridgeImpl extends AccessibilityBridge { + + @Override + public void ensureServiceEnabled() { + AutoJs.this.ensureAccessibilityServiceEnabled(); + } + + @Nullable + @Override + public AccessibilityService getService() { + return AccessibilityService.getInstance(); + } + + @Override + public AccessibilityInfoProvider getInfoProvider() { + return mAccessibilityInfoProvider; + } + + @Override + public AccessibilityNotificationObserver getNotificationObserver() { + return mNotificationObserver; + } + + } + + private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester { + @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) + @Override + public void request() { + Activity activity = mAppUtils.getCurrentActivity(); + if (activity instanceof OnActivityResultDelegate.DelegateHost) { + ScreenCaptureRequester requester = new ActivityScreenCaptureRequester( + ((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity); + requester.setOnActivityResultCallback(mCallback); + requester.request(); + } else { + ScreenCaptureRequestActivity.request(mContext, mCallback); + } + } + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java index 11a45be2..02ba6632 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -3,7 +3,6 @@ package com.stardust.autojs.engine; import android.util.Log; import com.stardust.autojs.BuildConfig; -import com.stardust.autojs.core.accessibility.UiCollection; import com.stardust.autojs.rhino.AndroidContextFactory; import com.stardust.autojs.rhino.RhinoAndroidHelper; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; @@ -17,21 +16,14 @@ import org.mozilla.javascript.Callable; import org.mozilla.javascript.Context; import org.mozilla.javascript.ContextFactory; import org.mozilla.javascript.ImporterTopLevel; -import org.mozilla.javascript.NativeArray; -import org.mozilla.javascript.ScriptRuntime; import org.mozilla.javascript.Scriptable; import org.mozilla.javascript.ScriptableObject; -import org.mozilla.javascript.TopLevel; -import org.mozilla.javascript.WrapFactory; import org.mozilla.javascript.commonjs.module.RequireBuilder; import org.mozilla.javascript.commonjs.module.provider.SoftCachingModuleScriptProvider; -import org.mozilla.javascript.tools.debugger.Dim; import java.io.File; import java.io.IOException; import java.io.Reader; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.net.URI; import java.util.ArrayList; import java.util.List; @@ -44,7 +36,7 @@ import java.util.Locale; public class RhinoJavaScriptEngine extends JavaScriptEngine { private static final String LOG_TAG = "RhinoJavaScriptEngine"; - private static ThreadLocal mExceptionHandlerThreadLocal = new ThreadLocal<>(); + private static ThreadLocal sExceptionHandlerThreadLocal = new ThreadLocal<>(); private static int contextCount = 0; private static StringScriptSource sInitScript; @@ -165,8 +157,8 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine { return context; } - public static void setUncaghtExceptionHandler(Thread.UncaughtExceptionHandler handler) { - mExceptionHandlerThreadLocal.set(handler); + public static void setUncaughtExceptionHandler(Thread.UncaughtExceptionHandler handler) { + sExceptionHandlerThreadLocal.set(handler); } private class WrapFactory extends org.mozilla.javascript.WrapFactory { @@ -205,7 +197,7 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine { @Override protected Object doTopCall(Callable callable, Context cx, Scriptable scope, Scriptable thisObj, Object[] args) { - Thread.UncaughtExceptionHandler exceptionHandler = mExceptionHandlerThreadLocal.get(); + Thread.UncaughtExceptionHandler exceptionHandler = sExceptionHandlerThreadLocal.get(); if (exceptionHandler == null) return super.doTopCall(callable, cx, scope, thisObj, args); else { diff --git a/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java b/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java index 85b0129b..9cb9cb19 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/LoopedBasedJavaScriptExecution.java @@ -40,7 +40,6 @@ public class LoopedBasedJavaScriptExecution extends RunnableScriptExecution { return false; } javaScriptEngine.getRuntime().loopers.setLooperQuitHandler(null); - getListener().onSuccess(LoopedBasedJavaScriptExecution.this, null); return true; } }); diff --git a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java index a82da30a..a812fda6 100644 --- a/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java +++ b/autojs/src/main/java/com/stardust/autojs/execution/ScriptExecuteActivity.java @@ -9,9 +9,7 @@ import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; import com.stardust.autojs.engine.RhinoJavaScriptEngine; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.engine.ScriptEngineManager; -import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; -import com.stardust.lang.ThreadCompat; import com.stardust.util.IntentExtras; /** @@ -51,7 +49,7 @@ public class ScriptExecuteActivity extends AppCompatActivity implements Thread.U mScriptSource = mScriptExecution.getSource(); mScriptEngine = mScriptExecution.getEngine(); mExecutionListener = mScriptExecution.getListener(); - RhinoJavaScriptEngine.setUncaghtExceptionHandler(this); + RhinoJavaScriptEngine.setUncaughtExceptionHandler(this); runScript(); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index e6385aef..d93cd5bf 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -179,7 +179,7 @@ public class ScriptRuntime { if (loopers != null) throw new IllegalStateException("already initialized"); timers = new Timers(bridges); - loopers = new Loopers(timers); + loopers = new Loopers(this); events = new Events(mUiHandler.getContext(), accessibilityBridge, bridges, loopers); } diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java index 6bff0dcf..473c620e 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Loopers.java @@ -3,6 +3,7 @@ package com.stardust.autojs.runtime.api; import android.os.Looper; import android.os.MessageQueue; +import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.lang.ThreadCompat; @@ -22,10 +23,12 @@ public class Loopers { private volatile Looper mServantLooper; private static volatile ConcurrentHashMap sLoopers = new ConcurrentHashMap<>(); private Timers mTimers; + private ScriptRuntime mScriptRuntime; private LooperQuitHandler mLooperQuitHandler; - public Loopers(Timers timers) { - mTimers = timers; + public Loopers(ScriptRuntime runtime) { + mTimers = runtime.timers; + mScriptRuntime = runtime; if (Looper.myLooper() == Looper.getMainLooper()) { waitWhenIdle = true; } @@ -35,6 +38,7 @@ public class Loopers { Looper l = Looper.myLooper(); if (l != null && shouldQuitLooper()) { if (mLooperQuitHandler != null && mLooperQuitHandler.shouldQuit()) { + mScriptRuntime.events.emit("exit"); l.quit(); } } diff --git a/common/src/main/java/com/stardust/util/DeveloperUtils.java b/common/src/main/java/com/stardust/util/DeveloperUtils.java index aaa6345a..7c36b5c7 100644 --- a/common/src/main/java/com/stardust/util/DeveloperUtils.java +++ b/common/src/main/java/com/stardust/util/DeveloperUtils.java @@ -27,9 +27,10 @@ public class DeveloperUtils { return PACKAGE_NAME.equals(runningPackage); } - public static String getSignature(Context context) { + @Nullable + public static String getSignature(Context context, String packageName) { try { - PackageInfo packageInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES); + PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); Signature[] signatures = packageInfo.signatures; StringBuilder builder = new StringBuilder(); for (Signature signature : signatures) { @@ -47,7 +48,12 @@ public class DeveloperUtils { * 为了开源社区的发展,请善用源码:-) */ public static boolean checkSignature(Context context) { - return SIGNATURE.equals(getSignature(context)); + return SIGNATURE.equals(getSignature(context, context.getPackageName())); } + public static boolean checkSignature(Context context, String packageName) { + return SIGNATURE.equals(getSignature(context, packageName)); + } + + } diff --git a/inrt/src/main/AndroidManifest.xml b/inrt/src/main/AndroidManifest.xml index 3f5e329d..80cf6dbc 100644 --- a/inrt/src/main/AndroidManifest.xml +++ b/inrt/src/main/AndroidManifest.xml @@ -6,6 +6,7 @@ + sAccessibilityServiceClass = AccessibilityService.class; public static AutoJs getInstance() { return instance; @@ -58,166 +61,31 @@ public class AutoJs { instance = new AutoJs(context); } - private final AccessibilityActionRecorder mAccessibilityActionRecorder = new AccessibilityActionRecorder(); - private final AccessibilityNotificationObserver mNotificationObserver; - private ScriptEngineManager mScriptEngineManager; - private final Context mContext; - private final UiHandler mUiHandler; - private final AppUtils mAppUtils; - private final AccessibilityInfoProvider mAccessibilityInfoProvider; - private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl(); - private final ScriptEngineService mScriptEngineService; - private final StardustConsole mGlobalConsole; - - - private AutoJs(final Context context) { - mContext = context; - mUiHandler = new UiHandler(context); - mAppUtils = new AppUtils(context); - mGlobalConsole = new GlobalStardustConsole(mUiHandler); - mNotificationObserver = new AccessibilityNotificationObserver(context); - mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); - mScriptEngineService = buildScriptEngineService(); - addAccessibilityServiceDelegates(); - registerActivityLifecycleCallbacks(); - InputEventObserver.initGlobal(context); - } - - public StardustConsole getGlobalConsole() { - return mGlobalConsole; - } - - private ScriptEngineService buildScriptEngineService() { - initScriptEngineManager(); - return new ScriptEngineServiceBuilder() - .uiHandler(mUiHandler) - .globalConsole(mGlobalConsole) - .engineManger(mScriptEngineManager) - .build(); - } - - private void initScriptEngineManager() { - mScriptEngineManager = new ScriptEngineManager(mContext); - mScriptEngineManager.registerEngine(JavaScriptSource.ENGINE, new Supplier() { - @Override - public ScriptEngine get() { - LoopBasedJavaScriptEngine engine = new LoopBasedJavaScriptEngine(mContext); - engine.setRuntime(new ScriptRuntime.Builder() - .setConsole(new StardustConsole(mUiHandler, mGlobalConsole)) - .setScreenCaptureRequester(mScreenCaptureRequester) - .setAccessibilityBridge(new AccessibilityBridgeImpl()) - .setUiHandler(mUiHandler) - .setAppUtils(mAppUtils) - .setEngineService(mScriptEngineService) - .setShellSupplier(new Supplier() { - @Override - public AbstractShell get() { - return new Shell(mContext, true); - } - }).build()); - return engine; - } - }); - mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, new Supplier() { - @Override - public ScriptEngine get() { - return new RootAutomatorEngine(mContext); - } - }); - - } - - private void registerActivityLifecycleCallbacks() { - App.getApp().registerActivityLifecycleCallbacks(new SimpleActivityLifecycleCallbacks() { - - @Override - public void onActivityCreated(Activity activity, Bundle savedInstanceState) { - ScreenMetrics.initIfNeeded(activity); - mAppUtils.setCurrentActivity(activity); - } - - @Override - public void onActivityPaused(Activity activity) { - mAppUtils.setCurrentActivity(null); - } - - @Override - public void onActivityResumed(Activity activity) { - mAppUtils.setCurrentActivity(activity); - } - }); - } - - private void addAccessibilityServiceDelegates() { - AccessibilityService.addDelegate(100, mAccessibilityInfoProvider); - AccessibilityService.addDelegate(200, mNotificationObserver); - AccessibilityService.addDelegate(300, mAccessibilityActionRecorder); - } - - public ScriptEngineService getScriptEngineService() { - return mScriptEngineService; + private AutoJs(Context context) { + super(context); } + @Override public void ensureAccessibilityServiceEnabled() { - if (AccessibilityService.getInstance() == null) { - String errorMessage = getErrorMessage(); + if (AccessibilityService.getInstance() != null) { + return; + } + String errorMessage = null; + if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(getApplication(), AccessibilityService.class)) { + errorMessage = App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); + } else { + if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(getApplication(), 2000)) { + errorMessage = App.getApp().getString(R.string.text_no_accessibility_permission); + } + } + if (errorMessage != null) { AccessibilityServiceTool.goToAccessibilitySetting(); throw new ScriptException(errorMessage); } } - private String getErrorMessage() { - if (AccessibilityServiceUtils.isAccessibilityServiceEnabled(App.getApp(), sAccessibilityServiceClass)) { - return App.getApp().getString(R.string.text_auto_operate_service_enabled_but_not_running); - } else { - if (true) { - if (!AccessibilityServiceTool.enableAccessibilityServiceByRootAndWaitFor(App.getApp(), 2000)) { - return App.getApp().getString(R.string.text_enable_accessibility_service_by_root_timeout); - } - } - } - return App.getApp().getString(R.string.text_no_accessibility_permission); - } - - - private class AccessibilityBridgeImpl extends AccessibilityBridge { - - @Override - public void ensureServiceEnabled() { - AutoJs.this.ensureAccessibilityServiceEnabled(); - } - - @Nullable - @Override - public AccessibilityService getService() { - return AccessibilityService.getInstance(); - } - - @Override - public AccessibilityInfoProvider getInfoProvider() { - return mAccessibilityInfoProvider; - } - - @Override - public AccessibilityNotificationObserver getNotificationObserver() { - return mNotificationObserver; - } - - } - - private class ScreenCaptureRequesterImpl extends ScreenCaptureRequester.AbstractScreenCaptureRequester { - @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) - @Override - public void request() { - Activity activity = mAppUtils.getCurrentActivity(); - if (activity instanceof OnActivityResultDelegate.DelegateHost) { - ScreenCaptureRequester requester = new ActivityScreenCaptureRequester( - ((OnActivityResultDelegate.DelegateHost) activity).getOnActivityResultDelegateMediator(), activity); - requester.setOnActivityResultCallback(mCallback); - requester.request(); - } else { - ScreenCaptureRequestActivity.request(mContext, mCallback); - } - } + @Override + protected Application getApplication() { + return App.getApp(); } }