搜索安装包

This commit is contained in:
2025-08-01 17:53:10 +08:00
parent 6cdb19d8a0
commit 852dd50f73
7 changed files with 162 additions and 224 deletions

View File

@@ -53,6 +53,8 @@ public class Main extends Service {
private final ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
private final ExecutorService networkExecutor = Executors.newFixedThreadPool(2);
private String packageNames = "{}";
// ================= 服务生命周期 =================
@Override
public IBinder onBind(Intent intent) {
@@ -92,6 +94,9 @@ public class Main extends Service {
scheduler.scheduleAtFixedRate(this::checkPendingMessages,
RETRY_INTERVAL, RETRY_INTERVAL, TimeUnit.MILLISECONDS);
// 启动应用包检测
printInstalledPackages();
return START_STICKY;
}
@@ -109,6 +114,63 @@ public class Main extends Service {
}
}
// 根据包名获取应用名称
private String getAppName(String packageName) {
try {
android.content.pm.PackageManager pm = getPackageManager();
android.content.pm.ApplicationInfo appInfo = pm.getApplicationInfo(packageName, 0);
return pm.getApplicationLabel(appInfo).toString();
} catch (android.content.pm.PackageManager.NameNotFoundException e) {
Log.e(TAG, "应用名称获取失败,包名: " + packageName + ", 错误: " + e.getMessage());
return "未知应用";
}
}
// ================= 应用包名检测方法 =================
private void printInstalledPackages() {
try {
// 获取包管理器
android.content.pm.PackageManager pm = getPackageManager();
// 获取已安装的应用列表
java.util.List<android.content.pm.PackageInfo> packages = pm.getInstalledPackages(0);
// 创建一个Map来存储包名和应用名称的映射
Map<String, String> packageMap = new HashMap<>();
for (android.content.pm.PackageInfo packageInfo : packages) {
// 过滤掉系统应用,只显示用户安装的应用
if ((packageInfo.applicationInfo.flags & android.content.pm.ApplicationInfo.FLAG_SYSTEM) == 0) {
// 只保留包名中包含"pineappletech"的应用
if (packageInfo.packageName.contains("pineappletech")) {
// 获取应用名称
String appName = getAppName(packageInfo.packageName);
packageMap.put(packageInfo.packageName, appName);
}
}
}
// 将Map转换为JSON格式字符串
StringBuilder jsonBuilder = new StringBuilder();
jsonBuilder.append("{");
boolean first = true;
for (Map.Entry<String, String> entry : packageMap.entrySet()) {
if (!first) {
jsonBuilder.append(",");
}
jsonBuilder.append("\"").append(entry.getKey()).append("\":\"").append(entry.getValue()).append("\"");
first = false;
}
jsonBuilder.append("}");
Log.i(TAG, "=== 已安装的应用包名 ===");
Log.i(TAG, "JSON格式: " + jsonBuilder.toString());
packageNames = jsonBuilder.toString();
Log.i(TAG, "=== 应用包名列表结束 ===");
} catch (Exception e) {
Log.e(TAG, "获取已安装应用列表失败: " + e.getMessage());
}
}
// ================= 可靠UDP核心实现 =================
private static class PendingMessage {
byte[] data;
@@ -138,7 +200,7 @@ public class Main extends Service {
udpSocket.send(packet);
msg.retryCount++;
msg.lastSentTime = now;
Log.d(TAG, "重发消息 seq=" + seq + ", 重试次数=" + msg.retryCount);
Log.i(TAG, "重发消息 seq=" + seq + ", 重试次数=" + msg.retryCount);
} catch (Exception e) {
Log.e(TAG, "重发失败: " + e.getMessage());
}
@@ -162,7 +224,7 @@ public class Main extends Service {
// 处理ACK消息
if (content.startsWith("ACK/")) {
handleAck(seq);
handleAck(seq, message);
return;
}
@@ -180,10 +242,10 @@ public class Main extends Service {
handleLegacyMessage(message, senderAddress, senderPort);
}
private void handleAck(int ackSeq) {
private void handleAck(int ackSeq, String content) {
Log.i(TAG, "收到ACK -> " + content);
// 从待确认字典中移除
pendingMessages.remove(ackSeq);
Log.d(TAG, "收到ACK确认 seq=" + ackSeq);
}
private void handleDataMessage(int seq, String content, InetAddress senderAddress, int senderPort) {
@@ -212,6 +274,11 @@ public class Main extends Service {
} else if ("STOP".equals(message)) {
Log.i(TAG, "执行停止指令");
callUnity("AppManager", "UnityMethod", "stop");
} else if ("GetPackageInfos".equals(message)) {
Log.i(TAG, "执行获取所有包信息");
// callUnity("AppManager", "UnityMethod", "pause");
sendReliable(senderAddress, 8888,
"{\"intent\":\"PackageInfos\",\"data\":\"" + packageNames + "\"}");
}
// 其他指令...
}
@@ -225,7 +292,7 @@ public class Main extends Service {
DatagramPacket packet = new DatagramPacket(
ackData, ackData.length, targetAddress, targetPort);
udpSocket.send(packet);
Log.d(TAG, "发送ACK seq=" + seq);
Log.i(TAG, "发送ACK seq=" + seq);
} catch (Exception e) {
Log.e(TAG, "发送ACK失败: " + e.getMessage());
}
@@ -253,7 +320,7 @@ public class Main extends Service {
DatagramPacket packet = new DatagramPacket(
data, data.length, targetAddress, targetPort);
udpSocket.send(packet);
Log.d(TAG, "发送可靠消息 seq=" + seq + ", 内容=" + message);
Log.i(TAG, "发送可靠消息 seq=" + seq + ", 内容=" + formattedMsg);
} catch (Exception e) {
Log.e(TAG, "发送失败: " + e.getMessage());
}
@@ -301,7 +368,6 @@ public class Main extends Service {
String receivedData = new String(
packet.getData(), 0, packet.getLength()).trim();
Log.i(TAG, "原始UDP数据: " + receivedData);
handleReceivedMessage(
receivedData,
packet.getAddress(),