diff --git a/app/build.gradle b/app/build.gradle
index 475e1eb0..413e8e2b 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -46,6 +46,7 @@ android {
]
}
}
+ ndk { }
}
buildTypes {
debug {
@@ -197,7 +198,8 @@ dependencies {
// Flurry
implementation 'com.flurry.android:analytics:7.0.0@aar'
// Bugly
- implementation 'com.tencent.bugly:crashreport:2.6.6'
+ implementation 'com.tencent.bugly:crashreport:3.2.3'
+ implementation 'com.tencent.bugly:nativecrashreport:3.7.47'
// MaterialDialogCommon
implementation('com.afollestad.material-dialogs:commons:0.9.2.3', {
exclude group: 'com.android.support'
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index f466ec0a..ae02bd74 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -10,6 +10,7 @@
+
diff --git a/app/src/main/java/org/autojs/autojs/App.kt b/app/src/main/java/org/autojs/autojs/App.kt
index c27283af..1486503b 100644
--- a/app/src/main/java/org/autojs/autojs/App.kt
+++ b/app/src/main/java/org/autojs/autojs/App.kt
@@ -53,7 +53,7 @@ class App : MultiDexApplication() {
return
FlurryAgent.Builder()
.withLogEnabled(BuildConfig.DEBUG)
- .build(this, "D42MH48ZN4PJC5TKNYZD")
+ .build(this, "V5B5VT5NP6TT5F78PZXR")
}
private fun setUpDebugEnvironment() {
@@ -164,7 +164,7 @@ class App : MultiDexApplication() {
companion object {
private val TAG = "App"
- private val BUGLY_APP_ID = "19b3607b53"
+ private val BUGLY_APP_ID = "e020acad30"
private lateinit var instance: WeakReference
diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java
index ceb38e6d..1b45556e 100644
--- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java
+++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java
@@ -26,10 +26,10 @@ import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import java.util.Collection;
-import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArraySet;
import static com.stardust.autojs.runtime.exception.ScriptInterruptedException.causedByInterrupted;
@@ -227,7 +227,7 @@ public class ScriptEngineService {
private static class EngineLifecycleObserver implements ScriptEngineManager.EngineLifecycleCallback {
- private final Set mEngineLifecycleCallbacks = new LinkedHashSet<>();
+ private final Set mEngineLifecycleCallbacks = new CopyOnWriteArraySet<>();
@Override
public void onEngineCreate(ScriptEngine engine) {
diff --git a/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java b/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java
index 9eb1ae6c..14c1b74d 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/image/TemplateMatching.java
@@ -190,7 +190,7 @@ public class TemplateMatching {
private static int selectPyramidLevel(Mat img, Mat template) {
int minDim = Nath.min(img.rows(), img.cols(), template.rows(), template.cols());
//这里选取16为图像缩小后的最小宽高,从而用log(2, minDim / 16)得到最多可以经过几次缩小。
- int maxLevel = (int) (Math.log(minDim / 16) / Math.log(2));
+ int maxLevel = (int) (Math.log(minDim / 16.0) / Math.log(2));
if (maxLevel < 0) {
return 0;
}
diff --git a/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java b/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java
index 64d340b1..1eba15bd 100644
--- a/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java
+++ b/autojs/src/main/java/com/stardust/autojs/core/looper/Loopers.java
@@ -227,6 +227,8 @@ public class Loopers implements MessageQueue.IdleHandler {
Log.d(LOG_TAG, "notifyThreadExit: " + thread);
//当子线程退成时,主线程需要检查自身是否退出(主线程在所有子线程执行完成后才能退出,如果主线程已经执行完任务仍然要等待所有子线程),
//此时通过向主线程发送一个空的Runnable,主线程执行完这个Runnable后会触发IdleHandler,从而检查自身是否退出
- mMainHandler.post(EMPTY_RUNNABLE);
+ if (mMainHandler != null) {
+ mMainHandler.post(EMPTY_RUNNABLE);
+ }
}
}
diff --git a/autojs/src/main/java/com/stardust/autojs/rhino/RhinoAndroidHelper.java b/autojs/src/main/java/com/stardust/autojs/rhino/RhinoAndroidHelper.java
index b3ec0809..0069da67 100644
--- a/autojs/src/main/java/com/stardust/autojs/rhino/RhinoAndroidHelper.java
+++ b/autojs/src/main/java/com/stardust/autojs/rhino/RhinoAndroidHelper.java
@@ -50,8 +50,13 @@ public class RhinoAndroidHelper {
* @return a context prepared for android
*/
public Context enterContext() {
- if (!SecurityController.hasGlobal())
- SecurityController.initGlobal(new NoSecurityController());
+ if (!SecurityController.hasGlobal()) {
+ synchronized (RhinoAndroidHelper.class) {
+ if (!SecurityController.hasGlobal()) {
+ SecurityController.initGlobal(new NoSecurityController());
+ }
+ }
+ }
return getContextFactory().enterContext();
}
@@ -59,7 +64,7 @@ public class RhinoAndroidHelper {
* @return The Context factory which has to be used on android.
*/
@VisibleForTesting
- public AndroidContextFactory getContextFactory() {
+ public synchronized AndroidContextFactory getContextFactory() {
AndroidContextFactory factory;
if (!ContextFactory.hasExplicitGlobal()) {
factory = new AndroidContextFactory(cacheDirectory);