add: apk builder plugin support; fix: inrt AutoJs.ensureServiceEnabled
This commit is contained in:
217
autojs/src/main/java/com/stardust/autojs/AutoJs.java
Normal file
217
autojs/src/main/java/com/stardust/autojs/AutoJs.java
Normal file
@@ -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<ScriptEngine>() {
|
||||
@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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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<Thread.UncaughtExceptionHandler> mExceptionHandlerThreadLocal = new ThreadLocal<>();
|
||||
private static ThreadLocal<Thread.UncaughtExceptionHandler> 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 {
|
||||
|
||||
@@ -40,7 +40,6 @@ public class LoopedBasedJavaScriptExecution extends RunnableScriptExecution {
|
||||
return false;
|
||||
}
|
||||
javaScriptEngine.getRuntime().loopers.setLooperQuitHandler(null);
|
||||
getListener().onSuccess(LoopedBasedJavaScriptExecution.this, null);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Thread, Looper> 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();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user