上一篇文章讲到使用AOP技术,从字节码上修改Thread,但未通过Java创建的线程无法监控到,那如何能监控到Native创建的线程呢?
首先看下Thread源码的创建过程:
Android上创建一条线程的流程如下:
使用ASM修改JAVA 字节码的方式虽然可以解决应用层创建线程的问题,但是so内创建线程的无法定义。如果在pthread创建线程时,可以把当前的调用栈信息(包括线程id、方法名、函数名、行号?)保存到内存或文件,在需要分析时再根据线程id匹配相应的文件实现跟踪,将会对优化线程相关问题分析的效率有极大帮助。
Native Hook方式有PLT和inline方式,不过inline hook的方式兼容性不好,且不稳定。
PLT方式成熟方案有xhook,bhook都可以满足需求。
通过Art Native Hook的方式在创建线程时代理到自定义的方法内: