最近用android4.2.2版本库做开发,发现android.jar中很多类包含的函数,和安卓源码中比较起来都不全。比如我需要的,dalvik.system.DexFile.getClassNameList和defineClass等函数就没有。
我百度了下,找到了sdk中倒是有个layoutlib.jar,里面有dalvik.system.DexFile.getClassNameList和defineClass等函数。
于是我在工程中同时引入了这两个库:android.jar和layoutlib.jar。
我是利用反射调用的函数,代码是这样:
private String[] getClassNameList(int cookie) {
Log.i(TAG,"dexFileClassName-"+DexFile.class.getName());
return (String[]) RefInvoke.invokeStaticMethod(DexFile.class.getName(),
"getClassNameList", new Class[] { int.class },new Object[] { cookie });
}
private Class defineClass(String name, ClassLoader loader, int cookie) {
return (Class) RefInvoke.invokeStaticMethod(DexFile.class.getName(),
"defineClass", new Class[] { String.class, ClassLoader.class,int.class },
new Object[] { name, loader, cookie });
}
运行后却依然提示找不到getClassNameList()方法,我想这两个库中都有dalvik.system.DexFile可能编译器分不清,于是我又交换了jar包加载顺序还是找不到getClassNameList()。各位高手,请问我该如何指定ClassLoader只加载layoutlib.jar中的dalvik.system.DexFile而不加载android.jar中的dalvik.system.DexFile呢?另外,我还重新编译了4.2.2源码,得到的android.jar中依然没有getClassNameList()方法,是我编译错误了还是本来就不在这里?谢谢!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)