一学就会的NDK开发

关于NDK开发的入门,这里有一篇我刚开始做NDK开发和逆向相关工作时候的总结,现在看,相比一些水文还是有一丢丢的内容的。关于编译的入门就说这么多,下面讲一点补充的内容。

1、关于线上native的崩溃捕获:

这一部分原理性的知识可以看下腾讯bugly的思路。主要是利用linux提供的系统调用sigaction对崩溃signal进行处理。我们自己的应用也是接入的bugly,不论是提供的服务,还是适配性、稳定性都是非常好的。
这里把实现中遇到的问题简单描述一下:
a、关于unwind 可以参考这篇文章的实现。
b、如果崩溃的位置是java层调用下来的,则java层和native层的线程是同一个,都是linux系统提供的。
c、关于打印出对应java堆栈,可以尝试使用setjmp()保存可靠的java环境信息,然后调用longjmp(),最后利用jni回调java层来打印堆栈的方式,我做了尝试是可行的。
其实把这部分做的稳定,并且适配性很好是非常难的。

2、关于native的hook:

主要介绍PLT hook,同样这部分的原理性内容可以看爱奇艺的技术分享,这一部分的内容可以参考文章开始提供的总结,以及利用010edit去打开一个so来看。这里只做一点补充说明,使用PLT hook只能实现对外部调用的hook,比如libc.so提供的功能的hook,而so内部函数的hook则没有办法实现。这部分内容还是相当有价值的,像微信 Android 终端内存优化实践就把PLT hook libc的malloc、free、new、delete等函数作为检测native是否有申请了内存没释放的手段。

你可能感兴趣的:(一学就会的NDK开发)