dalvik.system.PathClassLoader myClassLoader = new dalvik.system.PathClassLoader("/Sdcard/MyJar.jar", ModuleLoader.class.getClassLoader());
dalvik.system.PathClassLoader myClassLoader = new dalvik.system.PathClassLoader(urls.get(index).toString(), ModuleLoader.class.getClassLoader()); Class<?> moduleClass = Class.forName(c, true, myClassLoader);
private static PathClassLoader createClassLoader(ClassLoader parent, PackageInfo packageInfo) { if (classLoaderCache.containsKey(packageInfo.applicationInfo.sourceDir)) { return classLoaderCache.get(packageInfo.applicationInfo.sourceDir); } synchronized (XposedInit.class) { if (classLoaderCache.containsKey(packageInfo.applicationInfo.sourceDir)) { return classLoaderCache.get(packageInfo.applicationInfo.sourceDir); } // XposedBridge.log("create a new classloader for plugin with new apk path: " + packageInfo.applicationInfo.sourceDir); PathClassLoader hotClassLoader = new PathClassLoader(packageInfo.applicationInfo.sourceDir, parent); classLoaderCache.putIfAbsent(packageInfo.applicationInfo.sourceDir, hotClassLoader); return hotClassLoader; } } }
private void invokeHandleHookMethod(Context context, String modulePackageName, String handleHookClass, String handleHookMethod, XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { //原来的两种方式不是很好,改用这种新的方式 File apkFile = findApkFile(context, modulePackageName); if (apkFile == null) { new RuntimeException("寻找模块apk失败").printStackTrace(); } //加载指定的hook逻辑处理类,并调用它的handleHook方法 PathClassLoader pathClassLoader = new PathClassLoader(apkFile.getAbsolutePath(), ClassLoader.getSystemClassLoader()); Class<?> cls = Class.forName(handleHookClass, true, pathClassLoader); Object instance = cls.newInstance(); Method method = cls.getDeclaredMethod(handleHookMethod, XC_LoadPackage.LoadPackageParam.class); method.invoke(instance, loadPackageParam); }
public static void hook(Class clazz, XC_LoadPackage.LoadPackageParam lpparam) throws Exception { String packageName = clazz.getName().replace("."+clazz.getSimpleName(),""); File apkFile = getApkFile(packageName); if (!apkFile.exists()) { Log.e("error", "apk file not found"); return; } filterNotify(lpparam); PathClassLoader classLoader = new PathClassLoader(apkFile.getAbsolutePath(), lpparam.getClass().getClassLoader()); XposedHelpers.callMethod(classLoader.loadClass(clazz.getName()).newInstance(), "dispatch",lpparam); }
private void invokeHandleHookMethod( Context context, String modulePackageName, String handleHookClass, String handleHookMethod, XC_LoadPackage.LoadPackageParam loadPackageParam ) throws Throwable { // 原来的两种方式不是很好,改用这种新的方式 File apkFile = findApkFile(context, modulePackageName); if (apkFile == null) { throw new RuntimeException("Cannot find the module APK."); } // 加载指定的hook逻辑处理类,并调用它的handleHook方法 PathClassLoader pathClassLoader = new PathClassLoader(apkFile.getAbsolutePath(), ClassLoader.getSystemClassLoader()); Class<?> cls = Class.forName(handleHookClass, true, pathClassLoader); Object instance = cls.newInstance(); Method method = cls.getDeclaredMethod(handleHookMethod, Context.class, XC_LoadPackage.LoadPackageParam.class); method.invoke(instance, context, loadPackageParam); }
public static PathClassLoader classLoaderFor(Context context, String packageName) { String neighborLocation = Spies.location(context.getPackageManager(), packageName); return new PathClassLoader(neighborLocation, context.getClassLoader()); }
dexElementsField.setAccessible(true); Object dexElementsObject = dexElementsField.get(pathListObject); PathClassLoader newClassLoader = new PathClassLoader(apk.getPath(), null); Object newPathListObject = pathListField.get(newClassLoader); Object newDexElementsObject = dexElementsField.get(newPathListObject);
PathClassLoader classLoader = new PathClassLoader(apkFile.getAbsolutePath(), PApplet.class.getClassLoader()); String classPath = getSketchPackage(context) + ".MainService";
public static PApplet loadSketchPApplet(Context context, boolean gles) { File apkFile = getSketchApk(context); if (apkFile.exists()) { // Really important to set up our class loader with the default one as parent // Otherwise we get two copies of loaded classes and things get ugly PathClassLoader classLoader = new PathClassLoader(apkFile.getAbsolutePath(), PApplet.class.getClassLoader()); String classPath = getSketchPackage(context) + "." + getSketchClass(context); try { Class<?> sketch = Class.forName(classPath, true, classLoader); if (PApplet.class.isAssignableFrom(sketch)) { return (PApplet) sketch.newInstance(); } } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | ClassCastException e) { e.printStackTrace(); } } // Default wallpaper if things fail return getDefaultSketch(gles); }
dexClassLoader = new PathClassLoader("", dexClassLoader);
PathClassLoader loader = new PathClassLoader(pkgPath, ClassLoader.getSystemClassLoader()); Class<?> hookerClz = Class.forName(Constant.PKG_NAME + ".hook.Hook", true, loader); Object hooker = hookerClz.newInstance();
PathClassLoader pcl = new PathClassLoader(apkName, ClassLoader.getSystemClassLoader()); Class resCls = pcl.loadClass(packageName + ".R");
null, PApplet.class.getClassLoader()); } else { classLoader = new PathClassLoader(dexPathList.toString(), PApplet.class.getClassLoader());
classLoader = new PathClassLoader(apkName, JRubyAdapter.class.getClassLoader());