-
Notifications
You must be signed in to change notification settings - Fork 351
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
一件非常奇怪的事情,调用原方法异常 #83
Comments
update:已验证非 |
奇怪的很,出问题的手机是miui9基于android7.0开发的,我给刷成cm(基于7.1)后能正常工作了. |
看来作者实在是忙,我就把解决问题的过程记录在这里吧,要是我能解决,算是造福后人,如果解决不了,权当抛砖引玉 |
为了能够直观跟踪到代码的具体执行逻辑,我选择使用ida来进行动态调试,结果,令人震惊的事情发生了。我发现编译后,调用原方法的那句指令在最终的汇编指令里是不存在的,也就是说,莫名其妙的消失了?????或是被优化掉了? |
经过多放调试,原因终于找到了。 public static boolean hook(String thiz, String prefix) {
Log.w("YAHFA", "in String.startsWith(): "+thiz+", "+prefix);
return backup(thiz, prefix);
}
public static boolean backup(String thiz, String prefix) {
return false;
} 这个时候,dex2oat在转换机器指令的时候,会直接将整个 所以,之前的有关
这种说法是不够全面的。 完美的解决方案我还没找到,目前我是在 |
内联优化与不同系统编译策略有关,相似问题可见#17 可以尝试在backup中添加try-catch block,这样好像不会被内联优化掉 |
另外一个思路,hook |
人家是怎么快怎么来,你是怎么慢怎么来,干脆不编译,哈哈哈. |
没有办法,内联是为了性能,但是这也给开发带来了极大的不便,尤其是底层开发。比如c++都有 |
hook execv是可以的,但需要再引入native hook的整套框架,坑会比较多 |
我使用的是master分支代码,作为lib 依赖,直接hook的。(不是使用的插件方式。) |
在hook之前,是先通过反射得到目标方法的,所以如果方法找不到,可能是在反射时出错,可以跟进去看是怎么回事 |
显然,
Log.e
。false
环境是N,我猜测原因可能是:
NewGlobalRef
而backup没有,会不会backup被回收了呢?不过按道理来讲,如果他被回收应该崩溃才对,但实际上没有崩溃。有些晕。。。
The text was updated successfully, but these errors were encountered: