首页
社区
课程
招聘
[求助]关于使用DexClassLoader加载的一些问题...
2014-11-24 18:31 9514

[求助]关于使用DexClassLoader加载的一些问题...

2014-11-24 18:31
9514
尝试使用DexClassLoader能够正常加载外部dex文件了,也能正常运行,但还有问题,
就是我这样加载的类  在Jni函数中使用env->FindClass("类名") 获取不到... 求各位大神指教...

[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
点赞0
打赏
分享
最新回复 (12)
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
QEver 5 2014-11-24 19:00
2
0
实际上Android(4.4.4,别的版本源码没看过)系统维护了两份dex cookie,一份在Java层的BaseDexClassLoader类里面(笑而不语。。。),另一份在Native层gDvm.userDexFiles里面。
目前两份没有同步,所以在Java层加载dex之后,Native层获取不到。

解决办法,要么在Native层调Java的方法(BaseDexClassLoader.findClass),要么在Native加载dex。
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
QEver 5 2014-11-24 21:37
3
0
补充以下,libdvm.so里面有个jni函数叫Dalvik_dalvik_system_DexFile_openDexFile,用这个函数加载,可以直接用env->FindClass找到,至于Java层怎么用,自己查查吧,我不知道
雪    币: 155
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
enlangs 2014-11-25 09:25
4
0
感谢提醒,之前就发现了BaseDexClassLoader,但是没有注意这个类的区别。
一语点醒。
雪    币: 59
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
余冬冬 2014-11-25 14:15
5
0
是不是Dalvik_dalvik_system_DexFile_openDexFile只能用于4.0以上的系统?
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
QEver 5 2014-11-25 14:25
6
0
2.3也有这个函数。有一个Dalvik_dalvik_system_DexFile_openDexFile_bytearray是4.0之后才添加的。
雪    币: 59
活跃值: (45)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
余冬冬 2014-11-26 14:38
7
0
按照你说的我在java层获取到了动态加载的类传递到Jni函数
然后使用env->RegisterNatives 注册函数 还是会提示
ERROR: Unable to find decl for native xxx
估计还是没同步的原因,不知道还有没有其他方法...
我没有在Jni层加载dex 是怕兼容性不好 所以在java层加载...
雪    币: 233
活跃值: (285)
能力值: ( LV12,RANK:270 )
在线值:
发帖
回帖
粉丝
QEver 5 2014-11-26 16:16
8
0
env->FindClass返回的实际上是一个LocalReference,RegisterNatives的参数也是。
目测你是结构没搞对。
雪    币: 191
活跃值: (195)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
大王叫我挖坟 3 2016-5-10 11:42
9
0
大神谢谢分享
雪    币: 547
活跃值: (504)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
zeif 2 2016-5-10 18:06
10
0
妖兽!
我一直以为是线程问题,,

因为env是线程隔离的,
雪    币: 547
活跃值: (504)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
zeif 2 2016-8-19 12:36
11
0
两份之间是有同步的,今天由于某些特别原因,找到了这个同步,具体如下

BaseDexClassLoader-->DexPathList-->makeDexElements-->loadDexFile-->DexFile.loadDex-->DexFile-->openDexFile-->openDexFileNative--> Dalvik_dalvik_system_DexFile_openDexFileNative-->addToDexFileTable-->dvmHashTableLookup(gDvm.userDexFiles,xx,xx,xx,true)-->Dex加入gDvm.userDexFiles
雪    币: 133
活跃值: (546)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
njxxdx 2016-8-23 18:51
12
0
这个才是正确
雪    币: 94
活跃值: (1837)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
wangzehua 2016-8-24 09:25
13
0
good~!
游客
登录 | 注册 方可回帖
返回