From 4c482428dd50dbac6598c20982cba9c75898e0aa Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 13 Oct 2018 00:17:39 +0800 Subject: [PATCH] fix: piped writer causes anr --- .../main/java/com/stardust/autojs/Config.java | 41 +++++++++++ .../main/java/com/stardust/autojs/Pref.java | 32 -------- .../stardust/autojs/ScriptEngineService.java | 39 +--------- .../autojs/core/console/StardustConsole.java | 29 ++++++-- .../autojs/core/looper/TimerThread.java | 2 +- .../stardust/autojs/core/ui/ViewExtras.java | 73 +++++++++++++++++++ .../core/ui/attribute/ViewAttributes.java | 3 +- .../inflater/inflaters/BaseViewInflater.java | 18 ++++- .../core/ui/inflater/util/Dimensions.java | 8 +- .../core/ui/inflater/util/ValueMapper.java | 13 +++- .../autojs/core/ui/nativeview/NativeView.java | 28 ++----- .../autojs/core/ui/widget/JsListView.java | 3 +- .../autojs/engine/RhinoJavaScriptEngine.java | 3 +- .../autojs/runtime/ScriptRuntime.java | 41 ++++++++++- autojs/src/main/res/values/ids.xml | 2 +- autojs/src/main/res/values/pref_keys.xml | 4 + .../stardust/auojs/inrt/SplashActivity.java | 2 +- .../inrt/launch/AssetsProjectLauncher.java | 2 +- 18 files changed, 232 insertions(+), 111 deletions(-) create mode 100644 autojs/src/main/java/com/stardust/autojs/Config.java delete mode 100644 autojs/src/main/java/com/stardust/autojs/Pref.java create mode 100644 autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java create mode 100644 autojs/src/main/res/values/pref_keys.xml diff --git a/autojs/src/main/java/com/stardust/autojs/Config.java b/autojs/src/main/java/com/stardust/autojs/Config.java new file mode 100644 index 00000000..d55a78fc --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/Config.java @@ -0,0 +1,41 @@ +package com.stardust.autojs; + +import android.content.Context; +import android.content.SharedPreferences; +import android.preference.PreferenceManager; + +/** + * Created by Stardust on 2017/12/8. + */ + +public class Config { + + private static Config sInstance; + private SharedPreferences mSharedPreferences; + private final Context mContext; + + public Config(Context context) { + mContext = context; + mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); + } + + public static void setInstance(Config instance) { + if (sInstance != null) + throw new IllegalStateException(); + sInstance = instance; + } + + public static Config getInstance() { + return sInstance; + } + + public boolean isPrintJavaStackTraceEnabled() { + return mSharedPreferences.getBoolean(getString(R.string.key_print_java_stack_trace), false); + } + + private String getString(int resId) { + return mContext.getString(resId); + } + + +} diff --git a/autojs/src/main/java/com/stardust/autojs/Pref.java b/autojs/src/main/java/com/stardust/autojs/Pref.java deleted file mode 100644 index 86905ddc..00000000 --- a/autojs/src/main/java/com/stardust/autojs/Pref.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.stardust.autojs; - -import android.content.Context; -import android.content.SharedPreferences; -import android.preference.PreferenceManager; - -/** - * Created by Stardust on 2017/12/8. - */ - -public class Pref { - - - private static Pref sInstance; - private SharedPreferences mSharedPreferences; - - public Pref(Context context) { - mSharedPreferences = PreferenceManager.getDefaultSharedPreferences(context); - } - - public static void setInstance(Pref instance) { - if (sInstance != null) - throw new IllegalStateException(); - sInstance = instance; - } - - public static Pref getInstance() { - return sInstance; - } - - -} diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index 129b85da..5ece07b1 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -1,7 +1,6 @@ package com.stardust.autojs; import android.content.Context; -import android.os.Parcelable; import android.support.annotation.Nullable; import com.stardust.autojs.engine.JavaScriptEngine; @@ -21,22 +20,19 @@ import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; import com.stardust.lang.ThreadCompat; -import com.stardust.util.TextUtils; import com.stardust.util.UiHandler; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.mozilla.javascript.RhinoException; import org.mozilla.javascript.ScriptStackElement; -import org.mozilla.javascript.WrappedException; import java.io.BufferedReader; import java.io.IOException; -import java.io.PipedReader; -import java.io.PipedWriter; import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; import java.util.Collection; -import java.util.Collections; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Set; @@ -77,7 +73,7 @@ public class ScriptEngineService { if (!causedByInterrupted(e)) { if (execution.getEngine() instanceof JavaScriptEngine) { ((JavaScriptEngine) execution.getEngine()).getRuntime() - .console.error(getScriptTrace(e)); + .console.error(e); } EVENT_BUS.post(new ScriptExecutionEvent(ScriptExecutionEvent.ON_EXCEPTION, e.getMessage())); } @@ -282,33 +278,4 @@ public class ScriptEngineService { } } - public static String getScriptTrace(Exception e) { - StringBuilder scriptTrace = new StringBuilder(); - if (e instanceof RhinoException) { - RhinoException rhinoException = (RhinoException) e; - scriptTrace.append(rhinoException.details()).append("\n"); - for (ScriptStackElement element : rhinoException.getScriptStack()) { - element.renderV8Style(scriptTrace); - scriptTrace.append("\n"); - } - scriptTrace.append("- - - - - - - - - - -\n"); - } - try { - PipedReader reader = new PipedReader(8192); - PrintWriter writer = new PrintWriter(new PipedWriter(reader)); - e.printStackTrace(writer); - writer.close(); - BufferedReader bufferedReader = new BufferedReader(reader); - String line; - //scriptTrace.append(TextUtils.toEmptyIfNull(e.getMessage())); - while ((line = bufferedReader.readLine()) != null) { - scriptTrace.append("\n").append(line); - } - return scriptTrace.toString(); - } catch (IOException e1) { - e1.printStackTrace(); - return e.getMessage(); - } - } - } diff --git a/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java b/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java index 69be948b..c1f4d304 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java +++ b/autojs/src/main/java/com/stardust/autojs/core/console/StardustConsole.java @@ -3,11 +3,13 @@ package com.stardust.autojs.core.console; import android.content.Context; import android.content.Intent; import android.support.annotation.NonNull; +import android.support.annotation.Nullable; import android.util.Log; import android.view.WindowManager; import com.stardust.autojs.R; import com.stardust.autojs.annotation.ScriptInterface; +import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.api.AbstractConsole; import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; @@ -118,11 +120,12 @@ public class StardustConsole extends AbstractConsole { return mLogs; } - public void printStackTrace(Throwable t) { - StringWriter out = new StringWriter(); - PrintWriter printWriter = new PrintWriter(out); - t.printStackTrace(printWriter); - println(android.util.Log.ERROR, t.toString()); + public void printAllStackTrace(Throwable t) { + println(android.util.Log.ERROR, ScriptRuntime.getStackTrace(t, true)); + } + + public String getStackTrace(Throwable t) { + return ScriptRuntime.getStackTrace(t, false); } @Override @@ -271,4 +274,20 @@ public class StardustConsole extends AbstractConsole { public void setTitle(CharSequence title) { mConsoleFloaty.setTitle(title); } + + @Override + public void error(@Nullable Object data, Object... options) { + if (data instanceof Throwable) { + data = getStackTrace((Throwable) data); + } + if (options != null && options.length > 0) { + for (int i = 0; i < options.length; i++) { + Object option = options[i]; + if (option instanceof Throwable) { + options[i] = getStackTrace((Throwable) option); + } + } + } + super.error(data, options); + } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java b/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java index 7dd75007..70a685f6 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java +++ b/autojs/src/main/java/com/stardust/autojs/core/looper/TimerThread.java @@ -49,7 +49,7 @@ public class TimerThread extends ThreadCompat { Looper.loop(); } catch (Exception e) { if (!ScriptInterruptedException.causedByInterrupted(e)) { - mRuntime.console.error(Thread.currentThread().toString() + ": " + ScriptEngineService.getScriptTrace(e)); + mRuntime.console.error(Thread.currentThread().toString() + ": ", e); } } finally { onExit(); diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java b/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java new file mode 100644 index 00000000..695cb4c1 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/ViewExtras.java @@ -0,0 +1,73 @@ +package com.stardust.autojs.core.ui; + +import android.view.View; + +import com.stardust.autojs.R; +import com.stardust.autojs.core.ui.attribute.ViewAttributes; +import com.stardust.autojs.core.ui.inflater.ResourceParser; +import com.stardust.autojs.core.ui.nativeview.NativeView; +import com.stardust.autojs.runtime.ScriptRuntime; + +import org.mozilla.javascript.Scriptable; + +public class ViewExtras { + + private NativeView mNativeView; + + private ViewAttributes mViewAttributes; + + public static ViewExtras get(View view) { + ViewExtras extras; + Object tag = view.getTag(R.id.view_tag_view_extras); + if (tag instanceof ViewExtras) { + extras = (ViewExtras) tag; + } else { + extras = new ViewExtras(); + view.setTag(R.id.view_tag_view_extras, extras); + } + return extras; + } + + + public static ViewAttributes getViewAttributes(View view, ResourceParser parser) { + ViewExtras extras = get(view); + ViewAttributes attributes = extras.getViewAttributes(); + if (attributes == null) { + attributes = new ViewAttributes(parser, view); + extras.setViewAttributes(attributes); + } + return attributes; + } + + + public static NativeView getNativeView(Scriptable scope, View view, Class staticType, ScriptRuntime runtime) { + ViewExtras extras = get(view); + NativeView nativeView = extras.getNativeView(); + if (nativeView == null) { + nativeView = new NativeView(scope, view, staticType, runtime); + extras.setNativeView(nativeView); + } + return nativeView; + } + + public static NativeView getNativeView(View view) { + ViewExtras extras = get(view); + return extras.getNativeView(); + } + + public final NativeView getNativeView() { + return mNativeView; + } + + public final ViewAttributes getViewAttributes() { + return mViewAttributes; + } + + public final void setNativeView(NativeView nativeView) { + mNativeView = nativeView; + } + + public final void setViewAttributes(ViewAttributes viewAttributes) { + mViewAttributes = viewAttributes; + } +} diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java index 741718ea..3953d323 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/attribute/ViewAttributes.java @@ -112,6 +112,7 @@ public class ViewAttributes { init(); } + public boolean contains(String name) { return mAttributes.containsKey(name); } @@ -264,7 +265,7 @@ public class ViewAttributes { case "match_parent": return ViewGroup.LayoutParams.MATCH_PARENT; default: - return Dimensions.parseToPixel(dim, mView.getResources().getDisplayMetrics(), (ViewGroup) mView.getParent(), true); + return Dimensions.parseToPixel(dim, mView, (ViewGroup) mView.getParent(), true); } } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java index 69d04b1f..92c29087 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/inflaters/BaseViewInflater.java @@ -5,6 +5,7 @@ import android.graphics.PorterDuff; import android.os.Build; import android.support.annotation.Nullable; import android.support.v4.widget.DrawerLayout; +import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.CompoundButton; @@ -13,6 +14,8 @@ import android.widget.LinearLayout; import android.widget.RelativeLayout; +import com.stardust.autojs.core.ui.ViewExtras; +import com.stardust.autojs.core.ui.attribute.ViewAttributes; import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater; import com.stardust.autojs.core.ui.inflater.ResourceParser; import com.stardust.autojs.core.ui.inflater.ViewInflater; @@ -37,6 +40,7 @@ import java.util.Map; public class BaseViewInflater implements ViewInflater { + private static final String LOG_TAG = "BaseViewInflater"; public static final ValueMapper TINT_MODES = new ValueMapper("tintMode") .map("add", PorterDuff.Mode.ADD) @@ -106,9 +110,19 @@ public class BaseViewInflater implements ViewInflater { return mResourceParser.getDrawables(); } + public ResourceParser getResourceParser() { + return mResourceParser; + } @Override public boolean setAttr(V view, String attr, String value, ViewGroup parent, Map attrs) { + ViewAttributes viewAttributes = ViewExtras.getViewAttributes(view, getResourceParser()); + ViewAttributes.Attribute attribute = viewAttributes.get(attr); + if (attribute != null) { + attribute.set(value); + return true; + } + Log.d(LOG_TAG, "setAttr cannot use ViewAttributes: attr = " + attr); Integer layoutRule = null; boolean layoutTarget = false; ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); @@ -129,7 +143,7 @@ public class BaseViewInflater implements ViewInflater { layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT; break; default: - layoutParams.width = Dimensions.parseToPixel(value, view.getResources().getDisplayMetrics(), parent, true); + layoutParams.width = Dimensions.parseToPixel(value, view, parent, true); break; } break; @@ -144,7 +158,7 @@ public class BaseViewInflater implements ViewInflater { layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT; break; default: - layoutParams.height = Dimensions.parseToPixel(value, view.getResources().getDisplayMetrics(), parent, false); + layoutParams.height = Dimensions.parseToPixel(value, view, parent, false); break; } break; diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java index a5b62f2e..98aca4d0 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/Dimensions.java @@ -30,12 +30,12 @@ public class Dimensions { private static final Pattern DIMENSION_PATTERN = Pattern.compile("([+-]?[0-9.]+)([a-zA-Z]*)"); - public static int parseToPixel(String dimension, DisplayMetrics metrics, ViewGroup parent, boolean horizontal) { - if (dimension.endsWith("%")) { + public static int parseToPixel(String dimension, View view, ViewGroup parent, boolean horizontal) { + if (dimension.endsWith("%") && parent != null) { float pct = Float.parseFloat(dimension.substring(0, dimension.length() - 1)) / 100.0f; return (int) (pct * (horizontal ? parent.getMeasuredWidth() : parent.getMeasuredHeight())); } - return parseToIntPixel(dimension, parent.getContext()); + return parseToIntPixel(dimension, view.getContext()); } public static float parseToPixel(String dimension, View view) { @@ -59,7 +59,7 @@ public class Dimensions { if (!m.matches()) { throw new InflateException("dimension cannot be resolved: " + dimension); } - int unit = m.groupCount() == 2 ? UNITS.getOr(m.group(2), TypedValue.COMPLEX_UNIT_DIP) : TypedValue.COMPLEX_UNIT_DIP; + int unit = m.groupCount() == 2 ? UNITS.get(m.group(2), TypedValue.COMPLEX_UNIT_DIP) : TypedValue.COMPLEX_UNIT_DIP; float value = Integer.valueOf(m.group(1)); return TypedValue.applyDimension(unit, value, context.getResources().getDisplayMetrics()); } diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/ValueMapper.java b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/ValueMapper.java index adf987f4..655ff9a1 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/ValueMapper.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/inflater/util/ValueMapper.java @@ -23,7 +23,18 @@ public class ValueMapper { } - public V getOr(String key, V defValue) { + public ValueMapper mapDefault(String key, V value) { + mHashMap.put(key, value); + mHashMap.put("", value); + return this; + } + + public ValueMapper mapDefault(V value) { + mHashMap.put("", value); + return this; + } + + public V get(String key, V defValue) { V v = mHashMap.get(key); if (v == null) { return defValue; diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/nativeview/NativeView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/nativeview/NativeView.java index 7480808c..d0f94a70 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/nativeview/NativeView.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/nativeview/NativeView.java @@ -4,6 +4,7 @@ import android.view.View; import com.stardust.autojs.R; import com.stardust.autojs.core.ui.JsViewHelper; +import com.stardust.autojs.core.ui.ViewExtras; import com.stardust.autojs.core.ui.attribute.ViewAttributes; import com.stardust.autojs.rhino.NativeJavaObjectWithPrototype; @@ -42,33 +43,14 @@ public class NativeView extends NativeJavaObjectWithPrototype { private final View mView; private final ViewPrototype mViewPrototype; - public NativeView(Scriptable scope, View javaObject, Class staticType, com.stardust.autojs.runtime.ScriptRuntime runtime) { - super(scope, javaObject, staticType); - mViewAttributes = new ViewAttributes(runtime.ui.getResourceParser(), javaObject); - mView = javaObject; + public NativeView(Scriptable scope, View view, Class staticType, com.stardust.autojs.runtime.ScriptRuntime runtime) { + super(scope, view, staticType); + mViewAttributes = ViewExtras.getViewAttributes(view, runtime.ui.getResourceParser()); + mView = view; mViewPrototype = new ViewPrototype(mView, scope, runtime); prototype = new NativeJavaObject(scope, mViewPrototype, mViewPrototype.getClass()); } - public static NativeView fromView(Scriptable scope, View view, Class staticType, com.stardust.autojs.runtime.ScriptRuntime runtime) { - Object tag = view.getTag(R.id.view_tag_native_view); - if (tag instanceof NativeView) { - return (NativeView) tag; - } else { - NativeView nativeView = new NativeView(scope, view, staticType, runtime); - view.setTag(R.id.view_tag_native_view, nativeView); - return nativeView; - } - } - - public static NativeView fromView(View view) { - Object tag = view.getTag(R.id.view_tag_native_view); - if (tag instanceof NativeView) - return (NativeView) tag; - else - return null; - } - @Override public boolean has(String name, Scriptable start) { if (mViewAttributes.contains(name)) { diff --git a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java index 73e2534f..f0023f51 100644 --- a/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java +++ b/autojs/src/main/java/com/stardust/autojs/core/ui/widget/JsListView.java @@ -11,6 +11,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import com.stardust.autojs.R; +import com.stardust.autojs.core.ui.ViewExtras; import com.stardust.autojs.core.ui.inflater.DynamicLayoutInflater; import com.stardust.autojs.core.ui.nativeview.NativeView; import com.stardust.autojs.core.ui.nativeview.ViewPrototype; @@ -126,7 +127,7 @@ public class JsListView extends RecyclerView { int pos = getAdapterPosition(); return mOnItemTouchListener.onItemLongClick(JsListView.this, itemView, mDataSourceAdapter.getItem(mDataSource, pos), pos); }); - NativeView nativeView = NativeView.fromView(JsListView.this); + NativeView nativeView = ViewExtras.getNativeView(JsListView.this); if (nativeView != null) { ViewPrototype prototype = nativeView.getViewPrototype(); prototype.emit("item_bind", itemView, new ItemHolder(this)); 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 c90501a4..a7dc7563 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/RhinoJavaScriptEngine.java @@ -6,6 +6,7 @@ import android.view.View; import com.stardust.app.GlobalAppContext; import com.stardust.autojs.BuildConfig; +import com.stardust.autojs.core.ui.ViewExtras; import com.stardust.autojs.core.ui.nativeview.NativeView; import com.stardust.autojs.rhino.AndroidContextFactory; import com.stardust.autojs.rhino.RhinoAndroidHelper; @@ -189,7 +190,7 @@ public class RhinoJavaScriptEngine extends JavaScriptEngine { @Override public Scriptable wrapAsJavaObject(Context cx, Scriptable scope, Object javaObject, Class staticType) { if (javaObject instanceof View) { - return NativeView.fromView(scope, (View) javaObject, staticType, getRuntime()); + return ViewExtras.getNativeView(scope, (View) javaObject, staticType, getRuntime()); } return super.wrapAsJavaObject(cx, scope, javaObject, staticType); } 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 a8493e44..ed579814 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -50,9 +50,15 @@ import com.stardust.util.UiHandler; import com.stardust.view.accessibility.AccessibilityInfoProvider; import org.mozilla.javascript.ContextFactory; +import org.mozilla.javascript.RhinoException; +import org.mozilla.javascript.ScriptStackElement; +import java.io.BufferedReader; import java.io.File; import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringReader; +import java.io.StringWriter; import java.lang.ref.WeakReference; import java.util.ArrayList; import java.util.List; @@ -71,6 +77,7 @@ public class ScriptRuntime { private static final String TAG = "ScriptRuntime"; + public static class Builder { private UiHandler mUiHandler; private Console mConsole; @@ -384,7 +391,7 @@ public class ScriptRuntime { try { events.emit("exit"); } catch (Exception ignored) { - console.error("exception on exit: " + ScriptEngineService.getScriptTrace(ignored)); + console.error("exception on exit: ", ignored); } ignoresException(threads::shutDownAll); ignoresException(events::recycle); @@ -427,4 +434,36 @@ public class ScriptRuntime { return mProperties.remove(key); } + public static String getStackTrace(Throwable e, boolean printJavaStackTrace){ + StringBuilder scriptTrace = new StringBuilder(); + if (e instanceof RhinoException) { + RhinoException rhinoException = (RhinoException) e; + scriptTrace.append(rhinoException.details()).append("\n"); + for (ScriptStackElement element : rhinoException.getScriptStack()) { + element.renderV8Style(scriptTrace); + scriptTrace.append("\n"); + } + if(printJavaStackTrace){ + scriptTrace.append("- - - - - - - - - - -\n"); + }else { + return scriptTrace.toString(); + } + } + try { + StringWriter stringWriter = new StringWriter(); + PrintWriter writer = new PrintWriter(stringWriter); + e.printStackTrace(writer); + writer.close(); + BufferedReader bufferedReader = new BufferedReader(new StringReader(writer.toString())); + String line; + while ((line = bufferedReader.readLine()) != null) { + scriptTrace.append("\n").append(line); + } + return scriptTrace.toString(); + } catch (IOException e1) { + e1.printStackTrace(); + return e.getMessage(); + } + } + } diff --git a/autojs/src/main/res/values/ids.xml b/autojs/src/main/res/values/ids.xml index c0589705..78bc49dc 100644 --- a/autojs/src/main/res/values/ids.xml +++ b/autojs/src/main/res/values/ids.xml @@ -1,4 +1,4 @@ - + \ No newline at end of file diff --git a/autojs/src/main/res/values/pref_keys.xml b/autojs/src/main/res/values/pref_keys.xml new file mode 100644 index 00000000..8e38d039 --- /dev/null +++ b/autojs/src/main/res/values/pref_keys.xml @@ -0,0 +1,4 @@ + + + key_print_java_stack_trace + \ No newline at end of file diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java b/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java index 3930f6c1..ff6dcc96 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/SplashActivity.java @@ -65,7 +65,7 @@ public class SplashActivity extends AppCompatActivity { runOnUiThread(() -> { Toast.makeText(SplashActivity.this, e.getMessage(), Toast.LENGTH_LONG).show(); startActivity(new Intent(SplashActivity.this, LogActivity.class)); - AutoJs.getInstance().getGlobalConsole().printStackTrace(e); + AutoJs.getInstance().getGlobalConsole().printAllStackTrace(e); }); } }).start(); diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java b/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java index 2c63012e..1ee45672 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java @@ -77,7 +77,7 @@ public class AssetsProjectLauncher { mScriptExecution = AutoJs.getInstance().getScriptEngineService().execute(source, new ExecutionConfig() .executePath(mProjectDir)); } catch (Exception e) { - AutoJs.getInstance().getGlobalConsole().error(ScriptEngineService.getScriptTrace(e)); + AutoJs.getInstance().getGlobalConsole().error(e); } }