打包工具(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路径>
其余的命令暂时没用到,咱也不知道啥作用^^。
参考链接
- MAC:@rpath的坑
- Xcode Build Settings中的变量@rpath,@loader_path,@executable_path
- install_name_tool解决dyld: Library not loaded