Files
VibeCoding/AdbLoopbackController/app/src/main/java/com/ttstd/adbloopback/AdbManager.java

90 lines
2.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package com.ttstd.adbloopback;
import com.ttstd.adbloopback.adb.AdbConnection;
import com.ttstd.adbloopback.adb.AdbKeyPair;
import com.ttstd.adbloopback.adb.AdbPairing;
import com.ttstd.adbloopback.adb.AdbStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
/**
* ADB 管理器:封装密钥持久化、配对、连接及 Shell 指令执行。
* 它是上层 UI 与底层 ADB 协议库之间的桥梁。
*/
public class AdbManager {
private final File privateKeyFile;
private final File publicKeyFile;
private AdbKeyPair keyPair;
private AdbConnection connection;
public AdbManager(File filesDir) {
this.privateKeyFile = new File(filesDir, "adb_private.key");
this.publicKeyFile = new File(filesDir, "adb_public.key");
loadOrCreateKeyPair();
}
private void loadOrCreateKeyPair() {
try {
if (privateKeyFile.exists() && publicKeyFile.exists()) {
keyPair = AdbKeyPair.read(privateKeyFile, publicKeyFile);
} else {
keyPair = AdbKeyPair.generate();
keyPair.write(privateKeyFile, publicKeyFile);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/** 发起无线调试配对TLS-PSK */
public void pair(int port, String pairingCode) throws Exception {
AdbPairing.pair("127.0.0.1", port, pairingCode, keyPair);
}
/** 连接无线调试主端口 */
public void connect(int port) throws Exception {
if (connection != null) {
try { connection.close(); } catch (Exception ignored) {}
}
connection = AdbConnection.connect("127.0.0.1", port, keyPair);
}
/** 断开连接 */
public void disconnect() {
if (connection != null) {
try {
connection.close();
} catch (IOException e) {
e.printStackTrace();
}
connection = null;
}
}
/** 执行 Shell 命令并获取全部输出 */
public String execShell(String command) throws Exception {
if (connection == null || !connection.isConnected()) {
throw new IOException("ADB 未连接");
}
AdbStream stream = connection.open("shell:" + command);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
byte[] data;
while ((data = stream.read()) != null) {
bos.write(data);
}
stream.close();
return bos.toString("UTF-8");
}
/** 快速发送点击指令 */
public void tap(int x, int y) throws Exception {
execShell("input tap " + x + " " + y);
}
public boolean isConnected() {
return connection != null && connection.isConnected();
}
}