在SDK开发或使用过程中,我们可能会遇到下面的问题:
1. 怎么判断这个framework里面的库是静态库还是动态库?
2. 使用的framework怎么判断是否含有arm64架构?
3. 模拟器上使用framework链接错误跑不起来怎么办?
......
这些问题其实都可以通过mac的终端指令来解决,其实终端指令就是系统提供的一些工具软件,下面主要列举出常用的几个: lipo、otool、file、nm
file
file是最简单的指令,可以显示文件类型,用于framework中的库时可以判断是静态库还是动态库,从下图file指令两个实例,可以看出
动态库: 显示“Mach-O 64-bit dynamically linked shared library arm64”
静态库: 显示“current ar archive random library” 或“current ar archive ”。
lipo
lipo是最常用的指令,主要包含几个使用case:
- 查看库包含的架构信息
使用方式:lipo -info /framework路径/xxx.framework/xxx
- 合并多个架构,如将模拟器库和真机armv7架构、真机arm64架构合并到一起。
使用方式:lipo -create 库1 库2 -output 合并后的fat库
- 拆分库,如将包含真机库和模拟器库的framework拆分为只含有真机库的framework。
使用方式:lipo 待拆分的fat库 -thin 需拆分框架 -output 新库
otool
otool是个强大(前面提到的两个命令只可以通过otool来解决)的工具,在日常开发中用在以下case:
- 查看库包含的架构信息
使用方式:otool -o /framework路径/xxx.framework/xxx
- 查看当前app或库所使用的iOS系统的动态库
使用方式:打开ipa文件找到可执行文件, 以微信的老版本6.0.1为例:
otool -L /路径/weixin6.0.1/Payload/MicroMessenger.app/MicroMessenger
- 反编译
反编译可以说是个逆向常用的比较黑的操作,还是以微信的ipa为例:
otool -tV /路径/weixin6.0.1/Payload/MicroMessenger.app/MicroMessenger
注意:此命令将输出所有汇编代码,对于微信这种巨型app输出过程很长,做好心理准备,此处也不列出长篇幅的汇编代码。
nm
nm是names的缩写, nm命令主要是用来列出某些文件中的符号(函数和变量等)
NAME
nm - list symbols from object files
SYNOPSIS
nm [-A|-o|--print-file-name] [-a|--debug-syms]
[-B|--format=bsd] [-C|--demangle[=style]]
[-D|--dynamic] [-fformat|--format=format]
[-g|--extern-only] [-h|--help]
[-l|--line-numbers] [-n|-v|--numeric-sort]
[-P|--portability] [-p|--no-sort]
[-r|--reverse-sort] [-S|--print-size]
[-s|--print-armap] [-t radix|--radix=radix]
[-u|--undefined-only] [-V|--version]
[-X 32_64] [--defined-only] [--no-demangle]
[--plugin name] [--size-sort] [--special-syms]
[--synthetic] [--target=bfdname]
[objfile...]
DESCRIPTION
GNU nm lists the symbols from object files objfile.... If no object
files are listed as arguments, nm assumes the file a.out.
For each symbol, nm shows:
# ... run man nm for detials.