M1芯片-xcode開發(fā)踩坑記

除了能在AppStore下到或者可以輕易獲取的工具,我的iOS開發(fā)環(huán)境還需要以下環(huán)境支持:

homebrew

cocoapods

fastlane

xcode的arm64模擬器

homebrew

原始的寫法因為無法訪問raw.githubusercontent.com桦他,可能導(dǎo)致安裝卡住或者失敗果港。

經(jīng)過一番踩坑芒炼,最終找到了這個網(wǎng)站:

brew.idayer.com/

使用以下命令分別安裝arm版和x86版的homebrew:

/bin/bash -c"$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"復(fù)制代碼

arch -x86_64 /bin/bash -c"$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install.sh)"復(fù)制代碼

arm版會被安裝到/opt/homebrew/bin/brew目錄,x86版會被安裝到/usr/local/bin/brew目錄拟烫。

安裝成功后,會有提示需要手動執(zhí)行一段腳本:

echo'eval "$(/opt/homebrew/bin/brew shellenv)"'>> ~/.zprofileeval"$(/opt/homebrew/bin/brew shellenv)"復(fù)制代碼

可以手動編輯用戶根目錄下的.zprofile文件,確保含有如下內(nèi)容:

eval"$(/opt/homebrew/bin/brew shellenv)"exportHOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles/bottlesaliasabrew='arch -arm64 /opt/homebrew/bin/brew'aliasibrew='arch -x86_64 /usr/local/bin/brew'復(fù)制代碼

保存后再執(zhí)行source ~/.zprofile刷新配置货徙。

此時,輸入brew -v皮胡、ibrew -v痴颊、abrew -v可以看到如下信息:

mirari@MBA ~ % brew -vHomebrew 3.2.4Homebrew/homebrew-core (git revision 64a2874e87; last commit 2021-07-27)Homebrew/homebrew-cask (git revision 9d5abe6a67; last commit 2021-07-27)mirari@MBA ~ % ibrew -vHomebrew 3.2.5Homebrew/homebrew-core (git revision 507807b9dc; last commit 2021-07-27)mirari@MBA ~ % abrew -vHomebrew 3.2.4Homebrew/homebrew-core (git revision 64a2874e87; last commit 2021-07-27)Homebrew/homebrew-cask (git revision 9d5abe6a67; last commit 2021-07-27)復(fù)制代碼

說明安裝正常。

之前可能因為網(wǎng)絡(luò)等原因屡贺,我的homebrew雖然安裝成功了蠢棱,但安裝大多數(shù)工具锌杀,比如bob和fastlane,都會提示找不到叫這個名字的工具裳扯。

錯誤信息為Could not resolve HEAD to a revision抛丽。

使用brew -v可以看到,homebrew-core沒有HEAD饰豺。

執(zhí)行以下命令可以修復(fù):

git -C $(brew --repository homebrew/core) reset --hard HEAD.復(fù)制代碼

但是為了穩(wěn)妥起見,我還是rm -rf了兩個brew的目錄重新安裝了一遍允蜈。

fastlane

homebrew安裝成功后冤吨,直接運(yùn)行brew install fastlane即可安裝成功。

cocoapods

之前有段文字提示brew上的cocoapods已經(jīng)停止更新饶套,需要改用gem安裝漩蟆,現(xiàn)在去看已經(jīng)沒有了,brew上直接運(yùn)行brew install cocoapods即可妓蛮。

M1芯片的arm64模擬器

這是最坑的部分怠李。

新鮮出爐的M1環(huán)境xcode在運(yùn)行以前的老項目時,遇到了一堆問題蛤克,比如這樣的錯誤信息:

building for iOS Simulator-x86_64 but attempting to link with file built for iOS Simulator-arm64復(fù)制代碼

或者提示找不到對應(yīng)的Framework捺癞,或者提示在當(dāng)前arch下當(dāng)前的Symbol無法識別。

解決方案1:

在訪達(dá)的應(yīng)用程序列表中构挤,找到xcode髓介,右鍵選擇顯示簡介,然后勾選“使用Rosetta打開”筋现。

簡單粗暴無腦唐础。這樣啟動的xcode,模擬器就是x86的了矾飞,完美適配x86環(huán)境一膨。包括那些沒有在xcframework的模擬器里編譯arm64的依賴都可以正常運(yùn)行。

但是xcode的執(zhí)行效率會受影響洒沦,我不能接受豹绪。

順帶一提,直接從官網(wǎng)下載的Mac版IntelliJ IDEA就是x86版的微谓,在M1環(huán)境下運(yùn)行卡頓很嚴(yán)重森篷,用了一天整個人都難受了,插件Power Mode II的打字特效掉幀嚴(yán)重豺型,不得不關(guān)閉仲智。需要在官網(wǎng)下載前,點擊下載按鈕右側(cè)切換到arm版姻氨,從此絲般順滑钓辆。

我自己制作的xcframework包在模擬器環(huán)境同時包含了x86_64和arm64(谷歌就是這樣),要是M1芯片還跑x86,不是媚眼拋給瞎子看前联?

但是要讓項目在arm64下跑起來功戚,配置也不容易,經(jīng)過一番嘗試似嗤,解決方案大致如下:

解決方案2:

這里涉及3個編譯目標(biāo)啸臀,分別是:

pod依賴的第三方庫Target,包括源碼和Framework

本地用于編譯Framework的自有庫源碼Target

調(diào)用以上依賴并運(yùn)行在模擬器或真機(jī)上的應(yīng)用Target

運(yùn)行在模擬器或真機(jī)上的應(yīng)用Target

首先確保用于調(diào)用Framework和運(yùn)行模擬器的應(yīng)用項目Target本身的Build Settings配置如下:

Architectures為默認(rèn)值$(ARCHS_STANDARD)

在M1芯片下烁落,模擬器的默認(rèn)值應(yīng)該是arm64,?armv7

Build Active Architecture Only的Debug為Yes(前提是模擬器用Debug方式運(yùn)行)

這一步的作用是讓模擬器編譯目標(biāo)時只編譯arm64的代碼乘粒,不要嘗試x86等arch的編譯。因為它依賴的pod和自有庫的arch會被指定為只有一個arm64伤塌,如果嘗試其他arch編譯就會報錯灯萍。

刪除Excluded Architectures

這一步的作用是讓pod來管理此項參數(shù),不要手動設(shè)置值每聪。手動設(shè)置這項值時旦棉,pod安裝會有一段警告提示。

[!] The `Demo [Debug]` target overrides the `EXCLUDED_ARCHS[sdk=iphonesimulator*]` build setting defined in `../Pods/Target Support Files/Pods-Demo/Pods-Demo.debug.xcconfig'. This can lead to problems with the CocoaPods installation? ? - Use the `$(inherited)` flag, or? ? - Remove the build settings from the target.復(fù)制代碼

刪除Valid Architectures

xcode12的新項目應(yīng)該默認(rèn)移除了此項參數(shù)药薯。新版xcode不再需要用這個參數(shù)來指定archs绑洛。

pod依賴的第三方庫Target

在podfile中添加鉤子

post_installdo|installer|installer.pods_project.targets.eachdo|target|target.build_configurations.eachdo|config|config.build_settings['ONLY_ACTIVE_ARCH']='NO'endendend復(fù)制代碼

因為手動在xcode里修改pod的project是沒用的,pod install一執(zhí)行果善,一切修改都會還原诊笤。因此需要用鉤子來處理pod安裝的配置項。

這一步的作用是讓pod在編譯時編譯所有archs巾陕,也就是包括了x86和arm64.

之所以要這樣做讨跟,是因為模擬器環(huán)境的pod安裝時仍然會把開源的依賴以x86形式編譯(我推測),也就導(dǎo)致了上面那個building for iOS Simulator-x86_64 but attempting to link with file built for iOS Simulator-arm64錯誤鄙煤。因此我們用這段語句讓pod強(qiáng)制編譯所有arch晾匠。

本地用于編譯Framework的自有庫源碼Target

其余配置參考上面的應(yīng)用Target,但是Build Active Architecture Only這一項需要改為NO梯刚,也就是手動操作了上面pod的那段配置凉馆。

最后,記得刪除pods目錄亡资,刪除項目緩存澜共,然后再執(zhí)行編譯。

解決方案3

其他操作都類似方案2锥腻,但是將pod和自有庫的那個Build Active Architecture Only配置項嗦董,改為操作Excluded Architectures。具體操作為:

pod依賴的第三方庫Target

在podfile中添加鉤子

post_installdo|installer|installer.pods_project.build_configurations.eachdo|config|config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"]="arm64"endend復(fù)制代碼

本地用于編譯Framework的自有庫源碼Target

Debug下的Build Active Architecture Only保持YES瘦黑,但是Excluded Architectures設(shè)置為arm64京革。

這一步的作用是讓Pod依賴和自有庫模擬器編譯時奇唤,排除arm64。

出處:stackoverflow.com/a/63955114/…

按理說這樣arm64的模擬器運(yùn)行時應(yīng)該會報錯匹摇,但是實際上確實可以執(zhí)行咬扇,我也不知道為什么了╮(╯▽╰)╭

不過雖然應(yīng)用本身能正常運(yùn)行,但自有庫還需要在打包時包含所有的archs廊勃。之前在pod里面過濾了arm64懈贺,如果自有庫依賴了pod中的有源碼的開源庫,就會導(dǎo)致編譯打包時丟失arm64的arch坡垫,從而報錯隅居。因此如果項目本身是單純的應(yīng)用,使用方案3排除arm64會更節(jié)省資源葛虐,編譯更快速。如果是工具庫棉钧,就得使用方案2屿脐,編譯所有archs。


歡迎大家加入QQ群一起交流學(xué)習(xí):

464406500

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宪卿,一起剝皮案震驚了整個濱河市的诵,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌佑钾,老刑警劉巖西疤,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異休溶,居然都是意外死亡代赁,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門兽掰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芭碍,“玉大人,你說我怎么就攤上這事孽尽〗押荆” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵杉女,是天一觀的道長瞻讽。 經(jīng)常有香客問我,道長熏挎,這世上最難降的妖魔是什么速勇? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮婆瓜,結(jié)果婚禮上快集,老公的妹妹穿的比我還像新娘贡羔。我一直安慰自己,他們只是感情好个初,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布乖寒。 她就那樣靜靜地躺著,像睡著了一般院溺。 火紅的嫁衣襯著肌膚如雪楣嘁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天珍逸,我揣著相機(jī)與錄音逐虚,去河邊找鬼。 笑死谆膳,一個胖子當(dāng)著我的面吹牛叭爱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播漱病,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼买雾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杨帽?” 一聲冷哼從身側(cè)響起漓穿,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎注盈,沒想到半個月后晃危,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡老客,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年僚饭,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沿量。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡浪慌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出朴则,到底是詐尸還是另有隱情权纤,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布乌妒,位于F島的核電站汹想,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏撤蚊。R本人自食惡果不足惜古掏,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侦啸。 院中可真熱鬧槽唾,春花似錦丧枪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钝计,卻和暖如春恋博,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背私恬。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工债沮, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人本鸣。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓疫衩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親荣德。 傳聞我的和親對象是個殘疾皇子隧土,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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