通过去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:06 编辑
小白,看不懂,,,评分不了,但还是辛苦你了:(eew
页:
[1]