From c93475533d15594b20a130150089470b7b64af23 Mon Sep 17 00:00:00 2001 From: yjj38 Date: Thu, 22 May 2025 18:13:34 +0800 Subject: [PATCH] Add VPN service, Shell utility, and server communication support Introduced a `ProxyVpnService` to manage a VPN connection and a `ShellUtils` utility for executing commands. Enabled script result communication with the server using `CloudPhoneManageService` via Retrofit. Updated permissions, dependencies, and MainActivity to support these features. --- .idea/deploymentTargetSelector.xml | 3 + .idea/gradle.xml | 1 - app/build.gradle | 9 + app/src/main/AndroidManifest.xml | 10 + .../com/example/studyapp/MainActivity.java | 149 ++++++++++++++- .../com/example/studyapp/ProxyVpnService.java | 44 +++++ .../studyapp/request/ScriptResultRequest.java | 18 ++ .../service/CloudPhoneManageService.java | 15 ++ .../example/studyapp/utils/DeviceUtils.java | 27 +++ .../example/studyapp/utils/ShellUtils.java | 172 ++++++++++++++++++ app/src/main/res/mipmap-hdpi/box.png | Bin 11958 -> 26086 bytes settings.gradle | 3 +- 12 files changed, 447 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/example/studyapp/ProxyVpnService.java create mode 100644 app/src/main/java/com/example/studyapp/request/ScriptResultRequest.java create mode 100644 app/src/main/java/com/example/studyapp/service/CloudPhoneManageService.java create mode 100644 app/src/main/java/com/example/studyapp/utils/DeviceUtils.java create mode 100644 app/src/main/java/com/example/studyapp/utils/ShellUtils.java diff --git a/.idea/deploymentTargetSelector.xml b/.idea/deploymentTargetSelector.xml index b268ef3..33b91aa 100644 --- a/.idea/deploymentTargetSelector.xml +++ b/.idea/deploymentTargetSelector.xml @@ -5,6 +5,9 @@ + + \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 7b3006b..639c779 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -13,7 +13,6 @@ - diff --git a/app/build.gradle b/app/build.gradle index 4748370..1586aec 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -37,4 +37,13 @@ dependencies { testImplementation libs.junit androidTestImplementation libs.ext.junit androidTestImplementation libs.espresso.core + // Retrofit 核心库 + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + + // 如果需要用 Gson 作为 JSON 序列化/反序列化工具,还需添加以下依赖 + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' + + // 如果需要 RxJava 支持(可选) + implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' + } \ No newline at end of file diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 56fd920..c11b271 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -2,6 +2,16 @@ + + + + + + + + + + vpnRequestLauncher; + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); + vpnRequestLauncher = registerForActivityResult( + new ActivityResultContracts.StartActivityForResult(), + result -> { + if (result.getResultCode() == RESULT_OK) { + startProxyVpnService(); + } else { + Toast.makeText(this, "VPN setup failed", Toast.LENGTH_SHORT).show(); + new AlertDialog.Builder(this) + .setTitle("VPN 配置失败") + .setMessage("未能成功配置 VPN。要重试吗?") + .setPositiveButton("重试", (dialog, which) -> startProxyVpn(this)) + .setNegativeButton("取消", null) + .show(); + } + } + ); + // 检查存储权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { @@ -30,6 +68,8 @@ public class MainActivity extends AppCompatActivity { REQUEST_CODE_STORAGE_PERMISSION); } + startProxyVpn(this); + // 查找按钮对象 Button runScriptButton = findViewById(R.id.run_script_button); if (runScriptButton != null) { @@ -39,21 +79,46 @@ public class MainActivity extends AppCompatActivity { } } + private void startProxyVpn(Context context) { // 避免强制依赖 MainActivity + Intent intent = VpnService.prepare(context); + if (intent != null) { + vpnRequestLauncher.launch(intent); + } else { + startProxyVpnService(); + } + } + + private void startProxyVpnService() { + Intent serviceIntent = new Intent(this, ProxyVpnService.class); + startService(serviceIntent); + } + @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_CODE_STORAGE_PERMISSION) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { + permissionHandler(); Toast.makeText(this, "Permissions granted", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, "Permission denied", Toast.LENGTH_SHORT).show(); + // 可选择终止操作或退出程序 + finish(); // 假设应用需要此权限才能运行 } } } + @Override + protected void onDestroy() { + super.onDestroy(); + if (scriptResultReceiver != null) { + unregisterReceiver(scriptResultReceiver); + } + } + private void runAutojsScript() { // 定义脚本文件路径 - File scriptFile = new File(getExternalFilesDir(null), "脚本/adsense.js"); + File scriptFile = new File(Environment.getExternalStorageDirectory(), "脚本/chromium.js"); // 检查文件是否存在 if (!scriptFile.exists()) { @@ -75,6 +140,8 @@ public class MainActivity extends AppCompatActivity { // 启动 Auto.js try { + // 模拟:通过广播监听脚本运行结果 + registerScriptResultReceiver(); // 注册结果回调监听(假设脚本通过广播返回结果) startActivity(intent); Toast.makeText(this, "Running script: " + scriptFile.getAbsolutePath(), Toast.LENGTH_SHORT).show(); } catch (Exception e) { @@ -93,4 +160,82 @@ public class MainActivity extends AppCompatActivity { return false; } } + + private void registerScriptResultReceiver() { + // 创建广播接收器 + scriptResultReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + // 获取脚本运行结果(假设结果通过 "result" 键返回) + String scriptResult = intent.getStringExtra("result"); + if (scriptResult != null && !scriptResult.isEmpty()) { + // 处理结果并发送给服务端 + sendResultToServer(scriptResult); + } + } + }; + + // 注册接收器(假设 Auto.js 广播动作为 "org.autojs.SCRIPT_FINISHED") + IntentFilter filter = new IntentFilter("org.autojs.SCRIPT_FINISHED"); + + // 使用 ContextCompat.registerReceiver 注册,并设置为 RECEIVER_EXPORTED + ContextCompat.registerReceiver( + this, // 当前上下文 + scriptResultReceiver, // 自定义的 BroadcastReceiver + filter, // IntentFilter + ContextCompat.RECEIVER_EXPORTED // 设置为非导出广播接收器 + ); + } + + private void sendResultToServer(String scriptResult) { + // 使用 Retrofit 或 HttpURLConnection 实现服务端 API 调用 + Toast.makeText(this, "Sending result to server: " + scriptResult, Toast.LENGTH_SHORT).show(); + + // 示例:用 Retrofit 设置服务端请求 + // 创建 Retrofit 的实例 + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("https://your-server-url.com/") // 替换为服务端 API 地址 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + // 定义 API 接口 + CloudPhoneManageService api = retrofit.create(CloudPhoneManageService.class); + + // 构建请求体并发送请求 + Call call = api.sendScriptResult(new ScriptResultRequest(scriptResult)); // 假设参数是 com.example.studyapp.request.ScriptResultRequest 对象 + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + Toast.makeText(MainActivity.this, "Result sent successfully", Toast.LENGTH_SHORT).show(); + } else { + Toast.makeText(MainActivity.this, "Failed to send result: " + response.code(), Toast.LENGTH_SHORT).show(); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + Toast.makeText(MainActivity.this, "Error sending result: " + t.getMessage(), Toast.LENGTH_SHORT).show(); + } + }); + } + + private void grantPermission(String name) + { + ShellUtils.execRootCmd("pm grant " + this.getPackageName() + " " + name); + } + private void appopsAllow(String name) + { + ShellUtils.execRootCmd("appops set " + this.getPackageName() + " " + name + " allow"); + } + private void permissionHandler() { + grantPermission("android.permission.SYSTEM_ALERT_WINDOW"); + grantPermission("android.permission.FOREGROUND_SERVICE"); + grantPermission("android.permission.FOREGROUND_SERVICE_MEDIA_PROJECTION"); + grantPermission("android.permission.WRITE_SECURE_SETTINGS"); + grantPermission("android.permission.READ_EXTERNAL_STORAGE"); + grantPermission("android.permission.WRITE_EXTERNAL_STORAGE"); + appopsAllow("MANAGE_EXTERNAL_STORAGE"); + } + } \ No newline at end of file diff --git a/app/src/main/java/com/example/studyapp/ProxyVpnService.java b/app/src/main/java/com/example/studyapp/ProxyVpnService.java new file mode 100644 index 0000000..02b8573 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/ProxyVpnService.java @@ -0,0 +1,44 @@ +package com.example.studyapp; + +import android.content.Intent; +import android.net.VpnService; +import android.os.ParcelFileDescriptor; + +import java.io.IOException; + +public class ProxyVpnService extends VpnService { + private ParcelFileDescriptor vpnInterface; + + @Override + public void onCreate() { + super.onCreate(); + Builder builder = new Builder(); + try { + builder.addAddress("10.0.2.15", 24); // 配置虛擬 IP + builder.addRoute("0.0.0.0", 0); // 配置攔截所有流量的路由 + builder.setSession("Proxy VPN Service"); + builder.addDnsServer("8.8.8.8"); // 設置 DNS + vpnInterface = builder.establish(); // 啟動 VPN 通道,保存接口描述符 + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void onDestroy() { + super.onDestroy(); + if (vpnInterface != null) { + try { + vpnInterface.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + @Override + public int onStartCommand(Intent intent, int flags, int startId) { + // 在实际实现中可能需要处理 Intent 数据 + return START_STICKY; + } +} diff --git a/app/src/main/java/com/example/studyapp/request/ScriptResultRequest.java b/app/src/main/java/com/example/studyapp/request/ScriptResultRequest.java new file mode 100644 index 0000000..f98c185 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/request/ScriptResultRequest.java @@ -0,0 +1,18 @@ +package com.example.studyapp.request; + +// 这是发送到服务端的请求体(JSON 格式) +public class ScriptResultRequest { + private String result; + + public ScriptResultRequest(String result) { + this.result = result; + } + + public String getResult() { + return result; + } + + public void setResult(String result) { + this.result = result; + } +} diff --git a/app/src/main/java/com/example/studyapp/service/CloudPhoneManageService.java b/app/src/main/java/com/example/studyapp/service/CloudPhoneManageService.java new file mode 100644 index 0000000..f02a52c --- /dev/null +++ b/app/src/main/java/com/example/studyapp/service/CloudPhoneManageService.java @@ -0,0 +1,15 @@ +package com.example.studyapp.service; + +import com.example.studyapp.request.ScriptResultRequest; + +import retrofit2.Call; +import retrofit2.http.Body; +import retrofit2.http.POST; + +public interface CloudPhoneManageService { + + // 假设服务端接口接收 POST 请求 + @POST("/api/script/result") + Call sendScriptResult(@Body ScriptResultRequest request); + +} diff --git a/app/src/main/java/com/example/studyapp/utils/DeviceUtils.java b/app/src/main/java/com/example/studyapp/utils/DeviceUtils.java new file mode 100644 index 0000000..6cc7a80 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/utils/DeviceUtils.java @@ -0,0 +1,27 @@ +package com.example.studyapp.utils; + +public class DeviceUtils { + // 加载本地库 + static { + try { + System.loadLibrary("native"); + } catch (UnsatisfiedLinkError e) { + e.printStackTrace(); + } + } + + /** 设置设备ID */ + public static native void setDeviceId(String deviceId); + + /** 更新Boot ID */ + public static native void updateBootId(String newBootId); + + /** 获取系统信息 */ + public static native long[] getSysInfo(); + + /** 修改CPU信息,需系统权限 */ + public static native boolean cpuInfoChange(String path); + + /** 修改内存大小,需系统权限 */ + public static native boolean changeMemSize(String path); +} \ No newline at end of file diff --git a/app/src/main/java/com/example/studyapp/utils/ShellUtils.java b/app/src/main/java/com/example/studyapp/utils/ShellUtils.java new file mode 100644 index 0000000..23c6387 --- /dev/null +++ b/app/src/main/java/com/example/studyapp/utils/ShellUtils.java @@ -0,0 +1,172 @@ +package com.example.studyapp.utils; + +import java.io.BufferedReader; +import android.util.Log; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.OutputStream; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +public class ShellUtils { + + public static void exec(String cmd) { + try { + Log.e("ShellUtils", String.format("exec %s", cmd)); + Process process = Runtime.getRuntime().exec(cmd); + process.waitFor(); + } catch (Exception e) { + } + } + + public static int getPid(Process p) { + int pid = -1; + try { + Field f = p.getClass().getDeclaredField("pid"); + f.setAccessible(true); + pid = f.getInt(p); + f.setAccessible(false); + } catch (Throwable e) { + pid = -1; + } + return pid; + } + + public static boolean hasBin(String binName) { + if (!binName.matches("^[a-zA-Z0-9._-]+$")) { + throw new IllegalArgumentException("Invalid bin name"); + } + + String[] paths = System.getenv("PATH").split(":"); + for (String path : paths) { + File file = new File(path + File.separator + binName); + try { + if (file.exists() && file.canExecute()) { + return true; + } + } catch (SecurityException e) { + Log.e("hasBin", "Security exception occurred: " + e.getMessage()); + } + } + return false; + } + + public static String execRootCmdAndGetResult(String cmd) { + if (cmd == null || cmd.trim().isEmpty() || !isCommandSafe(cmd)) { + Log.e("ShellUtils", "Unsafe or empty command. Aborting execution."); + return null; + } + + Process process = null; + OutputStream os = null; + BufferedReader br = null; + try { + if (hasBin("su")) { + Log.e("ShellUtils", "Attempting to execute command: " + cmd); + process = Runtime.getRuntime().exec("su"); + } else if (hasBin("xu")) { + process = Runtime.getRuntime().exec("xu"); + } else if (hasBin("vu")) { + process = Runtime.getRuntime().exec("vu"); + } else { + process = Runtime.getRuntime().exec("sh"); + } + + os = process.getOutputStream(); + os.write((cmd + "\n").getBytes()); + os.write(("exit\n").getBytes()); + os.flush(); + + // Handle error stream on a separate thread + InputStream errorStream = process.getErrorStream(); + new Thread(() -> { + try (BufferedReader errorReader = new BufferedReader(new InputStreamReader(errorStream))) { + String errorLine; + while ((errorLine = errorReader.readLine()) != null) { + Log.e("ShellUtils", "Error: " + errorLine); + } + } catch (IOException e) { + e.printStackTrace(); + } + }).start(); + + process.waitFor(); + br = new BufferedReader(new InputStreamReader(process.getInputStream())); + StringBuilder sb = new StringBuilder(); + String line; + while ((line = br.readLine()) != null) { + sb.append(line).append("\n"); + } + return sb.toString(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (os != null) { + try { + os.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (br != null) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if (process != null) { + process.destroy(); + } + } + return null; + } + + public static void execRootCmd(String cmd) { + if (!isCommandSafe(cmd)) { + Log.e("ShellUtils", "Unsafe command, aborting."); + return; + } + List cmds = new ArrayList<>(); + cmds.add(cmd); + execRootCmds(cmds); + } + + private static boolean isCommandSafe(String cmd) { + return cmd.matches("^[a-zA-Z0-9._/:\\- ]+$"); + } + + public static void execRootCmds(List cmds) { + Process process = null; + try { + if (hasBin("su")) { + process = Runtime.getRuntime().exec("su"); + } else if (hasBin("xu")) { + process = Runtime.getRuntime().exec("xu"); + } else if (hasBin("vu")) { + process = Runtime.getRuntime().exec("vu"); + } else { + process = Runtime.getRuntime().exec("sh"); + } + + try (OutputStream os = process.getOutputStream()) { + for (String cmd : cmds) { + Log.e("ShellUtils", "Executing command"); + os.write((cmd + "\n").getBytes()); + } + os.write("exit\n".getBytes()); + os.flush(); + } + process.waitFor(); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (process != null) { + process.destroy(); + } + } + } +} diff --git a/app/src/main/res/mipmap-hdpi/box.png b/app/src/main/res/mipmap-hdpi/box.png index 7bb42a8c50b1069ce56230ffad62437f9b3cc80b..2e40e33fb2774176d6bc1ad1bdab005d2cae43a9 100644 GIT binary patch literal 26086 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 a!v7y=080*S?-Wh|0000Ai=c+cXvulu@);o zpirT-xBrJbbKmdThn=18cRy!ec4lYK`Mdsi2S8&4HUt9*2mkGCod3=VB>E=<{%?>F-y
;jcGf`QlhzF@P1Br8 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 IlfN7P2V3v)cK`qY diff --git a/settings.gradle b/settings.gradle index 9b4d0b9..cba15fe 100644 --- a/settings.gradle +++ b/settings.gradle @@ -12,10 +12,11 @@ pluginManagement { } } dependencyResolutionManagement { - repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) + repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS) repositories { google() mavenCentral() + mavenLocal() } }