From 6667d0babd288018eb4615a29073b2e4dad21a6b Mon Sep 17 00:00:00 2001 From: Administrator Date: Wed, 9 Jul 2025 15:51:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E6=9C=BA=E5=A4=B1=E8=B4=A5=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E6=89=A7=E8=A1=8C=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/AndroidManifest.xml | 8 + .../com/example/studyapp/MainActivity.java | 190 ++++++++---------- .../example/studyapp/autoJS/AutoJsUtil.java | 9 +- .../studyapp/device/ChangeDeviceInfoUtil.java | 3 +- .../studyapp/device/LoadDeviceCallback.java | 1 + .../example/studyapp/job/ScriptJobService.kt | 104 ++++++++++ .../example/studyapp/job/StartJobService.kt | 109 ++++++++++ .../example/studyapp/utils/CountryCode.java | 24 +++ 8 files changed, 339 insertions(+), 109 deletions(-) create mode 100644 app/src/main/java/com/example/studyapp/job/ScriptJobService.kt create mode 100644 app/src/main/java/com/example/studyapp/job/StartJobService.kt create mode 100644 app/src/main/java/com/example/studyapp/utils/CountryCode.java diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d13d462..3297f2a 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -66,6 +66,14 @@ android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> + + diff --git a/app/src/main/java/com/example/studyapp/MainActivity.java b/app/src/main/java/com/example/studyapp/MainActivity.java index 3367cae..2b2964a 100644 --- a/app/src/main/java/com/example/studyapp/MainActivity.java +++ b/app/src/main/java/com/example/studyapp/MainActivity.java @@ -36,11 +36,13 @@ import androidx.work.WorkManager; import com.example.studyapp.autoJS.AutoJsUtil; import com.example.studyapp.device.ChangeDeviceInfoUtil; +import com.example.studyapp.job.StartJobService; import com.example.studyapp.proxy.ClashUtil; import com.example.studyapp.service.MyAccessibilityService; import com.example.studyapp.task.TaskUtil; import com.example.studyapp.update.ChangeCallBack; import com.example.studyapp.update.UpdateUtil; +import com.example.studyapp.utils.CountryCode; import com.example.studyapp.utils.IpUtil; import com.example.studyapp.utils.LogFileUtil; import com.example.studyapp.utils.ShellUtils; @@ -86,19 +88,6 @@ public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final String PACKAGE_SCHEME = "package:"; - private static final int DEVICE_TYPE = 2; - - // 定义支持的国家代码常量 - private static final class CountryCode { - - static final String US = "US"; - static final String RU = "RU"; - // 默认使用美国 - static final String DEFAULT = US; - } - - // 当前使用的国家代码 - private String currentCountry = CountryCode.DEFAULT; // 初始化 ExecutorService private void initializeExecutorService() { @@ -189,16 +178,6 @@ public class MainActivity extends AppCompatActivity { WorkManager.getInstance(this).enqueue(workRequest); } - // 添加切换国家的方法 - private String switchCountry() { - currentCountry = currentCountry.equals(CountryCode.US) ? - CountryCode.RU : CountryCode.US; - LogFileUtil.logAndWrite(Log.INFO, TAG, - "Switched country to: " + currentCountry, null); - return currentCountry; - } - - private void initializeButtons() { LogFileUtil.logAndWrite(Log.INFO, TAG, "onCreate: Setting up UI components", null); String androidId = getAndroidId(this); @@ -209,7 +188,7 @@ public class MainActivity extends AppCompatActivity { })); setupButton(R.id.disconnectVpnButton, v -> ClashUtil.stopProxy(this)); setupButton(R.id.switchVpnButton, v -> { - ClashUtil.switchProxyGroup("GLOBAL", switchCountry(), "http://127.0.0.1:6170"); + ClashUtil.switchProxyGroup("GLOBAL", CountryCode.switchCountry(), "http://127.0.0.1:6170"); }); setupButton(R.id.resetDeviceInfoButton, v -> ChangeDeviceInfoUtil.resetChangedDeviceInfo(getPackageName(), this)); @@ -274,9 +253,10 @@ public class MainActivity extends AppCompatActivity { if (!isNetworkAvailable(this)) { return; } - - initializeExecutorService(); - executorService.submit(() -> processMainTask(androidId, taskId)); + AutoJsUtil.registerScriptResultReceiver(this); + StartJobService.Companion.onEvent(this); +// initializeExecutorService(); +// executorService.submit(() -> processMainTask(androidId, taskId)); } private void processMainTask(String androidId, String taskId) { @@ -284,91 +264,91 @@ public class MainActivity extends AppCompatActivity { ShellUtils.execRootCmdAndGetResult("pm grant com.example.studyapp android.permission.INTERACT_ACROSS_USERS"); ShellUtils.execRootCmdAndGetResult("pm grant com.example.studyapp android.permission.WRITE_SECURE_SETTINGS"); ShellUtils.execRootCmdAndGetResult("pm setenforce 0"); - initializeDeviceAndRunScript(); - processScriptResults(androidId, taskId); +// initializeDeviceAndRunScript(); +// processScriptResults(androidId, taskId); } catch (Exception e) { LogFileUtil.logAndWrite(Log.ERROR, TAG, "Unexpected task error", e); } } - private void initializeDeviceAndRunScript() { - ChangeDeviceInfoUtil.getAddDeviceInfo(currentCountry.toUpperCase(), DEVICE_TYPE, - (bigoDevice, afDevice) -> { - startProxyVpn(this); - UpdateUtil.INSTANCE.changeDevice(getPackageName(), bigoDevice, afDevice, new ChangeCallBack() { - @Override - public void changeSuccess() { - AutoJsUtil.runAutojsScript(MainActivity.this); - } - - @Override - public void changeFailed() { - LogFileUtil.logAndWrite(Log.ERROR, TAG, "Change device failed", null); - } - }); -// ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), this, -// bigoDevice, afDevice); -// AutoJsUtil.runAutojsScript(this); - }); - AutoJsUtil.registerScriptResultReceiver(this); - } +// private void initializeDeviceAndRunScript() { +// ChangeDeviceInfoUtil.getAddDeviceInfo(currentCountry.toUpperCase(), DEVICE_TYPE, +// (bigoDevice, afDevice) -> { +// startProxyVpn(this); +// UpdateUtil.INSTANCE.changeDevice(getPackageName(), bigoDevice, afDevice, new ChangeCallBack() { +// @Override +// public void changeSuccess() { +// AutoJsUtil.runAutojsScript(MainActivity.this); +// } +// +// @Override +// public void changeFailed() { +// LogFileUtil.logAndWrite(Log.ERROR, TAG, "Change device failed", null); +// } +// }); +//// ChangeDeviceInfoUtil.changeDeviceInfo(getPackageName(), this, +//// bigoDevice, afDevice); +//// AutoJsUtil.runAutojsScript(this); +// }); +// AutoJsUtil.registerScriptResultReceiver(this); +// } - private void processScriptResults(String androidId, String taskId) { - while (isRunning) { - try { - String currentScriptResult = scriptResultQueue.take(); - if (!isRunning) { - break; - } - - processScriptResult(androidId, taskId, currentScriptResult); - LogFileUtil.logAndWrite(Log.DEBUG, TAG, "Script result processed: " + currentScriptResult, null); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - LogFileUtil.logAndWrite(Log.ERROR, TAG, "Thread interrupted while waiting", e); - break; - } catch (Exception e) { - LogFileUtil.logAndWrite(Log.ERROR, TAG, "Error processing script result", e); - } - } - } - - private void processScriptResult(String androidId, String taskId, String result) { - - ChangeDeviceInfoUtil.getAddDeviceInfo(currentCountry.toUpperCase(), DEVICE_TYPE, - (bigoDevice, afDevice) -> { - try { - updateDeviceAndExecuteTask(androidId, taskId, result, bigoDevice, afDevice); - } catch (Exception e) { - LogFileUtil.logAndWrite(Log.ERROR, TAG, "Device info change error", e); - } - }); - } - - - private void updateDeviceAndExecuteTask(String androidId, String taskId, - String result, JSONObject bigoDevice, JSONObject afDevice) { - startProxyVpn(this); - UpdateUtil.INSTANCE.changeDevice(result, bigoDevice, afDevice,new ChangeCallBack() { - @Override - public void changeSuccess() { - AutoJsUtil.runAutojsScript(MainActivity.this); - - TaskUtil.execSaveTask(MainActivity.this, androidId, taskId, result, IpUtil.fetchGeoInfo()); - try { - infoUpload(MainActivity.this, androidId, result); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - @Override - public void changeFailed() { - LogFileUtil.logAndWrite(Log.ERROR, TAG, "Change device failed", null); - } - }); - } +// private void processScriptResults(String androidId, String taskId) { +// while (isRunning) { +// try { +// String currentScriptResult = scriptResultQueue.take(); +// if (!isRunning) { +// break; +// } +// +// processScriptResult(androidId, taskId, currentScriptResult); +// LogFileUtil.logAndWrite(Log.DEBUG, TAG, "Script result processed: " + currentScriptResult, null); +// } catch (InterruptedException e) { +// Thread.currentThread().interrupt(); +// LogFileUtil.logAndWrite(Log.ERROR, TAG, "Thread interrupted while waiting", e); +// break; +// } catch (Exception e) { +// LogFileUtil.logAndWrite(Log.ERROR, TAG, "Error processing script result", e); +// } +// } +// } +// +// private void processScriptResult(String androidId, String taskId, String result) { +// +// ChangeDeviceInfoUtil.getAddDeviceInfo(currentCountry.toUpperCase(), DEVICE_TYPE, +// (bigoDevice, afDevice) -> { +// try { +// updateDeviceAndExecuteTask(androidId, taskId, result, bigoDevice, afDevice); +// } catch (Exception e) { +// LogFileUtil.logAndWrite(Log.ERROR, TAG, "Device info change error", e); +// } +// }); +// } +// +// +// private void updateDeviceAndExecuteTask(String androidId, String taskId, +// String result, JSONObject bigoDevice, JSONObject afDevice) { +// startProxyVpn(this); +// UpdateUtil.INSTANCE.changeDevice(result, bigoDevice, afDevice,new ChangeCallBack() { +// @Override +// public void changeSuccess() { +// AutoJsUtil.runAutojsScript(MainActivity.this); +// +// TaskUtil.execSaveTask(MainActivity.this, androidId, taskId, result, IpUtil.fetchGeoInfo()); +// try { +// infoUpload(MainActivity.this, androidId, result); +// } catch (IOException e) { +// throw new RuntimeException(e); +// } +// } +// @Override +// public void changeFailed() { +// LogFileUtil.logAndWrite(Log.ERROR, TAG, "Change device failed", null); +// } +// }); +// } public static final LinkedBlockingQueue scriptResultQueue = new LinkedBlockingQueue<>(1); @@ -384,7 +364,7 @@ public class MainActivity extends AppCompatActivity { try { ClashUtil.startProxy(context); - ClashUtil.switchProxyWithPort(switchCountry()); + ClashUtil.switchProxyWithPort(CountryCode.switchCountry()); ClashUtil.switchProxyGroup("PROXY", "my-socks5-proxy", "http://127.0.0.1:6170"); } catch (Exception e) { LogFileUtil.logAndWrite(Log.ERROR, TAG, "startProxyVpn: Failed to start VPN", e); diff --git a/app/src/main/java/com/example/studyapp/autoJS/AutoJsUtil.java b/app/src/main/java/com/example/studyapp/autoJS/AutoJsUtil.java index e71603c..14a35d5 100644 --- a/app/src/main/java/com/example/studyapp/autoJS/AutoJsUtil.java +++ b/app/src/main/java/com/example/studyapp/autoJS/AutoJsUtil.java @@ -16,6 +16,7 @@ import android.widget.Toast; import androidx.core.content.ContextCompat; import com.example.studyapp.MainActivity; +import com.example.studyapp.job.ScriptJobService; import com.example.studyapp.utils.LogFileUtil; import com.example.studyapp.utils.ShellUtils; import java.io.File; @@ -71,11 +72,15 @@ public class AutoJsUtil { LogFileUtil.logAndWrite(android.util.Log.DEBUG, "MainActivity", "----脚本运行结束通知一次------; 当前线程:" + Thread.currentThread().getName(), null); String scriptResult = intent.getStringExtra(SCRIPT_RESULT_KEY); try { - MainActivity.scriptResultQueue.put(scriptResult); // 将结果加入队列 + if (scriptResult == null){ + scriptResult = ""; + } + ScriptJobService.Companion.onEvent(context, scriptResult); +// MainActivity.scriptResultQueue.put(scriptResult); // 将结果加入队列 LogFileUtil.logAndWrite(android.util.Log.DEBUG, "MainActivity", "----收到result------;" + scriptResult, null); // AutoJsUtil.flag = true; // 唤醒 // taskLock.notifyAll(); - } catch (InterruptedException e) { + } catch (Exception e) { Thread.currentThread().interrupt(); // 处理中断 } } diff --git a/app/src/main/java/com/example/studyapp/device/ChangeDeviceInfoUtil.java b/app/src/main/java/com/example/studyapp/device/ChangeDeviceInfoUtil.java index 8d72cea..3c292da 100644 --- a/app/src/main/java/com/example/studyapp/device/ChangeDeviceInfoUtil.java +++ b/app/src/main/java/com/example/studyapp/device/ChangeDeviceInfoUtil.java @@ -64,10 +64,9 @@ public class ChangeDeviceInfoUtil { JSONObject bigoDeviceObject = new JSONObject(bigoJson).optJSONObject("device"); JSONObject afDeviceObject = new JSONObject(afJson).optJSONObject("device"); callback.onLoadDeviceInfo(bigoDeviceObject, afDeviceObject); - } catch (IOException | JSONException e) { - LogFileUtil.logAndWrite(android.util.Log.ERROR, LOG_TAG, "Error occurred during initialization", e); } catch (Exception e) { LogFileUtil.logAndWrite(android.util.Log.ERROR, LOG_TAG, "Error occurred during initialization", e); + callback.onLoadDeviceError("Error occurred during initialization"); } }); } diff --git a/app/src/main/java/com/example/studyapp/device/LoadDeviceCallback.java b/app/src/main/java/com/example/studyapp/device/LoadDeviceCallback.java index 317f243..754ff83 100644 --- a/app/src/main/java/com/example/studyapp/device/LoadDeviceCallback.java +++ b/app/src/main/java/com/example/studyapp/device/LoadDeviceCallback.java @@ -4,4 +4,5 @@ import org.json.JSONObject; public interface LoadDeviceCallback{ void onLoadDeviceInfo(JSONObject bigoDevice, JSONObject afDevice); + void onLoadDeviceError(String error); } diff --git a/app/src/main/java/com/example/studyapp/job/ScriptJobService.kt b/app/src/main/java/com/example/studyapp/job/ScriptJobService.kt new file mode 100644 index 0000000..78bbfd3 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/job/ScriptJobService.kt @@ -0,0 +1,104 @@ +package com.example.studyapp.job + +import android.content.Context +import android.content.Intent +import android.os.Handler +import android.os.Looper +import android.util.Log +import androidx.core.app.JobIntentService +import com.example.studyapp.autoJS.AutoJsUtil +import com.example.studyapp.device.ChangeDeviceInfoUtil +import com.example.studyapp.device.LoadDeviceCallback +import com.example.studyapp.proxy.ClashUtil +import com.example.studyapp.task.TaskUtil +import com.example.studyapp.update.ChangeCallBack +import com.example.studyapp.update.UpdateUtil.changeDevice +import com.example.studyapp.utils.CountryCode +import com.example.studyapp.utils.IpUtil +import com.example.studyapp.utils.LogFileUtil +import org.json.JSONObject +import java.util.Locale +import java.util.UUID + +class ScriptJobService : JobIntentService() { + + override fun onHandleWork(intent: Intent) { + execute(callback = object : JobCallback { + override fun onJobFailed() { + Handler(Looper.getMainLooper()).postDelayed({ + StartJobService.onEvent(applicationContext) + }, 1000 * 60 * 5) + } + }) + } + + fun execute(callback: JobCallback) { + val taskId = UUID.randomUUID().toString() + runCatching { + ChangeDeviceInfoUtil.getAddDeviceInfo( + CountryCode.currentCountry.uppercase(Locale.getDefault()), CountryCode.DEVICE_TYPE, + object :LoadDeviceCallback { + override fun onLoadDeviceInfo( + bigoDevice: JSONObject?, + afDevice: JSONObject? + ) { + ClashUtil.startProxy(applicationContext) + ClashUtil.switchProxyWithPort(CountryCode.switchCountry()) + ClashUtil.switchProxyGroup("PROXY", "my-socks5-proxy", "http://127.0.0.1:6170") + changeDevice(packageName, bigoDevice, afDevice, object : ChangeCallBack { + override fun changeSuccess() { + runCatching { + AutoJsUtil.runAutojsScript(applicationContext) + TaskUtil.execSaveTask( + applicationContext, + androidId, + taskId, + name, + IpUtil.fetchGeoInfo() + ) + TaskUtil.infoUpload(applicationContext, androidId, name) + }.onFailure { + callback.onJobFailed() + } + } + + override fun changeFailed() { + LogFileUtil.logAndWrite( + Log.ERROR, + TAG, + "Change device failed", + null + ) + callback.onJobFailed() + } + }) + } + + override fun onLoadDeviceError(error: String?) { + callback.onJobFailed() + } + }) + }.onFailure { + callback.onJobFailed() + } + } + + companion object { + private const val TAG = "ScriptJobService" + private const val jobId = 102 + private const val androidId = "FyZqWrStUvOpKlMn" + + private var name = "" + + fun onEvent(context: Context, packageName: String) { + name = packageName + enqueueWork( + context, + ScriptJobService::class.java, jobId, Intent( + context, + ScriptJobService::class.java + ) + ) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/studyapp/job/StartJobService.kt b/app/src/main/java/com/example/studyapp/job/StartJobService.kt new file mode 100644 index 0000000..22739f1 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/job/StartJobService.kt @@ -0,0 +1,109 @@ +package com.example.studyapp.job + +import android.content.Context +import android.content.Intent +import android.os.Handler +import android.os.Looper +import android.util.Log +import androidx.core.app.JobIntentService +import com.example.studyapp.autoJS.AutoJsUtil +import com.example.studyapp.device.ChangeDeviceInfoUtil +import com.example.studyapp.device.LoadDeviceCallback +import com.example.studyapp.proxy.ClashUtil +import com.example.studyapp.update.ChangeCallBack +import com.example.studyapp.update.UpdateUtil.changeDevice +import com.example.studyapp.utils.CountryCode +import com.example.studyapp.utils.LogFileUtil +import com.example.studyapp.utils.ShellUtils +import org.json.JSONObject +import java.util.Locale + +/** + * 监听任务 + */ +interface JobCallback { + fun onJobFailed() +} +class StartJobService : JobIntentService() { + override fun onHandleWork(intent: Intent) { + if (running) { + return + } + setRunning(true) + exec( + callback = object : JobCallback { + override fun onJobFailed() { + Handler(Looper.getMainLooper()).postDelayed({ + onEvent(this@StartJobService) + }, 1000 * 5) + } + } + ) + } + + protected fun exec(callback: JobCallback) { + try { + ShellUtils.execRootCmdAndGetResult("pm grant com.example.studyapp android.permission.INTERACT_ACROSS_USERS") + ShellUtils.execRootCmdAndGetResult("pm grant com.example.studyapp android.permission.WRITE_SECURE_SETTINGS") + ShellUtils.execRootCmdAndGetResult("pm setenforce 0") + ChangeDeviceInfoUtil.getAddDeviceInfo( + CountryCode.currentCountry.uppercase(Locale.getDefault()), CountryCode.DEVICE_TYPE, + object :LoadDeviceCallback{ + override fun onLoadDeviceInfo( + bigoDevice: JSONObject?, + afDevice: JSONObject? + ) { + ClashUtil.startProxy(applicationContext) + ClashUtil.switchProxyWithPort(CountryCode.switchCountry()) + ClashUtil.switchProxyGroup("PROXY", "my-socks5-proxy", "http://127.0.0.1:6170") + changeDevice(packageName, bigoDevice, afDevice, object : ChangeCallBack { + override fun changeSuccess() { + AutoJsUtil.runAutojsScript(applicationContext) + setRunning(false) + } + + override fun changeFailed() { + LogFileUtil.logAndWrite( + Log.ERROR, + TAG, + "Change device failed", + null + ) + callback.onJobFailed() + setRunning(false) + } + }) + } + + override fun onLoadDeviceError(error: String?) { + callback.onJobFailed() + setRunning(false) + } + + }) + } catch (e: Exception) { + e.printStackTrace() + } + } + + companion object { + private const val TAG = "StartJobService" + private const val jobId = 101 + + private var running = false + + fun onEvent(context: Context) { + enqueueWork( + context, + StartJobService::class.java, jobId, Intent( + context, + StartJobService::class.java + ) + ) + } + + fun setRunning(runningV: Boolean) { + running = runningV + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/example/studyapp/utils/CountryCode.java b/app/src/main/java/com/example/studyapp/utils/CountryCode.java new file mode 100644 index 0000000..67251f2 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/utils/CountryCode.java @@ -0,0 +1,24 @@ +package com.example.studyapp.utils; + +import android.util.Log; + +import com.example.studyapp.MainActivity; + +public class CountryCode { + public static final int DEVICE_TYPE = 2; + static final String US = "US"; + static final String RU = "RU"; + // 默认使用美国 + static final String DEFAULT = US; + + // 当前使用的国家代码 + public static String currentCountry = DEFAULT; + + public static String switchCountry() { + currentCountry = currentCountry.equals(US) ? + RU : US; + LogFileUtil.logAndWrite(Log.INFO, "TAG", + "Switched country to: " + currentCountry, null); + return currentCountry; + } +}