feat: accessibility white list

This commit is contained in:
hyb1996
2018-02-03 22:54:06 +08:00
parent b5533fb570
commit 5fed594bf1
11 changed files with 112 additions and 48 deletions

View File

@@ -8,8 +8,8 @@ android {
applicationId "com.stardust.scriptdroid" applicationId "com.stardust.scriptdroid"
minSdkVersion 17 minSdkVersion 17
targetSdkVersion 23 targetSdkVersion 23
versionCode 246 versionCode 247
versionName "3.0.0 Beta" versionName "3.0.0 Alpha47"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
ndk { ndk {
@@ -39,15 +39,29 @@ android {
} }
android.applicationVariants.all { variant -> android.applicationVariants.all { variant ->
variant.outputs.all { variant.outputs.all {
outputFileName = "${variant.name}-${variant.versionName}.apk" outputFileName = "${variant.name}-${variant.versionName}-${variant.flavorName}.apk"
} }
} }
configurations.all { configurations.all {
resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1' resolutionStrategy.force 'com.google.code.findbugs:jsr305:3.0.1'
} }
flavorDimensions "channel"
productFlavors {
common {
buildConfigField "String", "CHANNEL", '"common"'
}
coolapk {
buildConfigField "String", "CHANNEL", '"coolapk"'
}
}
} }
repositories { repositories {
flatDir { flatDir {
dirs 'libs' dirs 'libs'

View File

@@ -4,7 +4,7 @@ import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.preference.PreferenceManager; import android.preference.PreferenceManager;
import com.stardust.autojs.runtime.accessibility.AutomatorConfig; import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@@ -23,13 +23,13 @@ public class Pref {
@Override @Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) { public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(getString(R.string.key_guard_mode))) { if (key.equals(getString(R.string.key_guard_mode))) {
AutomatorConfig.setIsUnintendedGuardEnabled(sharedPreferences.getBoolean(getString(R.string.key_guard_mode), false)); AccessibilityConfig.setIsUnintendedGuardEnabled(sharedPreferences.getBoolean(getString(R.string.key_guard_mode), false));
} }
} }
}; };
static { static {
AutomatorConfig.setIsUnintendedGuardEnabled(def().getBoolean(getString(R.string.key_guard_mode), false)); AccessibilityConfig.setIsUnintendedGuardEnabled(def().getBoolean(getString(R.string.key_guard_mode), false));
} }
private static SharedPreferences def() { private static SharedPreferences def() {

View File

@@ -4,9 +4,11 @@ import android.app.Application;
import android.content.Context; import android.content.Context;
import com.stardust.autojs.core.console.GlobalStardustConsole; import com.stardust.autojs.core.console.GlobalStardustConsole;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.runtime.exception.ScriptException;
import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.Console;
import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.BuildConfig;
import com.stardust.scriptdroid.Pref; import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.pluginclient.DevPluginService; import com.stardust.scriptdroid.pluginclient.DevPluginService;
@@ -70,6 +72,15 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
} }
} }
@Override
protected AccessibilityConfig createAccessibilityConfig() {
AccessibilityConfig config = super.createAccessibilityConfig();
if (BuildConfig.CHANNEL.equals("coolapk")) {
config.addWhiteList("com.coolapk.market");
}
return config;
}
@Override @Override
protected Application getApplication() { protected Application getApplication() {
return App.getApp(); return App.getApp();

View File

@@ -23,6 +23,7 @@ import com.stardust.autojs.engine.RootAutomatorEngine;
import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager; import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.runtime.exception.ScriptException;
@@ -108,12 +109,7 @@ public abstract class AutoJs {
.setShellSupplier(() -> new Shell(mContext, true)).build()); .setShellSupplier(() -> new Shell(mContext, true)).build());
return engine; return engine;
}); });
mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, new Supplier<ScriptEngine>() { mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, () -> new RootAutomatorEngine(mContext));
@Override
public ScriptEngine get() {
return new RootAutomatorEngine(mContext);
}
});
} }
@@ -174,8 +170,16 @@ public abstract class AutoJs {
} }
protected AccessibilityConfig createAccessibilityConfig() {
return new AccessibilityConfig();
}
private class AccessibilityBridgeImpl extends AccessibilityBridge { private class AccessibilityBridgeImpl extends AccessibilityBridge {
public AccessibilityBridgeImpl() {
super(createAccessibilityConfig());
}
@Override @Override
public void ensureServiceEnabled() { public void ensureServiceEnabled() {
AutoJs.this.ensureAccessibilityServiceEnabled(); AutoJs.this.ensureAccessibilityServiceEnabled();

View File

@@ -4,6 +4,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.view.accessibility.AccessibilityInfoProvider; import com.stardust.view.accessibility.AccessibilityInfoProvider;
import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityNotificationObserver;
import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityService;
@@ -19,11 +20,15 @@ public abstract class AccessibilityBridge {
public static final int MODE_FAST = 1; public static final int MODE_FAST = 1;
private int mMode = MODE_NORMAL; private int mMode = MODE_NORMAL;
private AccessibilityConfig mConfig;
public AccessibilityBridge(AccessibilityConfig config) {
mConfig = config;
mConfig.seal();
}
public abstract void ensureServiceEnabled(); public abstract void ensureServiceEnabled();
@Nullable @Nullable
public abstract AccessibilityService getService(); public abstract AccessibilityService getService();
@@ -49,4 +54,8 @@ public abstract class AccessibilityBridge {
@NonNull @NonNull
public abstract AccessibilityNotificationObserver getNotificationObserver(); public abstract AccessibilityNotificationObserver getNotificationObserver();
public AccessibilityConfig getConfig() {
return mConfig;
}
} }

View File

@@ -11,7 +11,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.annotation.ScriptInterface; import com.stardust.autojs.annotation.ScriptInterface;
import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.accessibility.AutomatorConfig; import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.automator.GlobalActionAutomator; import com.stardust.automator.GlobalActionAutomator;
import com.stardust.automator.UiObject; import com.stardust.automator.UiObject;
import com.stardust.automator.simple_action.ActionFactory; import com.stardust.automator.simple_action.ActionFactory;
@@ -20,9 +20,6 @@ import com.stardust.automator.simple_action.SimpleAction;
import com.stardust.util.DeveloperUtils; import com.stardust.util.DeveloperUtils;
import com.stardust.util.ScreenMetrics; import com.stardust.util.ScreenMetrics;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.NativeJavaObject;
/** /**
* Created by Stardust on 2017/4/2. * Created by Stardust on 2017/4/2.
*/ */
@@ -252,7 +249,7 @@ public class SimpleActionAutomator {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
private boolean performAction(SimpleAction simpleAction) { private boolean performAction(SimpleAction simpleAction) {
ensureAccessibilityServiceEnabled(); ensureAccessibilityServiceEnabled();
if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) { if (AccessibilityConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
Log.d(TAG, "performAction: running package is self. return false"); Log.d(TAG, "performAction: running package is self. return false");
return false; return false;
} }

View File

@@ -6,7 +6,6 @@ import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.annotation.ScriptInterface; import com.stardust.autojs.annotation.ScriptInterface;
import com.stardust.autojs.runtime.accessibility.AutomatorConfig;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException; import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.automator.ActionArgument; import com.stardust.automator.ActionArgument;
import com.stardust.automator.UiGlobalSelector; import com.stardust.automator.UiGlobalSelector;
@@ -73,14 +72,14 @@ public class UiSelector extends UiGlobalSelector {
@ScriptInterface @ScriptInterface
public UiObjectCollection find() { public UiObjectCollection find() {
ensureAccessibilityServiceEnabled(); ensureAccessibilityServiceEnabled();
if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
Log.d(TAG, "isSelfPackage return null");
return UiObjectCollection.EMPTY;
}
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow(); AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow();
if (root == null) { if (root == null) {
return UiObjectCollection.EMPTY; return UiObjectCollection.EMPTY;
} }
if (root.getPackageName() != null && mAccessibilityBridge.getConfig().whiteListContains(root.getPackageName().toString())) {
Log.d(TAG, "package in white list, return null");
return UiObjectCollection.EMPTY;
}
return findOf(UiObject.createRoot(root, mAllocator)); return findOf(UiObject.createRoot(root, mAllocator));
} }
@@ -121,11 +120,6 @@ public class UiSelector extends UiGlobalSelector {
mAccessibilityBridge.ensureServiceEnabled(); mAccessibilityBridge.ensureServiceEnabled();
} }
private boolean isRunningPackageSelf() {
return DeveloperUtils.isSelfPackage(mAccessibilityBridge.getInfoProvider().getLatestPackage());
}
@ScriptInterface @ScriptInterface
@NonNull @NonNull
public UiObjectCollection untilFind() { public UiObjectCollection untilFind() {

View File

@@ -0,0 +1,51 @@
package com.stardust.autojs.runtime.accessibility;
import android.util.ArraySet;
import com.stardust.util.DeveloperUtils;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
/**
* Created by Stardust on 2017/4/29.
*/
public class AccessibilityConfig {
private static boolean isUnintendedGuardEnabled = false;
private List<String> mWhiteList = new ArrayList<>();
private boolean mSealed = false;
public AccessibilityConfig() {
if (isUnintendedGuardEnabled()) {
mWhiteList.add(DeveloperUtils.selfPackage());
}
}
public static boolean isUnintendedGuardEnabled() {
return isUnintendedGuardEnabled;
}
public static void setIsUnintendedGuardEnabled(boolean isUnintendedGuardEnabled) {
AccessibilityConfig.isUnintendedGuardEnabled = isUnintendedGuardEnabled;
}
public boolean whiteListContains(String packageName) {
return mWhiteList.contains(packageName);
}
public void addWhiteList(String packageName) {
if (mSealed)
throw new IllegalStateException("sealed");
mWhiteList.add(packageName);
}
public final void seal() {
mSealed = true;
}
}

View File

@@ -1,19 +0,0 @@
package com.stardust.autojs.runtime.accessibility;
/**
* Created by Stardust on 2017/4/29.
*/
public class AutomatorConfig {
private static boolean isUnintendedGuardEnabled = false;
public static boolean isUnintendedGuardEnabled() {
return isUnintendedGuardEnabled;
}
public static void setIsUnintendedGuardEnabled(boolean isUnintendedGuardEnabled) {
AutomatorConfig.isUnintendedGuardEnabled = isUnintendedGuardEnabled;
}
}

View File

@@ -17,6 +17,10 @@ public class DeveloperUtils {
private static final String PACKAGE_NAME = "com.stardust.scriptdroid"; private static final String PACKAGE_NAME = "com.stardust.scriptdroid";
private static final String SIGNATURE = "3082037130820259a003020102020428425adc300d06092a864886f70d01010b05003068310b300906035504061302434e310f300d06035504080c06e5b9bfe4b89c310f300d06035504070c06e5b9bfe5b79e31123010060355040a0c09444b52e4b8aae4baba310c300a060355040b1303444b523115301306035504030c0ce6989fe5b098e5b9bbe5bdb13020170d3135313031303039353533365a180f32303730303731333039353533365a3068310b300906035504061302434e310f300d06035504080c06e5b9bfe4b89c310f300d06035504070c06e5b9bfe5b79e31123010060355040a0c09444b52e4b8aae4baba310c300a060355040b1303444b523115301306035504030c0ce6989fe5b098e5b9bbe5bdb130820122300d06092a864886f70d01010105000382010f003082010a0282010100d4377c8e7f711408c6136e6a25b1b3d0cc7dc2ebfd633a623bd24649b4d74b702a1792e298bd2e495b0b72226f06b9bd9078d1707fc2997e6732f5d253b3c318b1ca52a7fe82eb1045825ff2f85386701e9b4837ad77cdacb8e269d41fc52077dd6a2b6cfac70d3e5b5cae90880983d09bb2f09ec5e415c07a73ec0331aec0fe7ca9ea3de4ced22e3c0a94d4b0ae89bcf7bb73e3861897afad3099f5f9098c324d80e46cda00641fdb78cd451f3615553365b75835618b34cc27385f3a5c503185d2972d2efaba384e3bba1c9e353ea8ce898a34df76697253cdb0fb80866c6b2b04ab3b0ab3211789ace0d9b456854a549ce24c36ca30d73943a4dc111adbc90203010001a321301f301d0603551d0e04160414e8b844190be53497ca213ae3a81e2ce7883a0b21300d06092a864886f70d01010b050003820101007f9d7bfed50a22cdebec1134d82a23f33be739e5dd61fe4a84e1065230397ba02dde126aadcd0bb0dca22b7c3a396aae0f8ca1945c5b27d2ccea9b509a99a9d7f2fe7ba82118e851794134f0a13d53e2203e77f2e1a7e2ed0d732419d24902c30a75d556fa65aae6b137a3a2c48b732a30f906e446ec8a54e6f6f914a5fe8e33f0219635b3ad4b9d3b76e1c38b19030f12e0f110aac1a9335f542bbe49705f01f0082f8840be09d85514fdb92f08a4abe3811492323cec5b80cb3edc62e3ec44d426eff2adff817cfc37022e113d9cce442ecb95e343563eb081380631f9f0a6925dc1b717049160e4dfc4400d477dceaccfc8f2a7b73616619c9a802eb47ebd"; private static final String SIGNATURE = "3082037130820259a003020102020428425adc300d06092a864886f70d01010b05003068310b300906035504061302434e310f300d06035504080c06e5b9bfe4b89c310f300d06035504070c06e5b9bfe5b79e31123010060355040a0c09444b52e4b8aae4baba310c300a060355040b1303444b523115301306035504030c0ce6989fe5b098e5b9bbe5bdb13020170d3135313031303039353533365a180f32303730303731333039353533365a3068310b300906035504061302434e310f300d06035504080c06e5b9bfe4b89c310f300d06035504070c06e5b9bfe5b79e31123010060355040a0c09444b52e4b8aae4baba310c300a060355040b1303444b523115301306035504030c0ce6989fe5b098e5b9bbe5bdb130820122300d06092a864886f70d01010105000382010f003082010a0282010100d4377c8e7f711408c6136e6a25b1b3d0cc7dc2ebfd633a623bd24649b4d74b702a1792e298bd2e495b0b72226f06b9bd9078d1707fc2997e6732f5d253b3c318b1ca52a7fe82eb1045825ff2f85386701e9b4837ad77cdacb8e269d41fc52077dd6a2b6cfac70d3e5b5cae90880983d09bb2f09ec5e415c07a73ec0331aec0fe7ca9ea3de4ced22e3c0a94d4b0ae89bcf7bb73e3861897afad3099f5f9098c324d80e46cda00641fdb78cd451f3615553365b75835618b34cc27385f3a5c503185d2972d2efaba384e3bba1c9e353ea8ce898a34df76697253cdb0fb80866c6b2b04ab3b0ab3211789ace0d9b456854a549ce24c36ca30d73943a4dc111adbc90203010001a321301f301d0603551d0e04160414e8b844190be53497ca213ae3a81e2ce7883a0b21300d06092a864886f70d01010b050003820101007f9d7bfed50a22cdebec1134d82a23f33be739e5dd61fe4a84e1065230397ba02dde126aadcd0bb0dca22b7c3a396aae0f8ca1945c5b27d2ccea9b509a99a9d7f2fe7ba82118e851794134f0a13d53e2203e77f2e1a7e2ed0d732419d24902c30a75d556fa65aae6b137a3a2c48b732a30f906e446ec8a54e6f6f914a5fe8e33f0219635b3ad4b9d3b76e1c38b19030f12e0f110aac1a9335f542bbe49705f01f0082f8840be09d85514fdb92f08a4abe3811492323cec5b80cb3edc62e3ec44d426eff2adff817cfc37022e113d9cce442ecb95e343563eb081380631f9f0a6925dc1b717049160e4dfc4400d477dceaccfc8f2a7b73616619c9a802eb47ebd";
public static String selfPackage() {
return PACKAGE_NAME;
}
public static void ensureRunningPackageNotSelf(@Nullable String runningPackage) { public static void ensureRunningPackageNotSelf(@Nullable String runningPackage) {
if (PACKAGE_NAME.equals(runningPackage)) { if (PACKAGE_NAME.equals(runningPackage)) {
throw new SecurityException(); throw new SecurityException();

View File

@@ -55,7 +55,6 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
} }
} }
@Override @Override
protected Application getApplication() { protected Application getApplication() {
return App.getApp(); return App.getApp();