From df7bf3eb5879f9f4dcc028e51f0cf118070cd1cd Mon Sep 17 00:00:00 2001 From: NkBe Date: Wed, 11 Feb 2026 23:26:41 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=BE=A9=E6=A8=A1=E7=B5=84=E5=8A=A0?= =?UTF-8?q?=E8=BC=89=E5=82=99=E6=8F=B4=E6=A9=9F=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增本地快取讀取:當系統無法透過 Content Provider 獲取管理器模組清單時,會自動切換至 loadModulesFromCache 模式,從本地的 SharedPreferences 讀取先前儲存的模組資訊。 支援路徑加載:快取機制支援直接透過檔案路徑(APK Path)加載模組,即使該 App 已被卸載或路徑變更,只要檔案存在即可嘗試加載。 --- .../service/NeoLocalApplicationService.java | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/patch-loader/src/main/java/org/lsposed/npatch/service/NeoLocalApplicationService.java b/patch-loader/src/main/java/org/lsposed/npatch/service/NeoLocalApplicationService.java index 924dfe8..fef5089 100644 --- a/patch-loader/src/main/java/org/lsposed/npatch/service/NeoLocalApplicationService.java +++ b/patch-loader/src/main/java/org/lsposed/npatch/service/NeoLocalApplicationService.java @@ -1,6 +1,7 @@ package org.lsposed.npatch.service; import android.content.Context; +import android.content.SharedPreferences; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import android.database.Cursor; @@ -10,6 +11,8 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Log; +import org.json.JSONArray; +import org.json.JSONObject; import org.lsposed.npatch.util.ModuleLoader; import org.lsposed.lspd.models.Module; import org.lsposed.lspd.service.ILSPApplicationService; @@ -29,6 +32,49 @@ public class NeoLocalApplicationService extends ILSPApplicationService.Stub { public NeoLocalApplicationService(Context context) { cachedModule = Collections.synchronizedList(new ArrayList<>()); loadModulesFromProvider(context); + + if (cachedModule.isEmpty()) { + Log.w(TAG, "NeoLocal: Provider returned empty, falling back to local cache."); + loadModulesFromCache(context); + } + } + + private void loadModulesFromCache(Context context) { + try { + SharedPreferences shared = context.getSharedPreferences("npatch", Context.MODE_PRIVATE); + String jsonStr = shared.getString("modules", "[]"); + JSONArray jsonArray = new JSONArray(jsonStr); + PackageManager pm = context.getPackageManager(); + + Log.i(TAG, "NeoLocal: Loading from cache: " + jsonStr); + + for (int i = 0; i < jsonArray.length(); i++) { + JSONObject obj = jsonArray.getJSONObject(i); + String packageName = obj.optString("packageName"); + String path = obj.optString("path"); + + if (path != null && !path.isEmpty() && new File(path).exists()) { + loadModuleByPath(packageName, path); + } else if (packageName != null) { + loadSingleModule(pm, packageName); + } + } + } catch (Exception e) { + Log.e(TAG, "NeoLocal: Failed to load from cache", e); + } + } + + private void loadModuleByPath(String pkgName, String path) { + try { + Module m = new Module(); + m.packageName = pkgName; + m.apkPath = path; + m.file = ModuleLoader.loadModule(m.apkPath); + cachedModule.add(m); + Log.i(TAG, "Loaded cached module " + pkgName); + } catch (Throwable e) { + Log.e(TAG, "Failed to load cached module " + pkgName, e); + } } private void loadModulesFromProvider(Context context) {