From b81caac9135049c73a6ae3130348d638806544dd Mon Sep 17 00:00:00 2001 From: LoveSy Date: Wed, 2 Feb 2022 20:27:21 +0800 Subject: [PATCH] Collect modules in log and close fds (#1610) --- .../lspd/service/ConfigFileManager.java | 56 ++++++++++++++----- .../lsposed/lspd/service/ConfigManager.java | 24 ++++++++ 2 files changed, 66 insertions(+), 14 deletions(-) diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java index 252e62d1..07a53437 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigFileManager.java @@ -226,26 +226,54 @@ public class ConfigFileManager { Log.w(TAG, name, e); } }); - var name = "full.log"; - try (var is = new ProcessBuilder("logcat", "-d").start().getInputStream()) { - os.putNextEntry(new ZipEntry(name)); - transfer(is, os); - os.closeEntry(); - } catch (IOException e) { - Log.w(TAG, name, e); + { + var name = "full.log"; + try (var is = new ProcessBuilder("logcat", "-d").start().getInputStream()) { + os.putNextEntry(new ZipEntry(name)); + transfer(is, os); + os.closeEntry(); + } catch (IOException e) { + Log.w(TAG, name, e); + } } - name = "dmesg.log"; - try (var is = new ProcessBuilder("dmesg").start().getInputStream()) { - os.putNextEntry(new ZipEntry(name)); - transfer(is, os); - os.closeEntry(); - } catch (IOException e) { - Log.w(TAG, name, e); + { + var name = "dmesg.log"; + try (var is = new ProcessBuilder("dmesg").start().getInputStream()) { + os.putNextEntry(new ZipEntry(name)); + transfer(is, os); + os.closeEntry(); + } catch (IOException e) { + Log.w(TAG, name, e); + } } + var magiskDataDir = Paths.get("/data/adb"); + Files.list(magiskDataDir.resolve("modules")).forEach(p -> { + if (!Files.exists(p.resolve("disable"))) { + var prop = p.resolve("module.prop"); + if (Files.exists(prop)) { + var name = magiskDataDir.relativize(prop).toString(); + try (var is = new FileInputStream(prop.toFile())) { + os.putNextEntry(new ZipEntry(name)); + transfer(is, os); + os.closeEntry(); + } catch (IOException e) { + Log.w(TAG, name, e); + } + } + } + }); + ConfigManager.getInstance().exportScopes(os); } catch (Throwable e) { Log.w(TAG, "get log", e); throw new RemoteException(Log.getStackTraceString(e)); } + logs.forEach((name, fd) -> { + try { + fd.close(); + } catch (IOException e) { + Log.w(TAG, name, e); + } + }); } private static void putFds(Map map, Path path) throws IOException { diff --git a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java index 90f3fa89..9f5461a1 100644 --- a/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/daemon/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -55,6 +55,7 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.Serializable; +import java.nio.charset.StandardCharsets; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -75,7 +76,9 @@ import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; import java.util.function.Supplier; +import java.util.zip.ZipEntry; import java.util.zip.ZipFile; +import java.util.zip.ZipOutputStream; public class ConfigManager { private static ConfigManager instance = null; @@ -1015,4 +1018,25 @@ public class ConfigManager { public String getApi() { return api; } + + public void exportScopes(ZipOutputStream os) throws IOException { + os.putNextEntry(new ZipEntry("scopes.txt")); + cachedScope.forEach((scope, modules) -> { + try { + os.write((scope.processName + "/" + scope.uid + "\n").getBytes(StandardCharsets.UTF_8)); + for (var module : modules) { + os.write(("\t" + module.packageName + "\n").getBytes(StandardCharsets.UTF_8)); + for (var cn : module.file.moduleClassNames) { + os.write(("\t\t" + cn + "\n").getBytes(StandardCharsets.UTF_8)); + } + for (var ln : module.file.moduleLibraryNames) { + os.write(("\t\t" + ln + "\n").getBytes(StandardCharsets.UTF_8)); + } + } + } catch (IOException e) { + Log.w(TAG, scope.processName, e); + } + }); + os.closeEntry(); + } }