The great cleanup + fix proguard (#689)
* [app] Fix proguard * [core] Remove unused proguard rule Co-authored-by: LoveSy <shana@zju.edu.cn>
This commit is contained in:
parent
4035493602
commit
a6f0e666b8
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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"))
|
||||
|
|
|
|||
|
|
@ -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 <methods>;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String, Object> 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(
|
||||
|
|
|
|||
|
|
@ -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<String, Object> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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<PackageInfo> getInstalledPackagesFromAllUsers(int flags, boolean filterNoProcess) throws RemoteException {
|
||||
List<PackageInfo> res = new ArrayList<>();
|
||||
IPackageManager pm = getPackageManager();
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Copyright (C) 2021 LSPosed Contributors
|
||||
*/
|
||||
|
||||
package org.lsposed.lspd.service;
|
||||
|
||||
public class SystemService {
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
package org.lsposed.lspd;
|
||||
package org.lsposed.lspd.models;
|
||||
|
||||
parcelable Application {
|
||||
String packageName;
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
package org.lsposed.lspd.utils;
|
||||
package org.lsposed.lspd.models;
|
||||
|
||||
parcelable UserInfo {
|
||||
int id;
|
||||
Loading…
Reference in New Issue