Mac app 内集成并调用 zipalign 报错 dyld: Library not loaded: @rpath/libc++.dylib

打包工具(mac 版)增加了 electron 内置的自动更新功能,前提是必须对 app 签名才行。今天交给安卓组同学试用时出问题了😂。

使用打包工具内集成的 zipalign(一个对安卓 apk 优化的工具)对 apk 优化时报错了。

Error:

dyld: Library not loaded: @rpath/libc++.dylib
  Referenced from: myAppName.app/Contents/Resources/tool/mac/zipalign
  Reason: image not found

很显然,这是 zipalign 引用动态库 libc++.dylib 且没有找到该库导致的。 找不到的原因在于 @rpath,对 @rpath 的解释可以参考这篇文章

说白了 @rpath 是一个类似 shell 中的变量, zipalign 在运行时会从 @rpath 取出相应的值然后拼接到 /libc++.dylib

事实上,@rpath 在这里对应的值是 /usr/lib,那为什么 zipalign 找不到这个库,原因在这篇文章可以找到。

简单来说,是苹果为了防止第三方恶意修改 app 加了一道防御墙,不允许 app 内部加载动态库或脚本。这些都限于签名的正式 app,未签名的 app 不受限制。

找到了问题的原因,接下来就是如何解决了。

我们继续

install_name_tool 这个工具是专门操作 app内的动态库配置的。

在终端执行以下命令

install_name_tool -change @rpath/libc++.dylib /usr/lib/libc++.dylib myAppName.app/Contents/Resources/tool/mac/zipalign

这样就把 zipalign 内找动态库的链接改好了。

附上 install_name_tool 的简单使用说明 :

查看 install_name_tool 支持哪些参数

install_name_tool -h
Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/install_name_tool
 [-change old new] ... [-rpath old new] ... [-add_rpath new] ... [-delete_rpath old] ... [-id name] input

修改动态库路径

install_name_tool -change <app内的@rpath值> <真实的路径值> <app路径>

其余的命令暂时没用到,咱也不知道啥作用^^。

参考链接

  1. MAC:@rpath的坑
  2. Xcode Build Settings中的变量@rpath,@loader_path,@executable_path
  3. install_name_tool解决dyld: Library not loaded