Fix `systemMain` being inlined in Android 13

This commit is contained in:
LoveSy 2022-02-12 18:22:08 +08:00 committed by 双草酸酯
parent efa0fb4645
commit ef1439a3f3
6 changed files with 19 additions and 17 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,4 @@
package com.android.internal.os;
public class ZygoteInit {
}