Magisk/stub/src/main/java/com/topjohnwu/magisk/DelegateRootService.java

44 lines
1.4 KiB
Java
Raw Normal View History

2021-12-13 12:57:27 +01:00
package com.topjohnwu.magisk;
import android.content.Context;
import android.content.ContextWrapper;
2022-02-13 12:32:11 +01:00
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
2021-12-13 12:57:27 +01:00
import android.util.Log;
2022-02-13 12:32:11 +01:00
import java.io.File;
2021-12-13 12:57:27 +01:00
import java.lang.reflect.Constructor;
public class DelegateRootService extends ContextWrapper {
public DelegateRootService() {
super(null);
}
@Override
protected void attachBaseContext(Context base) {
2022-02-13 16:24:34 +01:00
ClassLoader loader = DynLoad.loadApk(base);
if (loader == null)
2021-12-13 12:57:27 +01:00
return;
try {
2022-02-13 12:32:11 +01:00
// Create application to get the real root service class
var data = DynLoad.createApkData();
File apk = StubApk.current(base);
PackageManager pm = base.getPackageManager();
PackageInfo pkgInfo = pm.getPackageArchiveInfo(apk.getPath(), 0);
2022-02-13 16:24:34 +01:00
loader.loadClass(pkgInfo.applicationInfo.className)
2022-02-13 12:32:11 +01:00
.getConstructor(Object.class)
.newInstance(data.getObject());
// Create the actual RootService and call its attachBaseContext
Constructor<?> ctor = data.getRootService().getConstructor(Object.class);
2021-12-13 12:57:27 +01:00
ctor.setAccessible(true);
Object service = ctor.newInstance(this);
DynLoad.attachContext(service, base);
2021-12-13 12:57:27 +01:00
} catch (Exception e) {
Log.e(DelegateRootService.class.getSimpleName(), "", e);
}
}
}