From 4e3e2a86379867b6077d9a0ad097abce4d7eaf29 Mon Sep 17 00:00:00 2001 From: Nullptr Date: Thu, 26 Aug 2021 23:39:18 +0800 Subject: [PATCH] Store CRC as module file name --- .../lspatch/loader/LSPApplication.java | 38 +++++++++---------- .../lspatch/loader/util/FileUtils.java | 29 ++++++++++++++ 2 files changed, 47 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java b/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java index caee6a0..f0baa0b 100644 --- a/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java +++ b/app/src/main/java/org/lsposed/lspatch/loader/LSPApplication.java @@ -15,7 +15,6 @@ import android.os.Bundle; import android.os.Environment; import android.os.IBinder; import android.os.Parcel; -import android.os.ParcelFileDescriptor; import android.os.SharedMemory; import android.system.ErrnoException; import android.system.Os; @@ -47,6 +46,7 @@ import java.lang.reflect.Method; import java.nio.channels.Channels; import java.nio.charset.StandardCharsets; import java.nio.file.Files; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.PosixFilePermissions; import java.util.ArrayList; @@ -173,8 +173,6 @@ public class LSPApplication extends ApplicationServiceClient { // TODO: set module config public static void loadModules(Context context) { var configFile = new File(context.getExternalFilesDir(null), "lspatch.json"); - var cacheDir = new File(context.getExternalCacheDir(), "modules"); - cacheDir.mkdirs(); JSONObject moduleConfigs = new JSONObject(); try (var is = new FileInputStream(configFile)) { moduleConfigs = new JSONObject(FileUtils.readTextFromInputStream(is)); @@ -192,27 +190,27 @@ public class LSPApplication extends ApplicationServiceClient { HashSet embedded_modules = new HashSet<>(); HashSet disabled_modules = new HashSet<>(); try { - var lastInstalledTime = new File(context.getApplicationInfo().sourceDir).lastModified(); for (var name : context.getAssets().list("modules")) { - var target = new File(cacheDir, name + ".apk"); - if (target.lastModified() > lastInstalledTime) { - embedded_modules.add(name); - var module = new Module(); - module.apkPath = target.getAbsolutePath(); - module.packageName = target.getName(); - LSPApplication.modules.add(module); - continue; + String modulePath = context.getCacheDir() + "/lspatch/" + name + "/"; + String cacheApkPath; + try (ZipFile sourceFile = new ZipFile(context.getApplicationInfo().sourceDir)) { + cacheApkPath = modulePath + sourceFile.getEntry("assets/modules/" + name).getCrc(); } - try (var is = context.getAssets().open("modules/" + name)) { - Files.copy(is, target.toPath()); - embedded_modules.add(name); - var module = new Module(); - module.apkPath = target.getAbsolutePath(); - module.packageName = target.getName(); - LSPApplication.modules.add(module); - } catch (IOException ignored) { + if (!Files.exists(Paths.get(cacheApkPath))) { + Log.i(TAG, "extract module apk: " + name); + FileUtils.deleteFolderIfExists(Paths.get(modulePath)); + Files.createDirectories(Paths.get(modulePath)); + try (var is = context.getAssets().open("modules/" + name)) { + Files.copy(is, Paths.get(cacheApkPath)); + } } + + embedded_modules.add(name); + var module = new Module(); + module.apkPath = cacheApkPath; + module.packageName = name; + LSPApplication.modules.add(module); } } catch (Throwable ignored) { diff --git a/app/src/main/java/org/lsposed/lspatch/loader/util/FileUtils.java b/app/src/main/java/org/lsposed/lspatch/loader/util/FileUtils.java index 43265cf..b438215 100644 --- a/app/src/main/java/org/lsposed/lspatch/loader/util/FileUtils.java +++ b/app/src/main/java/org/lsposed/lspatch/loader/util/FileUtils.java @@ -3,9 +3,15 @@ package org.lsposed.lspatch.loader.util; import android.content.Context; import java.io.BufferedReader; +import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; public class FileUtils { @@ -32,4 +38,27 @@ public class FileUtils { } return null; } + + public static void deleteFolderIfExists(Path target) throws IOException { + if (Files.notExists(target)) return; + Files.walkFileTree(target, new SimpleFileVisitor<>() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) + throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException e) + throws IOException { + if (e == null) { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } else { + throw e; + } + } + }); + } }