90 lines
2.8 KiB
Java
90 lines
2.8 KiB
Java
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();
|
||
}
|
||
}
|