老码农谈NDK开发

关于NDK,我也天真过

5、6年前刚拿到HTC的G1开始做Android开发时,得知Java可以和C混编激动不已,真的是拿到钥匙见什么都是锁,老想着用NDK做些事情。到后来公司做了一个带有强烈技术风格的业务决策,我被迫把NDK来回折腾了很长时间,也没能折腾出什么成果,但这个决策却把公司折腾完蛋,我也就对NDK渐渐心恢意冷了,真正体会到,做业务,服务用户为主,技术上,好用是王道。

今天收到一封邮件(来自:[email protected]),让我谈谈NDK,真的挠到了我的痒处,一直有些话是想跟对NDK有想法的人说说的,于是有了这篇文章。

NDK只是配角

还是那句话,做业务服务用户是技术最终价值的体现,技术只有在创造服务的效率上才能比出高下,语言特性、速度、受众都不是真正决定因素。Java从当年的不伦不类走到今天独步江湖,靠的就是生态系统完善,让后台业务的效率提到了前所示有的层次。说到Android,用Java就是因为想借Java生态系统的力形成自己的生态,而祭出NDK,也只是对已经形成的生态系统的一个补充而已。人类组织的特点决定了,对于已经很成熟的体系,没有覆灭危险的时候是不会有根本性的变革的,更多的是修正,否则会得不偿失。

上面几句已经简单给NDK定了性,做为Android生态系统的辅助角色,与Java共同为Android生态系统添砖加瓦。接下来看看它能添什么砖加什么瓦。

NDK的使用场景

1、要求高性能计算的场景。不牵涉复杂工程的角色协同,只是单纯用于计算的话,C的优势至今无可比拟。所以你要做什么复杂的算法,或者在某些数据处理远大于数据交换的场景,尽情的使用吧。

2、重用已有的框架。像多媒体、网络、图形等计算机领域的基础设施,还有Linux这个生态中的很多优秀项目,往往基于C搭建的,历史曲折、工程复杂、计算机量大,要直接搬过来用的话,必须使用NDK来搭桥了。

3、安全。Java的优势在于生态,在Android出现之前,代码主要跑在服务器上,安全性问题少很多。现在做为App发布的话,很多缺陷就暴露了。哪些逻辑不想让人反编译看到,或者哪些需要加密存储,那就又NDK吧,加个壳,做个运行时加解密之类的,都是它的强项。

4、脚本。对于有些超级App来说,业务复杂性超乎想象,有时需要脚本支持,那只能通过NDK搭桥引入脚本引擎了。也个属于第2条的子集。

5、跨平台。同一个业务的不同平台产品,肯定是有些共性的东西的,像我做过的淘宝彩票的部分彩种的算奖之类的。同样的东西,用Java写一遍,再用OC写一遍,浪费时间,重复测试,麻烦的很。

6、针对硬件平台的优化。如果一款手机使用了GPU,那么想把这款GPU的特性发挥到极致的话,只能用NDK架接优化代码了。

7、NDK专属API。基本都是些Linux标准API,时刻提醒着Android是个换了马甲的Linux。有一部分在Java端是调用不到的,虽然可能性很小,但不排除哪天会用到,了解一下,备用着没有坏处。

8、Hook。这个最经典的就是Xposed了。国内手机淘宝架构组改进后的缩减版Xposed影响力也不小,也确实解决了一部分刚需,定位在Hook程序自身进程中的任意API,并且基于这个缩减版的Xposed做出了一套完整的客户端监控体系。国内有不少大公司,像美团什么的,也都在探索这块儿。这个都是用户量到了一定级别之后变成刚需的。

容易踩坑的地方

关于NDK环境下的开发,我体会比较深,也是稍微会走些弯路的地方有几点:

1、写代码的环境,试了几种组合之后,发现还是在Xcode里面开发完成,然后到NDK环境下编译比较好。

2、Java与C之间的桥接,也就是JNI,不过呢,有了老码农在10年的时候翻译的Sun官方的电子版JNI规范,就没有什么解决不了的问题了。(http://blog.csdn.net/a345017062/article/category/1256568)

3、编译体系。NDK开发是用Android Makefile来做的,它的运行逻辑同Linux的标准Makefile基本一致,但细节上又有不少差异。不过有了老码农在11年做的几篇简明教程,就可以很快上手了。
http://blog.csdn.net/a345017062/article/details/6130264
http://blog.csdn.net/a345017062/article/details/6096795
http://blog.csdn.net/a345017062/article/details/6442325

4、NDK crash的收集。为了代码保密,通常so发布时要去掉Debug信息的,那怎么收集和定位C层代码的Crash信息呢?看看google-breakpad就好了。有个淘宝的人基于它做了一套Crash收集系统,很方便很实用,不知现在是否向外部开源了。

你可能感兴趣的:(Android,App)