LSPosed/xposed-bridge/src/main/java/de/robv/android/xposed/IXposedHookZygoteInit.java

67 lines
2.3 KiB
Java

package de.robv.android.xposed;
import de.robv.android.xposed.callbacks.XC_InitZygote;
import de.robv.android.xposed.callbacks.XCallback;
/**
* Hook the initialization of Zygote process(es), from which all the apps are forked.
*
* <p>Implement this interface in your module's main class in order to be notified when Android is
* starting up. In {@link IXposedHookZygoteInit}, you can modify objects and place hooks that should
* be applied for every app. Only the Android framework/system classes are available at that point
* in time. Use {@code null} as class loader for {@link XposedHelpers#findAndHookMethod(String, ClassLoader, String, Object...)}
* and its variants.
*
* <p>If you want to hook one/multiple specific apps, use {@link IXposedHookLoadPackage} instead.
*/
public interface IXposedHookZygoteInit extends IXposedMod {
/**
* Called very early during startup of Zygote.
* @param startupParam Details about the module itself and the started process.
* @throws Throwable everything is caught, but will prevent further initialization of the module.
*/
void initZygote(StartupParam startupParam) throws Throwable;
/** Data holder for {@link #initZygote}. */
final class StartupParam extends XCallback.Param {
/*package*/ StartupParam() {}
/**
* @param callbacks
* @hide
*/
public StartupParam(XposedBridge.CopyOnWriteSortedSet<? extends XCallback> callbacks) {
super(callbacks);
}
/** The path to the module's APK. */
public String modulePath;
/**
* Always {@code true} on 32-bit ROMs. On 64-bit, it's only {@code true} for the primary
* process that starts the system_server.
*/
public boolean startsSystemServer;
}
/**
* @hide
*/
final class Wrapper extends XC_InitZygote {
private final IXposedHookZygoteInit instance;
private final StartupParam startupParam;
public Wrapper(IXposedHookZygoteInit instance, StartupParam startupParam) {
this.instance = instance;
this.startupParam = startupParam;
}
@Override
public void initZygote(StartupParam startupParam) throws Throwable {
// NOTE: parameter startupParam not used
// cause startupParam info is generated and saved along with instance here
instance.initZygote(this.startupParam);
}
}
}