Fix `systemMain` being inlined in Android 13
This commit is contained in:
parent
efa0fb4645
commit
ef1439a3f3
|
|
@ -319,11 +319,11 @@ namespace lspd {
|
|||
if (*allowUnload) api_->setOption(zygisk::DLCLOSE_MODULE_LIBRARY);
|
||||
}
|
||||
|
||||
void preServerSpecialize(zygisk::ServerSpecializeArgs *) override {
|
||||
void preServerSpecialize([[maybe_unused]] zygisk::ServerSpecializeArgs *args) override {
|
||||
Context::GetInstance()->OnNativeForkSystemServerPre(env_);
|
||||
}
|
||||
|
||||
void postServerSpecialize(const zygisk::ServerSpecializeArgs *) override {
|
||||
void postServerSpecialize([[maybe_unused]] const zygisk::ServerSpecializeArgs *args) override {
|
||||
if (__system_property_find("ro.vendor.product.ztename")) {
|
||||
auto *process = env_->FindClass("android/os/Process");
|
||||
auto *set_argv0 = env_->GetStaticMethodID(process, "setArgV0",
|
||||
|
|
|
|||
|
|
@ -322,7 +322,7 @@ namespace lspd {
|
|||
}
|
||||
auto parcel_fd = JNI_CallObjectMethod(env, reply, read_file_descriptor_method_);
|
||||
int fd = JNI_CallIntMethod(env, parcel_fd, detach_fd_method_);
|
||||
auto size = JNI_CallLongMethod(env, reply, read_long_method_);
|
||||
auto size = static_cast<size_t>(JNI_CallLongMethod(env, reply, read_long_method_));
|
||||
JNI_CallVoidMethod(env, data, recycleMethod_);
|
||||
JNI_CallVoidMethod(env, reply, recycleMethod_);
|
||||
|
||||
|
|
|
|||
|
|
@ -28,13 +28,15 @@ import android.os.Environment;
|
|||
import android.os.IBinder;
|
||||
import android.os.Process;
|
||||
|
||||
import com.android.internal.os.ZygoteInit;
|
||||
|
||||
import org.lsposed.lspd.BuildConfig;
|
||||
import org.lsposed.lspd.config.LSPApplicationServiceClient;
|
||||
import org.lsposed.lspd.deopt.PrebuiltMethodsDeopter;
|
||||
import org.lsposed.lspd.hooker.CrashDumpHooker;
|
||||
import org.lsposed.lspd.hooker.HandleBindAppHooker;
|
||||
import org.lsposed.lspd.hooker.LoadedApkCstrHooker;
|
||||
import org.lsposed.lspd.hooker.SystemMainHooker;
|
||||
import org.lsposed.lspd.hooker.HandleSystemServerProcessHooker;
|
||||
import org.lsposed.lspd.util.ParasiticManagerHooker;
|
||||
import org.lsposed.lspd.util.Utils;
|
||||
import org.lsposed.lspd.yahfa.hooker.YahfaHooker;
|
||||
|
|
@ -51,8 +53,8 @@ public class Main {
|
|||
XposedHelpers.findAndHookMethod(Thread.class, "dispatchUncaughtException",
|
||||
Throwable.class, new CrashDumpHooker());
|
||||
if (isSystem) {
|
||||
XposedHelpers.findAndHookMethod(ActivityThread.class,
|
||||
"systemMain", new SystemMainHooker());
|
||||
XposedBridge.hookAllMethods(ZygoteInit.class,
|
||||
"handleSystemServerProcess", new HandleSystemServerProcessHooker());
|
||||
}
|
||||
XposedHelpers.findAndHookMethod(ActivityThread.class,
|
||||
"handleBindApplication",
|
||||
|
|
|
|||
|
|
@ -20,33 +20,29 @@
|
|||
|
||||
package org.lsposed.lspd.hooker;
|
||||
|
||||
import android.os.Build;
|
||||
|
||||
import org.lsposed.lspd.deopt.PrebuiltMethodsDeopter;
|
||||
import org.lsposed.lspd.util.Hookers;
|
||||
|
||||
import de.robv.android.xposed.XC_MethodHook;
|
||||
import de.robv.android.xposed.XposedBridge;
|
||||
import de.robv.android.xposed.XposedHelpers;
|
||||
|
||||
// system_server initialization
|
||||
public class SystemMainHooker extends XC_MethodHook {
|
||||
public class HandleSystemServerProcessHooker extends XC_MethodHook {
|
||||
|
||||
public static volatile ClassLoader systemServerCL;
|
||||
|
||||
@Override
|
||||
protected void afterHookedMethod(MethodHookParam param) {
|
||||
Hookers.logD("ActivityThread#systemMain() starts");
|
||||
Hookers.logD("ZygoteInit#handleSystemServerProcess() starts");
|
||||
try {
|
||||
// get system_server classLoader
|
||||
systemServerCL = Thread.currentThread().getContextClassLoader();
|
||||
// deopt methods in SYSTEMSERVERCLASSPATH
|
||||
PrebuiltMethodsDeopter.deoptSystemServerMethods(systemServerCL);
|
||||
var sbsHooker = new StartBootstrapServicesHooker();
|
||||
Object[] paramTypesAndCallback = Build.VERSION.SDK_INT >= Build.VERSION_CODES.R ?
|
||||
new Object[]{"com.android.server.utils.TimingsTraceAndSlog", sbsHooker} :
|
||||
new Object[]{sbsHooker};
|
||||
XposedHelpers.findAndHookMethod("com.android.server.SystemServer",
|
||||
systemServerCL, "startBootstrapServices", paramTypesAndCallback);
|
||||
XposedBridge.hookAllMethods(
|
||||
XposedHelpers.findClass("com.android.server.SystemServer", systemServerCL),
|
||||
"startBootstrapServices", new StartBootstrapServicesHooker());
|
||||
} catch (Throwable t) {
|
||||
Hookers.logE("error when hooking systemMain", t);
|
||||
}
|
||||
|
|
@ -41,7 +41,7 @@ public class StartBootstrapServicesHooker extends XC_MethodHook {
|
|||
XC_LoadPackage.LoadPackageParam lpparam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
|
||||
lpparam.packageName = "android";
|
||||
lpparam.processName = "android"; // it's actually system_server, but other functions return this as well
|
||||
lpparam.classLoader = SystemMainHooker.systemServerCL;
|
||||
lpparam.classLoader = HandleSystemServerProcessHooker.systemServerCL;
|
||||
lpparam.appInfo = null;
|
||||
lpparam.isFirstApplication = true;
|
||||
XC_LoadPackage.callAll(lpparam);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,4 @@
|
|||
package com.android.internal.os;
|
||||
|
||||
public class ZygoteInit {
|
||||
}
|
||||
Loading…
Reference in New Issue