做 iOS 自动化,需要用到 libimobiledevice 家族命令,比如 ideviceinfo 获取 iOS 的设备信息,但官方并没有提供直接下载 binary 的可执行文件,这些家族命令文件需要自己去生成,下面是我总结的生成方法,提供参考。

ps:之所以要自己打包,是因为自己用的老版本 ideviceinfo 不兼容高版本的 iPhone,而最新版本是可以的

下载最新包

libimobiledevicerelease下下载最新的 release 包

编译构建

# 配置,生成make文件
./configure --disable-openssl

# 构建
make

# 安装(这一步可选,如果你希望可以全局使用libimobiledevice家族工具,可以执行)
make install

./configure --disable-openssl成功日志如下:(仅摘取最后部分日志)

checking whether make supports nested variables... (cached) yes
checking that generated files are newer than configure... done
configure: creating ./config.status
config.status: creating Makefile
config.status: creating common/Makefile
config.status: creating src/Makefile
config.status: creating src/libimobiledevice-1.0.pc
config.status: creating include/Makefile
config.status: creating tools/Makefile
config.status: creating cython/Makefile
config.status: creating docs/Makefile
config.status: creating doxygen.cfg
config.status: creating config.h
config.status: executing depfiles commands
config.status: executing libtool commands

Configuration for libimobiledevice 1.3.0:
-------------------------------------------

  Install prefix: .........: /usr/local
  Debug code ..............: no
  Python bindings .........: no
  SSL support backend .....: GnuTLS

  Now type 'make' to build libimobiledevice 1.3.0,
  and then 'make install' for installation.

make构建命令成功日志如下:(仅摘取最后部分日志)

Making all in tools
  CC       idevice_id-idevice_id.o
  CCLD     idevice_id
  CC       ideviceinfo-ideviceinfo.o
  CCLD     ideviceinfo
  CC       idevicename-idevicename.o
  CCLD     idevicename
  CC       idevicepair-idevicepair.o
  CCLD     idevicepair
  CC       idevicesyslog-idevicesyslog.o
  CCLD     idevicesyslog
  CC       ideviceimagemounter-ideviceimagemounter.o
  CCLD     ideviceimagemounter
  CC       idevicescreenshot-idevicescreenshot.o
  CCLD     idevicescreenshot
  CC       ideviceenterrecovery-ideviceenterrecovery.o
  CCLD     ideviceenterrecovery
  CC       idevicedate-idevicedate.o
  CCLD     idevicedate
  CC       idevicebackup-idevicebackup.o
  CCLD     idevicebackup
  CC       idevicebackup2-idevicebackup2.o
  CCLD     idevicebackup2
  CC       ideviceprovision-ideviceprovision.o
  CCLD     ideviceprovision
  CC       idevicedebugserverproxy-idevicedebugserverproxy.o
  CCLD     idevicedebugserverproxy
  CC       idevicediagnostics-idevicediagnostics.o
  CCLD     idevicediagnostics
  CC       idevicedebug-idevicedebug.o
  CCLD     idevicedebug
  CC       idevicenotificationproxy-idevicenotificationproxy.o
  CCLD     idevicenotificationproxy
  CC       idevicecrashreport-idevicecrashreport.o
  CCLD     idevicecrashreport
  CC       idevicesetlocation-idevicesetlocation.o
  CCLD     idevicesetlocation
Making all in docs
make[2]: Nothing to be done for `all'.
make[2]: Nothing to be done for `all-am'.

至此,libidevicemobile 家族的一系列工具就生成完成了,如下图所示:

image-20210118162104443

补:后来测试发现,上图中的都是快捷方式,真正的 binary 在隐藏的文件夹./lib下,并且有.deps 依赖文件,要使用 libimobiledevice 工具,那么直接使用 tools 里面的所有文件即可,如果单纯只用.libs 下的文件,会缺少依赖。

image-20210118164610428

但这些 binary 并不能直接使用,还依赖对应的 dylib,比如 ideviceinfo,执行后报错:

dyld: Library not loaded: /usr/local/lib/libimobiledevice-1.0.6.dylib002E
  Referenced from: xxx/tools/iOS/tools/./ideviceinfo
  Reason: image not found
Abort trap: 6

测试发现,这些 binary 只依赖这个 libimobiledevice-1.0.6.dylib,我们在使用 make install 命令安装的时候就会生成这个动态链接库,并把它移动到/usr/local/lib 下。

如下是我自己打包的 libimobiledevice binary,提供大家下载(仅仅打包了 mac 下的)

https://github.com/cmlanche/libimobiledevice-binaries

疑问

为什么这个生成命令和官方 github 上写的不一样,并且缺少autogen.sh文件?

通过对比我们知道 libimobiledevice 的源码跟官方发布的 release 的文件是不一样的,官方打包源码生成 release 包之间肯定还做了什么,不过没关系,我们用源码来生成 binary 也是一样的,用源码生成执行以下命令即可,效果等同:

# 配置
./autogen.sh

# 构建,生成binary
make 

# 安装到你的电脑
make install


↙↙↙阅读原文可查看相关链接,并与作者交流