RecyclerView有2个特征类,是没办法混淆的
RecyclerView.ViewHolder
RecyclerView.Adapter
以我代码为例,进入rv源码,定位setAdatper寻找adapter的实现类
定位出adapter已经改为叫2s4
找到核心的方法,核心的方法不会改变特别大,最多这个onBIndViewHolder名字混淆了,但是入参的格式不会变,我还遇到过连这个名字都没,比如
/**
* 在lzd的q方法增加逻辑
*
* @param obj
* @param position
*/
public static void q(Object obj, int position) {
//对应onBindViewHolder
}
onBindViewHolder的入参是ViewHolder,我们先去挟持2ax获取调用栈信息
static class XXX extends RecyclerView.ViewHolder {
public BB(View itemView) {
super(itemView);
XXXX.XXXX(this, itemView);
}
}
正常ViewHolder的构造函数,是没办法改变的,所以在这个增加我们的切入点代码
得到栈的信息,我们可以反推对应的adapter代码,在adapter的bindViewHolder添加自己的逻辑
public static void getStack(Object obj, View view) {
Log.i("Go00000000xx", "-----------" + view.getClass());
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
for (StackTraceElement stackTraceElement : stackTrace) {
@SuppressLint("DefaultLocale") String re = String.format(
"getClassName:%s,getMethodName:%s,getLineNumber:%s",
stackTraceElement.getClassName(),
stackTraceElement.getMethodName(),
String.valueOf(stackTraceElement.getLineNumber()));
Log.i("Go00000000xx", re);
}
}
输出的日志例如
2023-02-27 21:53:05.353 2227-2227/? I/Go00000000xx: getClassName:dalvik.system.VMStack,getMethodName:getThreadStackTrace,getLineNumber:-2
2023-02-27 21:53:05.353 2227-2227/? I/Go00000000xx: getClassName:java.lang.Thread,getMethodName:getStackTrace,getLineNumber:1724
2023-02-27 21:53:05.353 2227-2227/? I/Go00000000xx: getClassName:com.xxx.mainactivity.RVFixGG,getMethodName:sFix,getLineNumber:48
2023-02-27 21:53:05.353 2227-2227/? I/Go00000000xx: getClassName:X.2ax,getMethodName:<init>,getLineNumber:0
2023-02-27 21:53:05.354 2227-2227/? I/Go00000000xx: getClassName:X.2aw,getMethodName:<init>,getLineNumber:0
2023-02-27 21:53:05.354 2227-2227/? I/Go00000000xx: getClassName:X.1tH,getMethodName:onCreateViewHolder,getLineNumber:72
2023-02-27 21:53:05.354 2227-2227/? I/Go00000000xx: getClassName:X.1tH,getMethodName:onCreateViewHolder,getLineNumber:268435456
2023-02-27 21:53:05.354 2227-2227/? I/Go00000000xx: getClassName:X.2s4,getMethodName:createViewHolder,getLineNumber:15
大致可以猜到那个是adapter,往前推,不是init的就是adapter类了