Automator 體驗(yàn):快速符號(hào)化 Crash 文件

背景
起因是最近有接到一個(gè)臨時(shí)協(xié)助任務(wù),其中有幾個(gè)重要的流程:
QA方導(dǎo)出.crash文件(必要的)- 我方要根據(jù)測(cè)試提供的 crash 文件的
build number,去下載對(duì)應(yīng)的xx.app.dSYM - 把下載的
dSYM給合作方 - 合作方解析
crash文件
從上的步驟可以看出第一步不可省略。第二、三步完全可以干掉,流程越多越浪費(fèi)時(shí)間。第四步也可以我們自己做,就可以優(yōu)化成 QA 直接解析好 crash 文件然后給合作方。
那么就提效了提效50%是不是,兩個(gè)人的事情一個(gè)人搞定 (那么就可以卷點(diǎn)別的)

初版方案
小插曲
一開(kāi)始第一周我寫了個(gè)
Shell,調(diào)試通過(guò)之后就沒(méi)繼續(xù),就干其他大活了(這里有個(gè)有悲?。?...... 第二周的時(shí)候,不知怎的崩潰出奇的多(應(yīng)該是合作方更新SDK之后導(dǎo)致的) 當(dāng)時(shí)我正Coding熱火朝天,QA和合作方奪命的Call我就去找那個(gè)當(dāng)時(shí)寫好的shell腳本,一通翻箱倒柜之后,我悟了,悲劇來(lái)了,找不到了 呵呵,被自己強(qiáng)迫癥日常清理垃行為給清理了(自己有個(gè)日常清理的垃圾的行為,無(wú)奈Mac配置就這樣)打工人不得不含著淚重新寫了一份 (源碼在下面),快速應(yīng)付下那邊的奪命
Call然后我就在想這個(gè)事,為啥要我來(lái)做,也沒(méi)啥技術(shù)含量,為啥不可自動(dòng)化?Bingo~ 說(shuō)來(lái)就來(lái)
Shell 源碼
crash_txt=$1
crash_log=${crash_txt%%.*}.log
#?find?/Applications/Xcode.app?-name?symbolicatecrash?-type?f
#?cp?/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash?symbolicatecrash
export?DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer
./symbolicatecrash?$1?$2?>?$crash_log
open?$crash_log?-a?sublime
具體如何符號(hào)化解析這里就不再嘮叨了,網(wǎng)上一大堆:附一個(gè)參考鏈接[1]
使用 Automator 的自動(dòng)化方案
要使用 Automator 還需要編寫 AppleScript 代碼。
工具 & 語(yǔ)言
- 工具:
Automator Service, 腳本編輯器 - 語(yǔ)言:
AppleScript,Shell
automator
automator script editor腳本編輯器,AppleScript調(diào)試用。
好玩的 AppleScript
下面是一些好玩的 AppleScript 代碼,喚起你的好奇心:
display?dialog?"你說(shuō)假如地球沒(méi)有了空氣,我們會(huì)怎樣...
那么沒(méi)有工程目錄,后面該怎么辦?"?default?answer?"會(huì)死"?buttons?{"我知道了"}??
?default?button?"我知道了"?with?title?"Handsome?ERROR"
set?theInput?to?text?returned?of?the?result
--display?dialog?text?returned?of?the?result
if?theInput?is?equal?to?"會(huì)死"?then
?display?dialog?"沒(méi)救了"?with?title?"ERROR"?buttons?{"我知道了"}??
??default?button?"我知道了"
end?if
--忽略下面部分
say?"Hello?world"
display?dialog?"Hello?World"?with?title?"Alert"
display?notification?"Hello?World"?with?title?"Notification"
或者直接在終端里面跑
osascript?-e?"display?notification?\"Hello?World\"?with?title?\"Notification\""
-- single comment,# single comment是單行注釋
(* this mutli comment *)是多行注釋
Markdown問(wèn)題AppleScript腳本里意外出現(xiàn)這種代碼忽略
AppleScript 需要注意的問(wèn)題
主要還是路徑問(wèn)題 ApeleScript 獲取的路徑如下:
Macintosh?HD:Users:xxxxxxx:Documents:xxxxx.app_副本_2.dSYM:
這種冒號(hào)的路徑在shell命令行根本沒(méi)法用,所以下面代碼成了常客:
冒號(hào)字符串 打包成數(shù)組 set my_array to split(input as string, ":")
on?split(the_string,?the_delimiter)
?set?old_delimiters?to?AppleScript's?text?item?delimiters
?set?AppleScript's?text?item?delimiters?to?the_delimiter
?set?the_array?to?every?text?item?of?the_string
?set?AppleScript's?text?item?delimiters?to?old_delimiters
?return?the_array
end?split
字符串 set target_path to join(my_array, "/"),這里要注意拼接文件與文件夾用的index下標(biāo)不同:
on?join(the_array,?the_delimiter)
?set?split_str?to?the_delimiter
?set?target?to?"?"
?set?list_length?to?the?length?of?the_array
?set?list_length?to?list_length?-?1
?set?short_list?to?items?2?through?list_length?of?the_array
?
?repeat?with?dir?in?short_list
??set?target?to?target?&?split_str?&?dir
?end?repeat
?return?target
end?join
實(shí)現(xiàn)過(guò)程
思路分析
1、定位dSYM路徑
2、定位xx.crash件路徑
3、喚起終端,切入指定路徑
4、symbolicatecrash解析并重定向輸入結(jié)果
5、自動(dòng)打開(kāi)展示結(jié)果
其實(shí)這前兩步有個(gè)大坑:重復(fù)下載 dSYM 文件以及導(dǎo)出的 xxx.crash 文件路徑會(huì)存在空格。在AppleScript調(diào)用Shell的時(shí)候路徑有空格,會(huì)報(bào)錯(cuò)找不到對(duì)應(yīng)的文件。
解決辦法
- 利用
AppleScript給文件重命名 - 借助
Automator現(xiàn)有的快捷操作修改
期間有周報(bào)群群主指點(diǎn)使用 AppleScript 借助 quoted 這個(gè) API 來(lái)轉(zhuǎn)義引用空格。結(jié)果是終端識(shí)別了,但是symbolicatecrash還是不識(shí)別,雖然結(jié)果不盡人意,但是學(xué)到了新技能。
如果你看過(guò)AppleScript API,除了想哭就沒(méi)別的,上面說(shuō)的很清楚干啥用,但是不知道語(yǔ)法該咋寫。因?yàn)闆](méi)寫過(guò)這種自然語(yǔ)法,每次都是不停的嘗試、失敗,嘗試、失敗,嘗試、失敗。AppleScript小眾到谷歌都沒(méi)有,大部分都是查閱Stack Overflow。
我這邊選擇是第二種
xxx.crash 文件名有空格的解決辦法是直接重命名,查找之后直接把空格替換成下劃線。dSYM 父目錄路徑空格,這邊多次導(dǎo)出之后會(huì)導(dǎo)致父目錄存在空格,這個(gè)相對(duì)上面就比較復(fù)雜。這里有幾點(diǎn)思考:
在事物本身很難解決問(wèn)題時(shí),我們就需要放開(kāi)視野,跳出事物本身,提升更高的角度去思考 當(dāng)你這么想了,你思考問(wèn)題的維度和角度就變了 在我們這個(gè)問(wèn)題上,既然它的路徑上存在空格,我給它換個(gè)不存在的路徑不就好了 是不是一個(gè)很簡(jiǎn)單的解決辦法,所以有時(shí)候不要太局限一點(diǎn)一面
一點(diǎn)瞎扯淡
其實(shí)日常編碼或者修復(fù) BUG 的過(guò)程中也會(huì)遇到類似情況,我們?cè)谝粋€(gè)問(wèn)題上糾結(jié)好久好久到快死了吧!但是問(wèn)題還沒(méi)能解決,這個(gè)時(shí)候就可以嘗試:
- 冷靜下來(lái)
- 刻意放慢節(jié)奏
- 全身心放松下來(lái)
- 想點(diǎn)別的換換腦子或者睡一覺(jué)(我通常就是睡覺(jué))
- 冥想(這個(gè)相對(duì)高級(jí) 需要練習(xí))
不去想這個(gè)問(wèn)題一段時(shí)間之后,慢慢就會(huì)發(fā)現(xiàn)腦子開(kāi)始活絡(luò)起來(lái),之前的問(wèn)題解決辦法好像一下子思路如泉涌,睡一覺(jué)精神也恢復(fù)了,思路也有了,簡(jiǎn)直兩全其美是不是,比死磕一天啥都沒(méi)有強(qiáng)千百倍吧,最后還得被噴延誤工期,拉胯身體,最后無(wú)奈身不由己加入996.icu 這個(gè) Big Party。
工程創(chuàng)建
1、選中dSYM文件 -> 右鍵 -> 服務(wù) -> 創(chuàng)建服務(wù)
2、彈出一個(gè)快捷操作的模板空工程,可以配置參數(shù)入口(因?yàn)榈谝徊竭x中了,參數(shù)就不需要配置了)
3、然后就可以拖拽你要的操作(類似于storyboard,xib操作)
4、保存 -> 命名,就會(huì)自動(dòng)存儲(chǔ)到本機(jī)的~/Libray/Services目錄
所有的快捷操作,工作流都會(huì)在這個(gè)目錄,就是說(shuō)你想用別人寫好的最后安裝的也是這個(gè)目錄
示例圖:


完整的操作步驟

腳本交互
Shell調(diào)用AppleScript可以用osascript -eAppleScript調(diào)用Shell可以用do shell script&do scriptdo script需要配合終端
示例:
tell?application?"Terminal"
?activate
?--set?new_tab?to?do?script?"echo?fire"
?delay?1
?do?script?"pwd"?in?front?window
?do?script?"ls"?in?front?window
end?tell
演示
模糊了點(diǎn),為了加載快,壓縮的有點(diǎn)狠,但是也能看大概流程就OK了
有兩種使用方式啟動(dòng) dSYM 自動(dòng)化服務(wù):
- 首先選中 dSYM 文件,然后右鍵 -> 快捷操作 -> dSYM
- 首先選中 dSYM文件,快捷鍵即可(這里需要到 Finder -> Service 偏好設(shè)置里面配置好按鍵)
automator rightkey執(zhí)行流程如下:
1、啟動(dòng)之后就自動(dòng)去/Users/$(whoami)/Downloads/目錄文件下搜索.carsh文件
這里寫死Downloads目錄的原因是想提高搜索速度,所有導(dǎo)出的時(shí)候選擇的就是Downloads目錄。如果你想要全局搜索也不是不是可以, 但是你得等等Spotlight
2、搜索完畢之后會(huì)列出該目錄下所有的 .crash 文件。
3、選擇對(duì)應(yīng)的文件(build number 一致),就會(huì)打開(kāi)一個(gè)終端進(jìn)入解析流程。
4、解析完畢之后會(huì)通過(guò) sublime 打開(kāi)。沒(méi)有sublime會(huì)怎樣? 就去掉 -a sublime
ApplesScript 代碼負(fù)責(zé)的部分:
- 冒號(hào)
:轉(zhuǎn)斜杠/ - 調(diào)用了剪切板做緩存
display dialog顯示.crash文件的搜索結(jié)果- 喚起終端,執(zhí)行解析
總結(jié)
這里本來(lái)想在Automator里面加一個(gè)調(diào)用Shell腳本的的服務(wù),這樣就可以靜默解析不用喚起終端,調(diào)試過(guò)程中解析一直失敗,因?yàn)檫\(yùn)行解析的 symbolicatecrash 需要的環(huán)境變量報(bào)錯(cuò),也在對(duì)應(yīng)的目錄進(jìn)行了export,但是最終還是不行,最后還是選擇喚起終端來(lái)執(zhí)行操作,或許看起來(lái)更酷一點(diǎn)吧 哈哈哈。
其他文件讀取/拷貝/搜索/重命名都是Automator提供現(xiàn)成服務(wù)。Automator真的很強(qiáng)大,但是你要發(fā)現(xiàn)它的美,學(xué)會(huì)使用它。
最后就是要告誡自己:該做的事還得及時(shí)做出來(lái), 不然就是午飯沒(méi)吃 午休沒(méi)睡。

引用資料
[1]iOS Crash文件獲取及符號(hào)化: https://gsl201600.github.io/2020/04/29/iOSCrash%E6%96%87%E4%BB%B6%E8%8E%B7%E5%8F%96%E5%8F%8A%E7%AC%A6%E5%8F%B7%E5%8C%96/

打工人不得不含著淚重新寫了一份 (源碼在下面),快速應(yīng)付下那邊的奪命