破解project 发表于 2019-2-24 10:17

通过去classLoader避免Android P反射限制后还原classLoader的方法

本帖最后由 破解project 于 2019-2-24 10:22 编辑

接上一帖

https://www.52pojie.cn/thread-854771-1-1.html

我之前说没有限制的话是不对的,由于反射之后接下来的操作都是调用同类的方法没出现问题,所以我以为没有这类限制。一旦调用以下涉及外部类的代码时
context.startService(new Intent(context, OtherService.class));
就会出现以下错误
java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

所以为了还原classLoader,修复错误,应该...
    /**
   * 恢复classloader:清除loader可能会造成问题
   * (java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available)
   * 反射完成后恢复loader
   *
   * @param cls 需要恢复Loader的类
   */
    public static void restoreLoaderInClass(Class cls) {
      try {
            Field classLoaderField = Class.class.getDeclaredField("classLoader");
            classLoaderField.setAccessible(true);
            //If this object represents a primitive type or void, null is returned.
            if (cls != null && !cls.isPrimitive() && classLoaderField.get(cls) == null) {
                Log.w(TAG, "restoreLoaderInClass: classloader is null!");
                classLoaderField.set(cls, Thread.currentThread().getContextClassLoader());
            }
      } catch (Exception e) {
            Log.e(TAG, "restoreLoaderInClass: ", e);
      }
    }

用法
//在当前类下
public class Reflection9 {
    private static void method() {
      //传入当前类
      clearClassLoaderInClass(Reflection9.class);
      //接下来就可以调用隐私API了...
      SystemService.restart("zygote");
      //还原,当然接下来仍会受到反射限制
      restoreLoaderInClass(Reflection9.class);
    }
}

Yancy-Lan 发表于 2019-2-26 19:05

本帖最后由 Yancy-Lan 于 2019-2-26 19:06 编辑

小白,看不懂,,,评分不了,但还是辛苦你了:(eew
页: [1]
查看完整版本: 通过去classLoader避免Android P反射限制后还原classLoader的方法