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

View File

@ -4,7 +4,7 @@ import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.stardust.autojs.runtime.accessibility.AutomatorConfig;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import java.util.concurrent.TimeUnit;
@ -23,13 +23,13 @@ public class Pref {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
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 {
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() {

View File

@ -4,9 +4,11 @@ import android.app.Application;
import android.content.Context;
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.api.Console;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.BuildConfig;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
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
protected Application getApplication() {
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.ScriptEngineManager;
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.Console;
import com.stardust.autojs.runtime.exception.ScriptException;
@ -108,12 +109,7 @@ public abstract class AutoJs {
.setShellSupplier(() -> new Shell(mContext, true)).build());
return engine;
});
mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, new Supplier<ScriptEngine>() {
@Override
public ScriptEngine get() {
return new RootAutomatorEngine(mContext);
}
});
mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, () -> new RootAutomatorEngine(mContext));
}
@ -174,8 +170,16 @@ public abstract class AutoJs {
}
protected AccessibilityConfig createAccessibilityConfig() {
return new AccessibilityConfig();
}
private class AccessibilityBridgeImpl extends AccessibilityBridge {
public AccessibilityBridgeImpl() {
super(createAccessibilityConfig());
}
@Override
public void ensureServiceEnabled() {
AutoJs.this.ensureAccessibilityServiceEnabled();

View File

@ -4,6 +4,7 @@ import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
import com.stardust.view.accessibility.AccessibilityInfoProvider;
import com.stardust.view.accessibility.AccessibilityNotificationObserver;
import com.stardust.view.accessibility.AccessibilityService;
@ -19,11 +20,15 @@ public abstract class AccessibilityBridge {
public static final int MODE_FAST = 1;
private int mMode = MODE_NORMAL;
private AccessibilityConfig mConfig;
public AccessibilityBridge(AccessibilityConfig config) {
mConfig = config;
mConfig.seal();
}
public abstract void ensureServiceEnabled();
@Nullable
public abstract AccessibilityService getService();
@ -49,4 +54,8 @@ public abstract class AccessibilityBridge {
@NonNull
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.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.UiObject;
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.ScreenMetrics;
import org.mozilla.javascript.Context;
import org.mozilla.javascript.NativeJavaObject;
/**
* Created by Stardust on 2017/4/2.
*/
@ -252,7 +249,7 @@ public class SimpleActionAutomator {
@SuppressWarnings("unchecked")
private boolean performAction(SimpleAction simpleAction) {
ensureAccessibilityServiceEnabled();
if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
if (AccessibilityConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
Log.d(TAG, "performAction: running package is self. return false");
return false;
}

View File

@ -6,7 +6,6 @@ import android.util.Log;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.autojs.annotation.ScriptInterface;
import com.stardust.autojs.runtime.accessibility.AutomatorConfig;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.automator.ActionArgument;
import com.stardust.automator.UiGlobalSelector;
@ -73,14 +72,14 @@ public class UiSelector extends UiGlobalSelector {
@ScriptInterface
public UiObjectCollection find() {
ensureAccessibilityServiceEnabled();
if (AutomatorConfig.isUnintendedGuardEnabled() && isRunningPackageSelf()) {
Log.d(TAG, "isSelfPackage return null");
return UiObjectCollection.EMPTY;
}
AccessibilityNodeInfo root = mAccessibilityBridge.getRootInActiveWindow();
if (root == null) {
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));
}
@ -121,11 +120,6 @@ public class UiSelector extends UiGlobalSelector {
mAccessibilityBridge.ensureServiceEnabled();
}
private boolean isRunningPackageSelf() {
return DeveloperUtils.isSelfPackage(mAccessibilityBridge.getInfoProvider().getLatestPackage());
}
@ScriptInterface
@NonNull
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 SIGNATURE = "3082037130820259a003020102020428425adc300d06092a864886f70d01010b05003068310b300906035504061302434e310f300d06035504080c06e5b9bfe4b89c310f300d06035504070c06e5b9bfe5b79e31123010060355040a0c09444b52e4b8aae4baba310c300a060355040b1303444b523115301306035504030c0ce6989fe5b098e5b9bbe5bdb13020170d3135313031303039353533365a180f32303730303731333039353533365a3068310b300906035504061302434e310f300d06035504080c06e5b9bfe4b89c310f300d06035504070c06e5b9bfe5b79e31123010060355040a0c09444b52e4b8aae4baba310c300a060355040b1303444b523115301306035504030c0ce6989fe5b098e5b9bbe5bdb130820122300d06092a864886f70d01010105000382010f003082010a0282010100d4377c8e7f711408c6136e6a25b1b3d0cc7dc2ebfd633a623bd24649b4d74b702a1792e298bd2e495b0b72226f06b9bd9078d1707fc2997e6732f5d253b3c318b1ca52a7fe82eb1045825ff2f85386701e9b4837ad77cdacb8e269d41fc52077dd6a2b6cfac70d3e5b5cae90880983d09bb2f09ec5e415c07a73ec0331aec0fe7ca9ea3de4ced22e3c0a94d4b0ae89bcf7bb73e3861897afad3099f5f9098c324d80e46cda00641fdb78cd451f3615553365b75835618b34cc27385f3a5c503185d2972d2efaba384e3bba1c9e353ea8ce898a34df76697253cdb0fb80866c6b2b04ab3b0ab3211789ace0d9b456854a549ce24c36ca30d73943a4dc111adbc90203010001a321301f301d0603551d0e04160414e8b844190be53497ca213ae3a81e2ce7883a0b21300d06092a864886f70d01010b050003820101007f9d7bfed50a22cdebec1134d82a23f33be739e5dd61fe4a84e1065230397ba02dde126aadcd0bb0dca22b7c3a396aae0f8ca1945c5b27d2ccea9b509a99a9d7f2fe7ba82118e851794134f0a13d53e2203e77f2e1a7e2ed0d732419d24902c30a75d556fa65aae6b137a3a2c48b732a30f906e446ec8a54e6f6f914a5fe8e33f0219635b3ad4b9d3b76e1c38b19030f12e0f110aac1a9335f542bbe49705f01f0082f8840be09d85514fdb92f08a4abe3811492323cec5b80cb3edc62e3ec44d426eff2adff817cfc37022e113d9cce442ecb95e343563eb081380631f9f0a6925dc1b717049160e4dfc4400d477dceaccfc8f2a7b73616619c9a802eb47ebd";
public static String selfPackage() {
return PACKAGE_NAME;
}
public static void ensureRunningPackageNotSelf(@Nullable String runningPackage) {
if (PACKAGE_NAME.equals(runningPackage)) {
throw new SecurityException();

View File

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