M1適配,New Build System,模擬器卡頓,Rosetta

環(huán)境:
M1芯片
New Build System
simulator

報錯內(nèi)容:
模擬器運行會報錯,真機運行正常
Build input file cannot be found: '…/Library/Develop/Xcode/DerivedData/.../Debug-iphonesimulator/XXX.app/XXX' (in target 'XXX' from project 'XXX')

或者還有這種報錯:
找不到某個pods庫的頭文件,比如AFNetworking.h, module xxx等

或者報錯:
找不到Swift-OC橋接文件 xxx.h

或者還有關(guān)于arm64的報錯都可以嘗試

原因:
1.從Xcode12開始,Build-setting -> UserDefined中的VALID ARCHS被刪除(可以自己加回來但沒必要),更換為Build-setting -> architectures中的Excluded Architectures.
2.New Build System將被廢棄

更新

3.在之前的mac上,arm64被自動轉(zhuǎn)換為x86_64,但是在m1上arm64是有效的架構(gòu),于是不會轉(zhuǎn)換為x86_64,但是很多庫并沒有支持arm64,于是就出現(xiàn)這些報錯.

如何解決:
1.設(shè)置主項目的Excluded Architectures, target和project都有這項設(shè)置,可以都設(shè)置上

image.png

2.設(shè)置pod項目的Excluded Architectures,在podfile中添加

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end

如果有其他設(shè)置,在" installer.pods_project.build_configurations.each do |config|"下面增加EXCLUDED_ARCHS這行就行.
接下來執(zhí)行pod install,
完成之后可以看到pod下的project和target全部都設(shè)置了Excluded Architectures

3.如果你的Build-setting -> UserDefined中還有VALID ARCHS,那么應(yīng)該刪除,選中,點左邊的減號.

最后clean ,清空/Library/Develop/Xcode/DerivedData文件夾, 再重新編譯.

如果仍然不能解決:
首先考慮更新cocoapods: arch -x86_64 pod update (在M1上需要執(zhí)行這個命令,其他的正常pod update)
然后還不行可能要考慮重裝cocoapods

另外RN項目可能有其他的設(shè)置需要注意,至少得更新一下.

排除了arm64之后,控制臺會報警告
Warning: Error creating LLDB target at path '/Users/trigger/Library/Developer/Xcode/DerivedData/XXX-aezbsmdulhwyqxbynkcbeetgpngt/Build/Products/Debug-iphonesimulator/XXX.app'- using an empty LLDB target which can cause slow memory reads from remote devices.

為什么模擬器會報錯找不到第三方庫
在M1芯片之前,模擬器是x86_64架構(gòu)(更早的是i386),真機是arm系列,armv7,armv7s,arm64,arm64e這些.
制作靜態(tài)庫的時候,分別制作了模擬器和真機,Intel芯片制作的模擬器版本靜態(tài)庫是x86_64,而M1是arm64,
通常會把模擬器和真機的用lipo命令合在一起,并且合并的時候相同的架構(gòu)是需要去掉一個的,通常我們?nèi)サ裟M器的arm64,因為去掉真機的,手機就不能編譯了.
現(xiàn)在M1的mac制作的模擬器版本是arm64,真機也有arm64,就無法合并了,本來m1的模擬器就需要arm64的架構(gòu),現(xiàn)在刪掉模擬器的arm64導(dǎo)致m1上的模擬器無法使用這個合并后的靜態(tài)庫.
那為什么真機的arm64模擬器不能用呢,因為實際上這倆還是不一樣的.

現(xiàn)在有兩種解決方案,一是把模擬器和Xcode設(shè)置為Rosetta模式(只是運行app project的話,只設(shè)置模擬器也行),這樣的話模擬器就使用x86_64的架構(gòu).
第二種方案就是wwdc19新增的XCFramework.
還是合并,只不過使用新的指令,這樣的話就不用刪除模擬器的arm64了.

1.合并.a
xcodebuild -create-xcframework -library <path> [-headers <path>] [-library <path> [-headers <path>]...] -output <path>

xcodebuild -create-xcframework -library youpath/TestFramework.a -headers youpath/TestFramework -library youpath/TestFramework.a -headers youpath/TestFramework -output youpath/TestFramework.xcframework

2.合并.framework
xcodebuild -create-xcframework -framework <path> [-framework <path>...] -output <path>

xcodebuild -create-xcframework -framework Release-iphoneos/TestFramework.framework -framework Release-iphonesimulator/TestFramework.framework -output TestFramework.xcframework

使用Rosetta打開解決卡頓問題
模擬器里,列表完全不能滑動,只能一下一下的跳,甚至滑動手勢都不能識別.開啟使用Rosetta打開就正常了.
duck欄右鍵simulator,選項->在Finder中顯示->右鍵顯示簡介->勾選

image.png

同理Xcode也可以勾選,界面會更流暢,刷新率更高.

另外Xcode14的模擬器的顯示簡介里沒有使用Rosetta打開這項,需要在模擬器的路徑,顯示包內(nèi)容,然后打開info.plist,
刪除一項Application Requires Native Environment.
然后可能需要重啟一下,在看模擬器的顯示簡介里就有"使用Rosetta打開了".

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容