Android如何去除so中cocos2d-x C++符号

1. 为什么要隐藏符号?

1). 隐藏引擎函数,避免引擎核心代码符号在最终so中显示,具有一定的安全提高破解难度意义

2). 引擎符号隐藏后,最终so体积也会减小

3). 笔者曾解压过乱世王者的so, 发现该游戏虽然也是用cocos2dx开发,但却未发现大量相关符号

2. 如何去除符号?

大家可能都知道,在游戏Android.mk中通常会有-fvsibility=hidden选项,该选项便是隐藏符号的,然而,却只能隐藏游戏少数代码的符号,并不能隐藏其他导入静态库,到这里,大家可能会想到直接在cocos2d的mk文件添加选项不就行了,然而经测试,事实并非如此,由于要静态链接,如果导入静态库没有符号便无法链接了。经笔者研究测试发现,可将cocos的mk合并到最终游戏的Android.mk里以达到去除cocos符号的目的。

3. 合并Android.mk后可能遇到的问题

在windows平台,由于ndk编译系统会生成更长路径的临时文件,可能会由于长路径问题产生莫名奇妙的编译错误,笔者也是经过一番研究才发现是由于长路径问题造成。

这里简单分析一下ndk编译系统的编译过程及编译过程哪些步骤可能会由于长路径出问题

1).make.exe分析,各个mk文件,生成每一个需要编译的源文件的编译选项并保存为.cflags.tmp, 在这期间会用到系统命令md以及ndk自带的echo.exe命令管道的方式保存文件, 这一步md命令和windows系统命令管道皆不支持过长路径

2).make.exe进程通过ndk自带的cmp.exe比较.cflags和cflags.tmp差异,如果不同则通过系统的copy命令将.cflags文件覆盖,同时用del命令删除cflags.tmp, 这一步cmp.exe,copy和del命令均不支持过长路径

3).编译代码,参与编译和链接且不支持长路径的进程有cc1.exe, cc1plus.exe, arm-linux-androideabi-g++.exe, arm-linux-androideabi-gcc.exe, ar.exe, as.exe, collect2.exe, ld.exe,当然还有make.exe本身也不支持

4. ndk编译系统windows不支持长路径解决方案

这里直接给出链接,代码全部开源: https://github.com/halx99/wsLongPaths

有兴趣或有任何问题的可以加入QQ群讨论: 386217855

1赞