diff --git a/app/build.gradle.kts b/app/build.gradle.kts index b82f1a21..a8185d57 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -209,7 +209,7 @@ dependencies { implementation("com.github.bumptech.glide:glide:$glideVersion") implementation("com.github.bumptech.glide:okhttp3-integration:$glideVersion") implementation("com.google.android.material:material:1.3.0") - implementation("com.google.code.gson:gson:2.8.6") + implementation("com.google.code.gson:gson:2.8.7") implementation("com.takisoft.preferencex:preferencex:1.1.0") implementation("com.takisoft.preferencex:preferencex-colorpicker:1.1.0") implementation("com.squareup.okhttp3:okhttp:$okhttpVersion") diff --git a/app/src/main/java/org/lsposed/manager/ConfigManager.java b/app/src/main/java/org/lsposed/manager/ConfigManager.java index 4358f369..43de1285 100644 --- a/app/src/main/java/org/lsposed/manager/ConfigManager.java +++ b/app/src/main/java/org/lsposed/manager/ConfigManager.java @@ -27,9 +27,9 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Log; -import org.lsposed.lspd.Application; +import org.lsposed.lspd.models.Application; +import org.lsposed.lspd.models.UserInfo; import org.lsposed.lspd.utils.ParceledListSlice; -import org.lsposed.lspd.utils.UserInfo; import org.lsposed.manager.adapters.ScopeAdapter; import org.lsposed.manager.receivers.LSPManagerServiceClient; diff --git a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java index e1350f10..5b9b91c4 100644 --- a/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java +++ b/app/src/main/java/org/lsposed/manager/adapters/ScopeAdapter.java @@ -66,7 +66,7 @@ import com.bumptech.glide.request.transition.Transition; import com.google.android.material.checkbox.MaterialCheckBox; import com.google.android.material.snackbar.Snackbar; -import org.lsposed.lspd.Application; +import org.lsposed.lspd.models.Application; import org.lsposed.manager.App; import org.lsposed.manager.BuildConfig; import org.lsposed.manager.ConfigManager; diff --git a/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java b/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java index 4cad8981..be4a580f 100644 --- a/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java +++ b/app/src/main/java/org/lsposed/manager/receivers/LSPManagerServiceClient.java @@ -26,10 +26,10 @@ import android.os.IBinder; import android.os.ParcelFileDescriptor; import android.os.RemoteException; -import org.lsposed.lspd.Application; import org.lsposed.lspd.ILSPManagerService; +import org.lsposed.lspd.models.Application; +import org.lsposed.lspd.models.UserInfo; import org.lsposed.lspd.utils.ParceledListSlice; -import org.lsposed.lspd.utils.UserInfo; import java.util.List; diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java index 7e776609..8a7e7e24 100644 --- a/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java +++ b/app/src/main/java/org/lsposed/manager/ui/activity/ModulesActivity.java @@ -66,7 +66,7 @@ import com.google.android.material.checkbox.MaterialCheckBox; import com.google.android.material.snackbar.Snackbar; import com.google.android.material.tabs.TabLayoutMediator; -import org.lsposed.lspd.utils.UserInfo; +import org.lsposed.lspd.models.UserInfo; import org.lsposed.manager.ConfigManager; import org.lsposed.manager.R; import org.lsposed.manager.adapters.AppHelper; diff --git a/app/src/main/java/org/lsposed/manager/ui/activity/RepoItemActivity.java b/app/src/main/java/org/lsposed/manager/ui/activity/RepoItemActivity.java index a0b9fb09..4c4ed760 100644 --- a/app/src/main/java/org/lsposed/manager/ui/activity/RepoItemActivity.java +++ b/app/src/main/java/org/lsposed/manager/ui/activity/RepoItemActivity.java @@ -164,9 +164,7 @@ public class RepoItemActivity extends BaseActivity implements RepoLoader.Listene @Override public void onThrowable(Throwable t) { if (releaseAdapter != null) { - runOnUiThread(() -> { - releaseAdapter.loadItems(); - }); + runOnUiThread(() -> releaseAdapter.loadItems()); } if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.RESUMED)) { Snackbar.make(binding.snackbar, getString(R.string.repo_load_failed, t.getLocalizedMessage()), Snackbar.LENGTH_SHORT).show(); diff --git a/core/build.gradle.kts b/core/build.gradle.kts index 6a530f13..9b4be2bf 100644 --- a/core/build.gradle.kts +++ b/core/build.gradle.kts @@ -58,7 +58,7 @@ val verName: String by rootProject.extra dependencies { implementation("dev.rikka.ndk:riru:${moduleMinRiruVersionName}") implementation("dev.rikka.ndk.thirdparty:cxx:1.1.0") - implementation("com.android.tools.build:apksig:4.2.1") + implementation("com.android.tools.build:apksig:7.0.0-beta01") implementation("org.apache.commons:commons-lang3:3.12.0") implementation("de.upb.cs.swt:axml:2.1.1") compileOnly(project(":hiddenapi-stubs")) diff --git a/core/proguard-rules.pro b/core/proguard-rules.pro index 4499844d..7927cae4 100644 --- a/core/proguard-rules.pro +++ b/core/proguard-rules.pro @@ -30,7 +30,6 @@ public static void forkAndSpecializePost(java.lang.String, java.lang.String, android.os.IBinder); public static void main(java.lang.String[]); } --keepnames class org.lsposed.lspd.hooker.HandleBindAppHooker -keepclasseswithmembers,includedescriptorclasses class * { native ; } diff --git a/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java index 16e3d0fe..23e7fffb 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/HandleBindAppHooker.java @@ -20,26 +20,15 @@ package org.lsposed.lspd.hooker; -import static org.lsposed.lspd.config.LSPApplicationServiceClient.serviceClient; - -import android.annotation.SuppressLint; import android.app.ActivityThread; -import android.app.ContextImpl; import android.app.LoadedApk; -import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.res.CompatibilityInfo; import android.content.res.XResources; -import android.os.IBinder; import org.lsposed.lspd.util.Hookers; -import org.lsposed.lspd.util.MetaDataReader; import org.lsposed.lspd.util.Utils; -import java.io.File; -import java.io.IOException; -import java.util.Map; - import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.XposedInit; @@ -77,45 +66,6 @@ public class HandleBindAppHooker extends XC_MethodHook { String processName = (String) XposedHelpers.getObjectField(bindData, "processName"); - - IBinder moduleBinder = serviceClient.requestModuleBinder(); - boolean isModule = moduleBinder != null; - int xposedminversion = -1; - boolean xposedsharedprefs = false; - try { - if (isModule) { - Map metaData = MetaDataReader.getMetaData(new File(appInfo.sourceDir)); - Object minVersionRaw = metaData.get("xposedminversion"); - if (minVersionRaw instanceof Integer) { - xposedminversion = (Integer) minVersionRaw; - } else if (minVersionRaw instanceof String) { - xposedminversion = MetaDataReader.extractIntPart((String) minVersionRaw); - } - xposedsharedprefs = metaData.containsKey("xposedsharedprefs"); - } - } catch (NumberFormatException | IOException e) { - Hookers.logE("ApkParser fails", e); - } - - if (isModule && (xposedminversion > 92 || xposedsharedprefs)) { - Utils.logW("New modules detected, hook preferences"); - XposedHelpers.findAndHookMethod(ContextImpl.class, "checkMode", int.class, new XC_MethodHook() { - @SuppressWarnings("deprecation") - @SuppressLint("WorldReadableFiles") - @Override - protected void afterHookedMethod(MethodHookParam param) { - if (((int) param.args[0] & Context.MODE_WORLD_READABLE) != 0) { - param.setThrowable(null); - } - } - }); - XposedHelpers.findAndHookMethod(ContextImpl.class, "getPreferencesDir", new XC_MethodHook() { - @Override - protected void afterHookedMethod(MethodHookParam param) { - param.setResult(new File(serviceClient.getPrefsPath(appInfo.packageName))); - } - }); - } LoadedApkGetCLHooker hook = new LoadedApkGetCLHooker(loadedApk, reportedPackageName, processName, true); hook.setUnhook(XposedHelpers.findAndHookMethod( diff --git a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java index 84ec7468..44063b80 100644 --- a/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java +++ b/core/src/main/java/org/lsposed/lspd/hooker/LoadedApkGetCLHooker.java @@ -27,8 +27,15 @@ import android.os.IBinder; import org.lsposed.lspd.util.Hookers; import org.lsposed.lspd.util.InstallerVerifier; +import org.lsposed.lspd.util.MetaDataReader; +import org.lsposed.lspd.util.Utils; + +import java.io.File; +import java.io.IOException; +import java.util.Map; import de.robv.android.xposed.XC_MethodHook; +import de.robv.android.xposed.XC_MethodReplacement; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage; @@ -50,7 +57,7 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { } @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { + protected void afterHookedMethod(MethodHookParam param) { try { @@ -78,6 +85,11 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { lpparam.appInfo = loadedApk.getApplicationInfo(); lpparam.isFirstApplication = this.isFirstApplication; + IBinder moduleBinder = serviceClient.requestModuleBinder(); + if (moduleBinder != null) { + hookNewXSP(lpparam); + } + IBinder binder = loadedApk.getApplicationInfo() != null ? serviceClient.requestManagerBinder(loadedApk.getApplicationInfo().packageName) : null; if (binder != null) { if (InstallerVerifier.verifyInstallerSignature(loadedApk.getApplicationInfo())) { @@ -98,11 +110,42 @@ public class LoadedApkGetCLHooker extends XC_MethodHook { } } + private void hookNewXSP(XC_LoadPackage.LoadPackageParam lpparam) { + int xposedminversion = -1; + boolean xposedsharedprefs = false; + try { + Map metaData = MetaDataReader.getMetaData(new File(lpparam.appInfo.sourceDir)); + Object minVersionRaw = metaData.get("xposedminversion"); + if (minVersionRaw instanceof Integer) { + xposedminversion = (Integer) minVersionRaw; + } else if (minVersionRaw instanceof String) { + xposedminversion = MetaDataReader.extractIntPart((String) minVersionRaw); + } + xposedsharedprefs = metaData.containsKey("xposedsharedprefs"); + } catch (NumberFormatException | IOException e) { + Hookers.logE("ApkParser fails", e); + } + + if (xposedminversion > 92 || xposedsharedprefs) { + Utils.logW("New modules detected, hook preferences"); + XposedHelpers.findAndHookMethod("android.app.ContextImpl", lpparam.classLoader, "checkMode", int.class, new XC_MethodHook() { + @Override + protected void afterHookedMethod(MethodHookParam param) { + if (((int) param.args[0] & 1/*Context.MODE_WORLD_READABLE*/) != 0) { + param.setThrowable(null); + } + } + }); + XposedHelpers.findAndHookMethod("android.app.ContextImpl", lpparam.classLoader, "getPreferencesDir", new XC_MethodReplacement() { + @Override + protected Object replaceHookedMethod(MethodHookParam param) { + return new File(serviceClient.getPrefsPath(lpparam.packageName)); + } + }); + } + } + public void setUnhook(Unhook unhook) { this.unhook = unhook; } - - public Unhook getUnhook() { - return unhook; - } } diff --git a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java index f53cb1f0..af275b15 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java +++ b/core/src/main/java/org/lsposed/lspd/service/ConfigManager.java @@ -41,8 +41,8 @@ import android.util.Pair; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.lsposed.lspd.Application; import org.lsposed.lspd.BuildConfig; +import org.lsposed.lspd.models.Application; import java.io.File; import java.io.FileNotFoundException; diff --git a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java index e2087650..552ff8f4 100644 --- a/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java +++ b/core/src/main/java/org/lsposed/lspd/service/LSPManagerService.java @@ -34,11 +34,11 @@ import android.os.ParcelFileDescriptor; import android.os.RemoteException; import android.util.Log; -import org.lsposed.lspd.Application; import org.lsposed.lspd.BuildConfig; import org.lsposed.lspd.ILSPManagerService; +import org.lsposed.lspd.models.Application; +import org.lsposed.lspd.models.UserInfo; import org.lsposed.lspd.utils.ParceledListSlice; -import org.lsposed.lspd.utils.UserInfo; import java.lang.reflect.InvocationTargetException; import java.util.LinkedList; diff --git a/core/src/main/java/org/lsposed/lspd/service/PackageService.java b/core/src/main/java/org/lsposed/lspd/service/PackageService.java index 9fcb8328..00b9a3d9 100644 --- a/core/src/main/java/org/lsposed/lspd/service/PackageService.java +++ b/core/src/main/java/org/lsposed/lspd/service/PackageService.java @@ -46,8 +46,8 @@ import android.util.Pair; import androidx.annotation.NonNull; -import org.lsposed.lspd.Application; import org.lsposed.lspd.BuildConfig; +import org.lsposed.lspd.models.Application; import org.lsposed.lspd.util.InstallerVerifier; import org.lsposed.lspd.utils.ParceledListSlice; @@ -125,12 +125,6 @@ public class PackageService { return pm.getApplicationInfo(packageName, flags, userId); } - public static String[] getPackagesForUid(int uid) throws RemoteException { - IPackageManager pm = getPackageManager(); - if (pm == null) return new String[0]; - return pm.getPackagesForUid(uid); - } - public static ParceledListSlice getInstalledPackagesFromAllUsers(int flags, boolean filterNoProcess) throws RemoteException { List res = new ArrayList<>(); IPackageManager pm = getPackageManager(); diff --git a/core/src/main/java/org/lsposed/lspd/service/ParcelUtils.java b/core/src/main/java/org/lsposed/lspd/service/ParcelUtils.java index 837f7776..f7d1a5d1 100644 --- a/core/src/main/java/org/lsposed/lspd/service/ParcelUtils.java +++ b/core/src/main/java/org/lsposed/lspd/service/ParcelUtils.java @@ -19,6 +19,7 @@ package org.lsposed.lspd.service; +import android.annotation.SuppressLint; import android.os.Build; import android.os.Parcel; @@ -39,6 +40,7 @@ public class ParcelUtils { private static Method obtainMethod; + @SuppressLint("SoonBlockedPrivateApi") public static Parcel fromNativePointer(long ptr) { if (ptr == 0) return null; diff --git a/core/src/main/java/org/lsposed/lspd/service/SystemService.java b/core/src/main/java/org/lsposed/lspd/service/SystemService.java deleted file mode 100644 index 36854dec..00000000 --- a/core/src/main/java/org/lsposed/lspd/service/SystemService.java +++ /dev/null @@ -1,23 +0,0 @@ -/* - * This file is part of LSPosed. - * - * LSPosed is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * LSPosed is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with LSPosed. If not, see . - * - * Copyright (C) 2021 LSPosed Contributors - */ - -package org.lsposed.lspd.service; - -public class SystemService { -} diff --git a/core/src/main/java/org/lsposed/lspd/util/ClassUtils.java b/core/src/main/java/org/lsposed/lspd/util/ClassUtils.java index 8d4e3fa7..72278871 100644 --- a/core/src/main/java/org/lsposed/lspd/util/ClassUtils.java +++ b/core/src/main/java/org/lsposed/lspd/util/ClassUtils.java @@ -51,10 +51,8 @@ public class ClassUtils { private static boolean isInitialized(Class clazz) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { return getClassStatus(clazz, true) >= 14; - } else if (Build.VERSION.SDK_INT == Build.VERSION_CODES.O_MR1) { - return getClassStatus(clazz, false) == 11; } else { - return getClassStatus(clazz, false) == 10; + return getClassStatus(clazz, false) == 11; } } diff --git a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java index d61fb83e..9b080152 100644 --- a/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java +++ b/core/src/main/java/org/lsposed/lspd/util/InstallerVerifier.java @@ -39,7 +39,7 @@ import de.robv.android.xposed.XposedHelpers; public class InstallerVerifier { public static boolean verifyInstallerSignature(ApplicationInfo appInfo) { ApkVerifier verifier = new ApkVerifier.Builder(new File(appInfo.sourceDir)) - .setMinCheckedPlatformVersion(26) + .setMinCheckedPlatformVersion(27) .build(); try { ApkVerifier.Result result = verifier.verify(); diff --git a/core/src/main/java/org/lsposed/lspd/util/ProxyClassLoader.java b/core/src/main/java/org/lsposed/lspd/util/ProxyClassLoader.java index 7ab6e898..7c369803 100644 --- a/core/src/main/java/org/lsposed/lspd/util/ProxyClassLoader.java +++ b/core/src/main/java/org/lsposed/lspd/util/ProxyClassLoader.java @@ -31,7 +31,7 @@ public class ProxyClassLoader extends ClassLoader { @Override protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { - Class clazz = null; + Class clazz = null; try { clazz = mClassLoader.loadClass(name); diff --git a/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java b/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java index 3baf2206..dd82db6d 100644 --- a/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java +++ b/hiddenapi-stubs/src/main/java/android/os/IPowerManager.java @@ -1,7 +1,7 @@ package android.os; public interface IPowerManager extends IInterface { - void reboot(boolean confirm, String reason, boolean wait); + void reboot(boolean confirm, String reason, boolean wait) throws RemoteException; abstract class Stub extends Binder implements IPowerManager { diff --git a/manager-service/proguard-rules.pro b/manager-service/proguard-rules.pro index 134eea52..72a21fd1 100644 --- a/manager-service/proguard-rules.pro +++ b/manager-service/proguard-rules.pro @@ -19,7 +19,7 @@ # If you keep the line number information, uncomment this to # hide the original source file name. #-renamesourcefileattribute SourceFile --keepclasseswithmembers class org.lsposed.lspd.Application { *; } +-keepclasseswithmembers class org.lsposed.lspd.models.* { *; } -keepclassmembers class * implements android.os.Parcelable { public static final ** CREATOR; } diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl index 70fd25c6..01684e27 100644 --- a/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl +++ b/manager-service/src/main/aidl/org/lsposed/lspd/ILSPManagerService.aidl @@ -1,8 +1,8 @@ package org.lsposed.lspd; import org.lsposed.lspd.utils.ParceledListSlice; -import org.lsposed.lspd.utils.UserInfo; -import org.lsposed.lspd.Application; +import org.lsposed.lspd.models.UserInfo; +import org.lsposed.lspd.models.Application; interface ILSPManagerService { diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/Application.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/models/Application.aidl similarity index 67% rename from manager-service/src/main/aidl/org/lsposed/lspd/Application.aidl rename to manager-service/src/main/aidl/org/lsposed/lspd/models/Application.aidl index 6e96b7f2..272f4c5a 100644 --- a/manager-service/src/main/aidl/org/lsposed/lspd/Application.aidl +++ b/manager-service/src/main/aidl/org/lsposed/lspd/models/Application.aidl @@ -1,4 +1,4 @@ -package org.lsposed.lspd; +package org.lsposed.lspd.models; parcelable Application { String packageName; diff --git a/manager-service/src/main/aidl/org/lsposed/lspd/utils/UserInfo.aidl b/manager-service/src/main/aidl/org/lsposed/lspd/models/UserInfo.aidl similarity index 62% rename from manager-service/src/main/aidl/org/lsposed/lspd/utils/UserInfo.aidl rename to manager-service/src/main/aidl/org/lsposed/lspd/models/UserInfo.aidl index 4f960932..382e502c 100644 --- a/manager-service/src/main/aidl/org/lsposed/lspd/utils/UserInfo.aidl +++ b/manager-service/src/main/aidl/org/lsposed/lspd/models/UserInfo.aidl @@ -1,4 +1,4 @@ -package org.lsposed.lspd.utils; +package org.lsposed.lspd.models; parcelable UserInfo { int id;