当我编译我的iOS应用程序的发布版本(基于标准的Apple提供的iOS应用程序模板)时,查看生成的可执行二进制文件,我看到各种符号甚至本地cpp源代码和那里的标题路径。我真的很难过这是为什么(我还没有启用RTTI *)。特别是源文件路径让我觉得在全球范围内发送这个应用程序感到不舒服(为什么每个人都能看到我的开发机器的目录布局?)。
这里有两个(随机挑选,审核)摘录:
TS/../ACTORS/CActorCanvasCharPart.cpplastMeshcapVerticesOFF BOUNDSupload VERTICES: %d
20CActorCanvasCharPartgrassscrub/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.cppbaseShadowmowerstartmowerloopmowermowerCharcutGrassChargrassStuffgrassParticles/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_grass.h17CStateGame2_grasssinwriteStroke/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame2_flowers.hflowerBedsandTrailclickstart3inplace2sandDrag/Volumes/Data/iOS_projects/code/MyAppName_proj/MyAppName/source/STATES/GAMES/2/CStateGame
以下是自定义类型和结构的许多符号:
CAssetMgr="_vptr$CMgrBase"^^?"pMain"^{CMain}"inited"B"curveCount"S"curveSpecs"^{CCurveSpec}"gameSpecs"[23{CGameStateSpec="header"{SpecDiskHeader="type"i"version"S}"gameID"C"backgroundColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"clickPointIconColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}"hintColor"{CRGBAcolorf="r"f"g"f"b"f"a"f}}]"currentFont"^{CCharset}"userCharParts"^^{CCharPart}"words"{CDataSet<CName4,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l}"sets"{CDataSet<CName16,CCharArray>="_vptr$CObjectBase"^^?"pMain"^{CMain}"count"i"data"*"dataSize"l
可以避免这种情况吗?
*更新:我刚发现默认情况下RTTI已启用。所以我清理了目标,禁用了RTTI(GCC_ENABLE_CPP_RTTI = NO)并重新编译。我仍然在二进制文件中看到很多符号和源路径。
更新2:我从应用程序商店检查了一些其他应用程序,其中许多应用程序也显示了源文件路径。非常可怕,如果你问我:
Joined Up Lite
/Users/lloydy/Documents/Development/iPhone/ABC Joined Up/main.m
/Users/lloydy/Documents/Development/iPhone/ABC Joined Up/Classes/SettingsView.m
Crayon Physics
/Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/gameutils/killspriteslowly/killspriteslowly.cpp
/Users/smproot/Desktop/unzip/CrayonPhysics/v104/Classes/crayon/src/ceng/tasks/task/sdl/mixer/ctaskaudiosdlmixer.cpp
Wall Times
/Users/fred/_WORK/ZDNDRP/WallTimes/main.m
/Users/fred/_WORK/ZDNDRP/WallTimes/Classes/SystemCategories.m
Jumbo Calculator
/Users/Christopher/Documents/Development/JumboCalculator 1.0.3/main.m
/Users/Christopher/Documents/Development/JumboCalculator 1.0.3/Classes/CalculatorFaceViewController.m
答案 0 :(得分:6)
文件路径很可能来自断言宏,它将__FILE__
字符串化为其失败消息的一部分。 iOS的assert(3)
实现就像NSAssert
宏一样。
您可以通过定义NDEBUG
(对于C断言)和NS_BLOCK_ASSERTIONS
(对于NSAsserts)来删除发布版本中的断言。
答案 1 :(得分:5)
在Xcode中将Deployment Prostprocessing设置为Yes,以便在构建过程中触发Xcode调用strip命令。然后你没有看到任何来自nm -a的源路径。
但是,我仍然通过strings命令看到一些m文件的源路径:/
答案 2 :(得分:3)
对我来说有用的是为发布版本设置Generate Debug Symbols
到No
。这是在Xcode 7.2中的Apple LLVM 7.0 - Code Generation
下。
答案 3 :(得分:1)
在构建设置中勾选了条带调试符号吗?您可以执行此操作(或不执行此操作),具体取决于配置(构建/发布)。您也可以查看Objective-C Code Obfuscation(长篇大论)。从我收集的内容来看,您无法完全删除objective-c信息,因为所有方法调用都是动态完成的,因此库必须具有有关您的类/方法名称的信息才能运行。一个有用的提示here。
如果您有c ++代码,那么您可以使用gcc strip utility,虽然我不确定Objetive-C ++是怎么样的,如果它不能将您所有的cpp编译成lib ,在iOS项目中删除并链接它。