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:
tehcneko 2021-05-28 16:42:43 +08:00 committed by GitHub
parent 4035493602
commit a6f0e666b8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
23 changed files with 72 additions and 111 deletions

View File

@ -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")

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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"))

View File

@ -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>;
}

View File

@ -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(

View File

@ -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;
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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();

View File

@ -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;

View File

@ -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 {
}

View File

@ -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;
}
}

View File

@ -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();

View File

@ -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);

View File

@ -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 {

View File

@ -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;
}

View File

@ -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 {

View File

@ -1,4 +1,4 @@
package org.lsposed.lspd;
package org.lsposed.lspd.models;
parcelable Application {
String packageName;

View File

@ -1,4 +1,4 @@
package org.lsposed.lspd.utils;
package org.lsposed.lspd.models;
parcelable UserInfo {
int id;