导入的 dylib 文件在打包应用程序后导致崩溃
Imported dylib files causing crash after packaging app
我之前在我的带有嵌入式 JRE 的代码签名(沙盒)应用程序中遇到了这个错误(在 this tutorial 之后):
Library not loaded: /usr/X11/lib/libfreetype.6.dylib
Referenced from: /Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libfontmanager.dylib
我解决这个问题的方法是将这些 dylib 导入到与 libfontmanager 相同的目录中:
libfreetype.6.dylib
libpng16.16.dylib
libbz2.1.0.dylib
libSystem.B.dylib
libz.1.dylib
然后 运行 这些命令 libfontmanager/libfreetype。6.dylib
install_name_tool -change /usr/X11/lib/libfreetype.6.dylib @rpath/libfreetype.6.dylib libfontmanager.dylib
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @rpath/libfreetype.6.dylib libfreetype.6.dylib
install_name_tool -change /usr/lib/libz.1.dylib @rpath/libz.1.dylib libfreetype.6.dylib
install_name_tool -change /usr/lib/libbz2.1.0.dylib @rpath/libbz2.1.0.dylib libfreetype.6.dylib
install_name_tool -change /usr/local/lib/libpng16.16.dylib @rpath/libpng16.16.dylib libfreetype.6.dylib
install_name_tool -change /usr/lib/libSystem.B.dylib @rpath/libSystem.B.dylib libfreetype.6.dylib
然后我对每个 dylib/jar + 应用程序
进行代码设计
codesign -v --deep --verbose=4 -f -s "3rd Party Mac Developer Application: Company" --verbose --entitlements Game.entitlements Game.app
find Game.app/Contents/ -type f \( -name "*.jar" -or -name "*.dylib" \) -exec codesign --verbose=4 --deep -f -s "3rd Party Mac Developer Application: Company" --entitlements Game.entitlements {} \;
即使经过代码签名,该应用程序仍能完美运行!
唯一的问题是打包安装后
productbuild --component Game.app /Applications -s "3rd Party Mac Developer Installer: Company" Game.pkg
sudo installer -store -pkg Game.pkg -target /
该应用程序在打开时出现此错误
lsd[346]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
kernel[0]: CODE SIGNING: cs_invalid_page(0x118113000): p=658[JavaAppLauncher] final status 0x3000200, denying page sending SIGKILL
kernel[0]: CODE SIGNING: process 658[JavaAppLauncher]: rejecting invalid page at address 0x118113000 from offset 0x15000 in file "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libz.1.dylib" (cs_mtime:1476852998.0 == mtime:1476852998.0) (signed:1 validated:1 tainted:1 wpmapped:0 slid:0)
com.apple.xpc.launchd[1]: (com.company.gameOSX.80672[658]) Binary is improperly signed.
这是什么原因造成的?
编辑:我发现了一些可以回答我的问题的东西。我在提取的应用程序上 运行 这些命令,它工作得很好。
sudo codesign -f -s - "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libbz2.1.0.dylib"
sudo codesign -f -s - "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libSystem.B.dylib"
sudo codesign -f -s - "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libz.1.dylib"
是什么导致这些 dylib 在打包后无法正确进行代码签名,我该如何解决这个问题?
我明白了。出于某种原因,导致崩溃的 dylib 文件在使用我的签名 ID 对其进行代码签名时不起作用。一切正常,直到打包和解压,这很奇怪。
我最终删除了导致崩溃的三个 dylib 文件,我的应用程序甚至在解压后也能正常工作!
我之前在我的带有嵌入式 JRE 的代码签名(沙盒)应用程序中遇到了这个错误(在 this tutorial 之后):
Library not loaded: /usr/X11/lib/libfreetype.6.dylib
Referenced from: /Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libfontmanager.dylib
我解决这个问题的方法是将这些 dylib 导入到与 libfontmanager 相同的目录中:
libfreetype.6.dylib
libpng16.16.dylib
libbz2.1.0.dylib
libSystem.B.dylib
libz.1.dylib
然后 运行 这些命令 libfontmanager/libfreetype。6.dylib
install_name_tool -change /usr/X11/lib/libfreetype.6.dylib @rpath/libfreetype.6.dylib libfontmanager.dylib
install_name_tool -change /usr/local/lib/libfreetype.6.dylib @rpath/libfreetype.6.dylib libfreetype.6.dylib
install_name_tool -change /usr/lib/libz.1.dylib @rpath/libz.1.dylib libfreetype.6.dylib
install_name_tool -change /usr/lib/libbz2.1.0.dylib @rpath/libbz2.1.0.dylib libfreetype.6.dylib
install_name_tool -change /usr/local/lib/libpng16.16.dylib @rpath/libpng16.16.dylib libfreetype.6.dylib
install_name_tool -change /usr/lib/libSystem.B.dylib @rpath/libSystem.B.dylib libfreetype.6.dylib
然后我对每个 dylib/jar + 应用程序
进行代码设计codesign -v --deep --verbose=4 -f -s "3rd Party Mac Developer Application: Company" --verbose --entitlements Game.entitlements Game.app
find Game.app/Contents/ -type f \( -name "*.jar" -or -name "*.dylib" \) -exec codesign --verbose=4 --deep -f -s "3rd Party Mac Developer Application: Company" --entitlements Game.entitlements {} \;
即使经过代码签名,该应用程序仍能完美运行!
唯一的问题是打包安装后
productbuild --component Game.app /Applications -s "3rd Party Mac Developer Installer: Company" Game.pkg
sudo installer -store -pkg Game.pkg -target /
该应用程序在打开时出现此错误
lsd[346]: LaunchServices: Could not store lsd-identifiers file at /private/var/db/lsd/com.apple.lsdschemes.plist
kernel[0]: CODE SIGNING: cs_invalid_page(0x118113000): p=658[JavaAppLauncher] final status 0x3000200, denying page sending SIGKILL
kernel[0]: CODE SIGNING: process 658[JavaAppLauncher]: rejecting invalid page at address 0x118113000 from offset 0x15000 in file "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libz.1.dylib" (cs_mtime:1476852998.0 == mtime:1476852998.0) (signed:1 validated:1 tainted:1 wpmapped:0 slid:0)
com.apple.xpc.launchd[1]: (com.company.gameOSX.80672[658]) Binary is improperly signed.
这是什么原因造成的?
编辑:我发现了一些可以回答我的问题的东西。我在提取的应用程序上 运行 这些命令,它工作得很好。
sudo codesign -f -s - "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libbz2.1.0.dylib"
sudo codesign -f -s - "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libSystem.B.dylib"
sudo codesign -f -s - "/Applications/Game.app/Contents/PlugIns/jdk1.7.0.jdk/Contents/Home/jre/lib/libz.1.dylib"
是什么导致这些 dylib 在打包后无法正确进行代码签名,我该如何解决这个问题?
我明白了。出于某种原因,导致崩溃的 dylib 文件在使用我的签名 ID 对其进行代码签名时不起作用。一切正常,直到打包和解压,这很奇怪。
我最终删除了导致崩溃的三个 dylib 文件,我的应用程序甚至在解压后也能正常工作!