-
-
[求助]在Android P ART源码中,ClassLinker::DefineClass调用了Runtime::Current()->GetRuntimeCallbacks()->ClassPreDefine函数。。。。
-
发表于: 2018-11-28 22:16 3245
-
[求助]在Android P ART源码中,ClassLinker::DefineClass调用了Runtime::Current()->GetRuntimeCallbacks()->ClassPreDefine函数。。。。
2018-11-28 22:16
3245
在Android P ART源码中,ClassLinker::DefineClass调用了Runtime::Current()->GetRuntimeCallbacks()->ClassPreDefine函数
ObjPtr<mirror::Class> ClassLinker::DefineClass(Thread* self,
const char* descriptor,
size_t hash,
Handle<mirror::ClassLoader> class_loader,
const DexFile& dex_file,
const DexFile::ClassDef& dex_class_def) {
StackHandleScope<3> hs(self);
auto klass = hs.NewHandle<mirror::Class>(nullptr);
.......
// Get the real dex file. This will return the input if there aren't any callbacks or they do
// nothing.
DexFile const* new_dex_file = nullptr; //
DexFile::ClassDef const* new_class_def = nullptr //
// TODO We should ideally figure out some way to move this after we get a lock on the klass so it
// will only be called once.
/*ClassPreDefine会根据dex_file、dex_class_def生成新的new_dex_file,new_class_def
*/
Runtime::Current()->GetRuntimeCallbacks()->ClassPreDefine(descriptor,
klass,
class_loader,
dex_file,
dex_class_def,
&new_dex_file,
&new_class_def);
.......
}RuntimeCallbacks中对应的是
void RuntimeCallbacks::ClassPreDefine(const char* descriptor,
Handle<mirror::Class> temp_class,
Handle<mirror::ClassLoader> loader,
const DexFile& initial_dex_file,
const DexFile::ClassDef& initial_class_def,
/*out*/DexFile const** final_dex_file,
/*out*/DexFile::ClassDef const** final_class_def) {
DexFile const* current_dex_file = &initial_dex_file;
DexFile::ClassDef const* current_class_def = &initial_class_def;
for (ClassLoadCallback* cb : class_callbacks_) {
DexFile const* new_dex_file = nullptr;
DexFile::ClassDef const* new_class_def = nullptr;
//ClassLoadCallback为 ClassCallback或DbgClassLoadCallback,
cb->ClassPreDefine(descriptor,
temp_class,
loader,
*current_dex_file,
*current_class_def,
&new_dex_file,
&new_class_def);
if ((new_dex_file != nullptr && new_dex_file != current_dex_file) ||
(new_class_def != nullptr && new_class_def != current_class_def)) {
DCHECK(new_dex_file != nullptr && new_class_def != nullptr);
current_dex_file = new_dex_file;
current_class_def = new_class_def;
}
}
*final_dex_file = current_dex_file;
*final_class_def = current_class_def;
}
而ClassCallback的ClassPreDefine方法中
struct ClassCallback : public art::ClassLoadCallback {
void ClassPreDefine(const char* descriptor,
art::Handle<art::mirror::Class> klass,
art::Handle<art::mirror::ClassLoader> class_loader,
const art::DexFile& initial_dex_file,
const art::DexFile::ClassDef& initial_class_def ATTRIBUTE_UNUSED,
/*out*/art::DexFile const** final_dex_file,
/*out*/art::DexFile::ClassDef const** final_class_def)
OVERRIDE REQUIRES_SHARED(art::Locks::mutator_lock_) {
....................
*final_class_def = &dex_file->GetClassDef(0);//返回GetClassDef(0)???????????????
*final_dex_file = dex_file.release();//返回DexFile
.....................
}
}final_class_def = &dex_file->GetClassDef(0)返回的永远是第1个ClassDef,这样的话不是与最初传入的initial_class_def类型完全不一样了吗?
ClassLinker::DefineClass
后面还怎么利用new_class_def来加载类?除非class_callbacks_为null,但是在ti_class.cc是将ClassCallback 对象加入
class_callbacks_中。哪位坛友能帮忙指点一下?万分感谢~~
[培训]科锐软件逆向54期预科班、正式班开始火爆招生报名啦!!!
最后于 2018-11-29 11:44
被倔强石头编辑
,原因:
赞赏
他的文章
赞赏
雪币:
留言: