使用C++与Android联合开发背景
- 陆陆续续做研发做了很多年,学的开发语言不是很多,最主要的还是C++,我喜欢做C++,没有C++做不了的事情,大家都在吹水python 这样的万能胶水语言,但其实python很多库还是使用底层C或者C++来实现的,所以说真正的长久不败的语言还是C++,当然现在也很流行做移动开发,如比较火的android开发,我也非常赞同移动开发是未来的趋势,不管是那个行业都是一样,毕竟现代人的时间越来越宝贵,如何让别人最大效能的利用碎片时间,抓住用户的痛点,才是长久之道。
- 好了废话少说,最近在做一款Android的GIS的地图采集软件,由于对地图显示效率以及跨平台的要求和用户原生体验。打算底层使用c++,上层界面使用android来实现。这款产品使用了各种第三方库,如GDAL,FreeType,QT,geos,sqlite等。具体每个库的的如何使用不在本文的讨论范围之内。
联合调试历程
- 当时android studio还不流行,使用的是elispse做移动端的android开发,但是最大的问题android端不能方便的调试到C++层,虽然网上有很多教程和方法,但这些方法用来写个DEMO 还可以,真正能够很好的用在项目的上的解决方案基本没有。一个很简单的问题可能都要花费一个上午的时间去打日志定位问题,定位问题的修改和测试也是非常的麻烦,根本没有行之有效的解决办法,开发效率非常之低,稳定性非常差。这个效率造成领导对我们的研发进度和成果非常的不满意,没办法,老板是看成果的,没有成果再多的苦劳也是白搭。
- 使用google公司的开源库breakpad。
- 根据官网的介绍,感觉我的福音来了,迫不及待的按照网上的方法编译SO库,当时编译过程中也有很多坑爹的地方(如NDK的版本问题)。
- 花了我两天的时间才把库编译好一个arm-v7a架构的so库,放到程序上跑一遍,发现在android 5.0一下的版本中可以通过DUMP出来的文件信息找到具体的错误位置。在Android 5.0以上就不行了。后来才知道必须要有编译对应版本架构的库才可以查看(当初不知道以为breadpad是有bug)。
- 当上述问题解决之后,又发现一个问题这个只能处理崩溃日志并且要求别人给你dump文件。这个在发布的版本中根本不现实(ps 公司的客户群不像大众,还是会帮忙积极反馈的)。并不是长久之计。
- Virtual studio用户的福音,嵌入式开发神器visualgdb
- VisualGDB的VS插件能够使用GNU Make、CMake、Qt QMake来创建Linux项目,也能够导入已经存在的项目。
- VisualGDB是收费的,大概200美元。
- 当时找的是试用版,通过VisualGDB插件的调试APK功能可以实现与C++联合实时调试。需要注意的是编译的目标版本的架构必须与机器的架构是相同的,不然还是没有办法调试的,这也是我发现breakpad捕获崩溃日志失败的原因。
很好用,但是我们公司的代码是加密的,中软的防泄密软件会造成加密进程经常卡死。所以用的时候会经常出现调试不通的地方。
目前行之有效的解决办法
- 腾讯bugly
腾讯Bugly提供专业的Crash(崩溃)、Android ANR(应用无响应)、iOS卡顿的监控和解决方案
这个方案免费、提供在崩溃日志上报、运维统计、在线日志上传功能。通过一两句代码即可实现这一堆功能,稳定。对于发布的版本的错误追踪非常有效。
- VS 项目配置改变防止崩溃情况(操作步骤)
- C++异常的编译支持(位于项目选项中的“代码生成”->启用C++异常:/EHsc,VC6是Enable Exception handling)
- 代码生成->常规->SDL检查设置为true
这种方式最为简单的防止空指针与野指针崩溃现象,但是这样就找不到他的崩溃信息了。当然还有其他方式获取到非崩溃下的堆栈信息。
- 使用android studio 中编译C++的CMAKE 方案,通过LLDB调试技术可解决联合调试问题