Skip to content

Commit 24af900

Browse files
committed
接入shizuku,实现脚本中执行ADB命令的能力
1 parent 851051d commit 24af900

File tree

25 files changed

+693
-51
lines changed

25 files changed

+693
-51
lines changed

app/src/main/AndroidManifest.xml

-6
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
<!-- Ad SDK Permissions -->
3434
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
3535

36-
3736
<application
3837
android:name="org.autojs.autojs.App"
3938
android:allowBackup="false"
@@ -338,9 +337,4 @@
338337
</receiver>
339338

340339
</application>
341-
<queries>
342-
<intent>
343-
<action android:name="android.intent.action.TTS_SERVICE" />
344-
</intent>
345-
</queries>
346340
</manifest>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
if ($shizuku.isRunning()) {
2+
$shizuku('settings put system pointer_location 0')
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
if ($shizuku.isRunning()) {
2+
$shizuku('settings put system show_touches 0')
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
"ui";
2+
3+
let isRunning = $shizuku.isRunning()
4+
if (!isRunning) {
5+
toast('当前未授权shizuku服务,无法执行,请在抽屉界面打开shizuku服务')
6+
exit()
7+
}
8+
9+
ui.layout(
10+
<frame>
11+
<vertical h="auto" align="center" margin="0 50">
12+
<linear gravity="center">
13+
<linear>
14+
<text w="56" gravity="center" color="#111111" size="16">x:</text>
15+
<input id="clickX" w="*" h="40" inputType="number" text="100" />
16+
</linear>
17+
<linear>
18+
<text w="56" gravity="center" color="#111111" size="16">y:</text>
19+
<input id="clickY" w="*" h="40" inputType="number" text="500" />
20+
</linear>
21+
</linear>
22+
<button id="click" text="点击操作" />
23+
<linear gravity="center" >
24+
<linear>
25+
<text w="100" gravity="center" color="#111111" size="16">结束点x:</text>
26+
<input id="endX" w="*" h="40" inputType="number" text="500" />
27+
</linear>
28+
<linear>
29+
<text w="100" gravity="center" color="#111111" size="16">结束点y:</text>
30+
<input id="endY" w="*" h="40" inputType="number" text="1200" />
31+
</linear>
32+
</linear>
33+
<button id="swipe" text="滑动操作" />
34+
<button id="lockScreen" text="锁屏" />
35+
<button id="pmList" text="获取第三方应用包名" />
36+
<linear gravity="center" align="center" >
37+
<button id="togglePointer" text="开启指针位置" />
38+
<button id="toggleTouches" text="开启触控反馈" />
39+
</linear>
40+
41+
<text id="tips" text="shizuku可以执行一些高级的ADB命令,因此请勿随意执行来源不明的脚本,避免发生不必要的损失" />
42+
<scroll>
43+
<text id="textView" text="" />
44+
</scroll>
45+
</vertical>
46+
</frame>
47+
);
48+
49+
ui.click.on('click', () => {
50+
let clickX = ui.clickX.getText(), clickY = ui.clickY.getText()
51+
threads.start(function () {
52+
$shizuku(`input tap ${clickX} ${clickY}`)
53+
})
54+
})
55+
56+
ui.swipe.on('click', () => {
57+
let clickX = ui.clickX.getText(), clickY = ui.clickY.getText()
58+
let endX = ui.endX.getText(), endY = ui.endY.getText()
59+
threads.start(function () {
60+
$shizuku(`input swipe ${clickX} ${clickY} ${endX} ${endY}`)
61+
})
62+
})
63+
64+
ui.lockScreen.on('click', () => {
65+
$shizuku('input keyevent KEYCODE_POWER')
66+
})
67+
68+
ui.pmList.on('click', () => {
69+
let result = $shizuku('pm list package -3')
70+
ui.textView.setText(result.result)
71+
})
72+
73+
ui.togglePointer.on('click', () => {
74+
if (isPointerEnabled()) {
75+
$shizuku('settings put system pointer_location 0')
76+
ui.togglePointer.setText('开启指针位置')
77+
} else {
78+
$shizuku('settings put system pointer_location 1')
79+
ui.togglePointer.setText('关闭指针位置')
80+
}
81+
})
82+
83+
84+
ui.toggleTouches.on('click', () => {
85+
if (isShowTouchesEnabled()) {
86+
$shizuku('settings put system show_touches 0')
87+
ui.toggleTouches.setText('开启触控反馈')
88+
} else {
89+
$shizuku('settings put system show_touches 1')
90+
ui.toggleTouches.setText('关闭触控反馈')
91+
}
92+
})
93+
94+
if (isPointerEnabled()) {
95+
ui.run(function () {
96+
ui.togglePointer.setText('关闭指针位置')
97+
})
98+
}
99+
if (isShowTouchesEnabled()) {
100+
ui.run(function () {
101+
ui.toggleTouches.setText('关闭触控反馈')
102+
})
103+
}
104+
105+
function isPointerEnabled () {
106+
// 是否开启指针位置
107+
let enabled = $shizuku('settings get system pointer_location').result
108+
enabled = (enabled || '').replace(/\n/, '')
109+
return enabled == '1'
110+
}
111+
112+
function isShowTouchesEnabled () {
113+
// 是否开启触控反馈
114+
let enabled = $shizuku('settings get system show_touches').result
115+
enabled = (enabled || '').replace(/\n/, '')
116+
return enabled == '1'
117+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
if ($shizuku.isRunning()) {
2+
$shizuku('settings put system pointer_location 1')
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
if ($shizuku.isRunning()) {
2+
$shizuku('settings put system show_touches 1')
3+
}

app/src/main/java/org/autojs/autojs/Pref.java

+25
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
1111

1212
import org.autojs.autojs.autojs.key.GlobalKeyObserver;
13+
import org.autojs.autojs.timing.work.WorkProviderConstants;
1314

1415
import java.io.File;
1516
import java.util.concurrent.TimeUnit;
@@ -26,6 +27,8 @@ public class Pref {
2627
private static final String KEY_EDITOR_THEME = "editor.theme";
2728
private static final String KEY_EDITOR_TEXT_SIZE = "editor.textSize";
2829

30+
private static final String KEY_ENABLE_SHIZUKU = "KEY_ENABLE_SHIZUKU";
31+
2932
private static SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
3033
@Override
3134
public void onSharedPreferenceChanged(SharedPreferences p, String key) {
@@ -176,4 +179,26 @@ public static boolean haveAdbPermission(Context context) {
176179
.checkPermission("android.permission.WRITE_SECURE_SETTINGS",
177180
context.getPackageName());
178181
}
182+
183+
public static boolean isShizukuEnabled() {
184+
return def().getBoolean(KEY_ENABLE_SHIZUKU, false);
185+
}
186+
187+
public static void setShizukuStatus(Boolean enabled) {
188+
def().edit().putBoolean(KEY_ENABLE_SHIZUKU, enabled).apply();
189+
}
190+
191+
public static void enableAlarmManager() {
192+
def().edit().putString(WorkProviderConstants.ACTIVE_PROVIDER, WorkProviderConstants.ALARM_MANAGER_PROVIDER).apply();
193+
def().edit().putBoolean(getString(R.string.key_enable_alarm_manager), true).apply();
194+
}
195+
196+
public static void enableWorkManager() {
197+
def().edit().putString(WorkProviderConstants.ACTIVE_PROVIDER, WorkProviderConstants.WORK_MANAGER_PROVIDER).apply();
198+
def().edit().putBoolean(getString(R.string.key_enable_alarm_manager), false).apply();
199+
}
200+
201+
public static String getCurrentManager() {
202+
return def().getString(WorkProviderConstants.ACTIVE_PROVIDER, WorkProviderConstants.WORK_MANAGER_PROVIDER);
203+
}
179204
}

app/src/main/java/org/autojs/autojs/timing/TimedTaskScheduler.java

+2-11
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
import android.annotation.SuppressLint;
44
import android.content.Context;
55
import android.content.Intent;
6-
import android.preference.PreferenceManager;
76
import android.util.Log;
87

8+
import org.autojs.autojs.Pref;
99
import org.autojs.autojs.autojs.AutoJs;
1010
import org.autojs.autojs.external.ScriptIntents;
1111
import org.autojs.autojs.timing.work.AlarmManagerProvider;
@@ -123,16 +123,7 @@ public static synchronized void ensureCheckTaskWorks(Context context) {
123123
}
124124

125125
public static WorkProvider getWorkProvider(Context context) {
126-
try {
127-
// 尝试获取默认的类型 失败后设置ALARM_MANAGER作为默认的
128-
PreferenceManager.getDefaultSharedPreferences(context).getString(WorkProviderConstants.ACTIVE_PROVIDER,
129-
WorkProviderConstants.ALARM_MANAGER_PROVIDER);
130-
} catch (Exception e) {
131-
PreferenceManager.getDefaultSharedPreferences(context).edit().putString(WorkProviderConstants.ACTIVE_PROVIDER,
132-
WorkProviderConstants.ALARM_MANAGER_PROVIDER).apply();
133-
}
134-
String currentActive = PreferenceManager.getDefaultSharedPreferences(context)
135-
.getString(WorkProviderConstants.ACTIVE_PROVIDER, WorkProviderConstants.ALARM_MANAGER_PROVIDER);
126+
String currentActive = Pref.getCurrentManager();
136127
if (WorkProviderConstants.WORK_MANAGER_PROVIDER.equals(currentActive)) {
137128
Log.d(LOG_TAG, "当前启用的定时任务方式为WorkManager");
138129
return WorkManagerProvider.getInstance(context);

app/src/main/java/org/autojs/autojs/timing/work/AlarmManagerProvider.java

+1
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ public void runTask(Context context, TimedTask task) {
161161
cancel(task);
162162
}
163163

164+
@SuppressLint("ScheduleExactAlarm")
164165
private void setExactCompat(AlarmManager alarmManager, PendingIntent op, long millis) {
165166
int type = AlarmManager.RTC_WAKEUP;
166167
long gapMillis = millis - System.currentTimeMillis();

app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java

+12-1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@
7272
import org.autojs.autojs.ui.widget.SimpleTextWatcher;
7373

7474
import java.io.File;
75+
import java.io.InputStream;
7576
import java.util.List;
7677

7778
import io.reactivex.Observable;
@@ -95,6 +96,10 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
9596
public static final String EXTRA_READ_ONLY = "readOnly";
9697
public static final String EXTRA_SAVE_ENABLED = "saveEnabled";
9798
public static final String EXTRA_RUN_ENABLED = "runEnabled";
99+
/**
100+
* 限制最大可编辑大小,500kb基本是极限了容易直接卡死,当前可能是其他方式打开
101+
*/
102+
public static final Long MAX_EDITABLE_SIZE = 500 * 1024L;
98103

99104
@ViewById(R.id.editor)
100105
CodeEditor mEditor;
@@ -242,7 +247,13 @@ private Observable<String> handleText(Intent intent) {
242247
@SuppressLint("CheckResult")
243248
private Observable<String> loadUri(final Uri uri) {
244249
mEditor.setProgress(true);
245-
return Observable.fromCallable(() -> PFiles.read(getContext().getContentResolver().openInputStream(uri)))
250+
return Observable.fromCallable(() -> {
251+
InputStream inputStream = getContext().getContentResolver().openInputStream(uri);
252+
if (inputStream.available() > MAX_EDITABLE_SIZE) {
253+
throw new IllegalArgumentException("当前文件过大,请勿使用AutoJS编辑");
254+
}
255+
return PFiles.read(inputStream);
256+
})
246257
.subscribeOn(Schedulers.io())
247258
.observeOn(AndroidSchedulers.mainThread())
248259
.doOnNext(s -> {

app/src/main/java/org/autojs/autojs/ui/main/MainActivity.java

+5-3
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,13 @@
33

44
import android.Manifest;
55
import android.annotation.SuppressLint;
6-
import android.app.Activity;
76
import android.content.Intent;
87
import android.content.pm.PackageManager;
98
import android.net.Uri;
109
import android.os.Build;
1110
import android.os.Bundle;
1211
import android.os.Environment;
1312
import android.provider.Settings;
14-
import android.util.Log;
1513
import android.view.Gravity;
1614
import android.view.Menu;
1715
import android.view.MenuItem;
@@ -25,6 +23,7 @@
2523
import com.stardust.autojs.core.permission.OnRequestPermissionsResultCallback;
2624
import com.stardust.autojs.core.permission.PermissionRequestProxyActivity;
2725
import com.stardust.autojs.core.permission.RequestPermissionCallbacks;
26+
import com.stardust.autojs.shizuku.WrappedShizuku;
2827
import com.stardust.enhancedfloaty.FloatyService;
2928
import com.stardust.pio.PFiles;
3029
import com.stardust.theme.ThemeColorManager;
@@ -108,7 +107,7 @@ protected void onCreate(Bundle savedInstanceState) {
108107
showAnnunciationIfNeeded();
109108
EventBus.getDefault().register(this);
110109
applyDayNightMode();
111-
110+
WrappedShizuku.getInstance().onCreate(BuildConfig.APPLICATION_ID, BuildConfig.VERSION_CODE);
112111
}
113112

114113
@AfterViews
@@ -299,6 +298,9 @@ private int getGrantResult(String permission, String[] permissions, int[] grantR
299298
@Override
300299
protected void onStart() {
301300
super.onStart();
301+
if (Pref.isShizukuEnabled()) {
302+
WrappedShizuku.getInstance().requestPermission();
303+
}
302304
}
303305

304306

0 commit comments

Comments
 (0)