VCamera v2.0.3版本的 MD5 值为:0c69d90ea31aeb3cb9d1431fccc77864
以下内容为反编译后的 XposedInit.java 源代码,内容仅作参考
package de.robv.android.xposed;
import android.content.pm.ApplicationInfo;
import android.util.Log;
import dalvik.system.DexFile;
import dalvik.system.PathClassLoader;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
public final class XposedInit {
private static final String INSTANT_RUN_CLASS = "com.android.tools.fd.runtime.BootstrapApplication";
private static final String TAG = "Xposed";
private XposedInit() {
}
public static void loadModule(String str, ClassLoader classLoader) {
ZipFile zipFile;
Log.i("Xposed", "Loading modules from " + str);
if (!new File(str).exists()) {
Log.e("Xposed", " File does not exist");
return;
}
try {
DexFile dexFile = new DexFile(str);
if (dexFile.loadClass(INSTANT_RUN_CLASS, classLoader) != null) {
Log.e("Xposed", " Cannot load module, please disable \"Instant Run\" in Android Studio.");
XposedHelpers.closeSilently(dexFile);
} else if (dexFile.loadClass(XposedBridge.class.getName(), classLoader) != null) {
Log.e("Xposed", " Cannot load module:");
Log.e("Xposed", " The Xposed API classes are compiled into the module's APK.");
Log.e("Xposed", " This may cause strange issues and must be fixed by the module developer.");
Log.e("Xposed", " For details, see: http://api.xposed.info/using.html");
XposedHelpers.closeSilently(dexFile);
} else {
XposedHelpers.closeSilently(dexFile);
ZipFile zipFile2 = null;
try {
zipFile = new ZipFile(str);
} catch (IOException e) {
e = e;
}
try {
ZipEntry entry = zipFile.getEntry("assets/xposed_init");
if (entry == null) {
Log.e("Xposed", " assets/xposed_init not found in the APK");
XposedHelpers.closeSilently(zipFile);
return;
}
InputStream inputStream = zipFile.getInputStream(entry);
PathClassLoader pathClassLoader = new PathClassLoader(str, XposedBridge.BOOTCLASSLOADER);
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
while (true) {
try {
try {
String readLine = bufferedReader.readLine();
if (readLine == null) {
break;
}
String trim = readLine.trim();
if (!trim.isEmpty() && !trim.startsWith("#")) {
try {
Log.i("Xposed", " Loading class " + trim);
Class<?> loadClass = pathClassLoader.loadClass(trim);
if (!IXposedMod.class.isAssignableFrom(loadClass)) {
Log.e("Xposed", " This class doesn't implement any sub-interface of IXposedMod, skipping it");
} else {
Object newInstance = loadClass.newInstance();
if (newInstance instanceof IXposedHookLoadPackage) {
XposedBridge.hookLoadPackage(new IXposedHookLoadPackage.Wrapper((IXposedHookLoadPackage) newInstance));
}
}
} catch (Throwable th) {
Log.e("Xposed", " Failed to load class " + trim, th);
}
}
} catch (IOException e2) {
Log.e("Xposed", " Failed to load module from " + str, e2);
}
} finally {
XposedHelpers.closeSilently(inputStream);
XposedHelpers.closeSilently(zipFile);
}
}
} catch (IOException e3) {
e = e3;
zipFile2 = zipFile;
Log.e("Xposed", " Cannot read assets/xposed_init in the APK", e);
XposedHelpers.closeSilently(zipFile2);
}
}
} catch (IOException e4) {
Log.e("Xposed", " Cannot load module", e4);
}
}
public static void onPackageLoad(String str, String str2, ApplicationInfo applicationInfo, boolean z, ClassLoader classLoader) {
XC_LoadPackage.LoadPackageParam loadPackageParam = new XC_LoadPackage.LoadPackageParam(XposedBridge.sLoadedPackageCallbacks);
loadPackageParam.packageName = str;
loadPackageParam.processName = str2;
loadPackageParam.appInfo = applicationInfo;
loadPackageParam.isFirstApplication = z;
loadPackageParam.classLoader = classLoader;
XC_LoadPackage.callAll(loadPackageParam);
}
}