AppleScript二三事之一键解析Crash文件

前言

AppleScript,顾名思义是Apple公司推出的一门脚本语言。它的作用十分巨大。在Mac上可以在多个程序中进行操作,实现一系列自动化或者流程化的操作。同样的在Mac上的许多程序都对它有很好的支持。另一方面,AppleScript接近自然语言的语法使得它简单易用,在日常工作中是提升工作效率的利器。

AppleScript 基本语法

开始之前,我们需要一个编辑器来书写AppleScript相关的脚本代码。在Mac中自带的脚本编辑器就能够实现。顺便吐槽一下这个编辑器真的不太好用,在代码提示补全还有注释上都不是特别友好。如果有更好的编辑器欢迎大家交流。

变量

如何初始化一个变量,并且设定变量的值呢,其实很简单。使用set xxx to xxx语法。 例如,我们设置一个变量timeCount并将它的值设置为10

set timeCount to 10
复制代码
Tell语法

我们希望通过编写脚本实现一些操作,这些操作是对于一些特定的App或者是系统的程序,这个时候我们就需要用的Tell语法,其实可以很形象的将它想象成告诉应用程序区做如何如何。

tell application "Finder"
    empty the trash
end tell
复制代码

这段代码的作用是,告诉finder将垃圾桶清空。可以看到语法真的十分简洁易读。 同样的,每个程序支持做什么,做特定的事需要的API是什么,都可以通过 打开资源库来查询(shift + command + L)。每一个通过资源库可以了解到每一个App对外开放的操作接口,以及接口的使用方法。

判断 & 循环

在Applescript中,判断依然是用熟悉的if语法,同时末尾需要带上end if。 另外在Applescript中,注释的写法是--后面跟上注释的内容。

if timeCount == 20 then
    -- doing something
    else
    
end if
复制代码

值得一提的是判断语句十分口语化,如

is equal to
is greater than
is greater than or equal to
is less than or equal to
-- 或者
begins with (or, starts with) ends with
is equal to
comes before
comes after is in
-- 或者
does not start with
does not contain
is not in
复制代码

这时候你可以试着想象一下循环的写法?相信你一定能够有点思路。

set timeCount to 10
repeat timeCount times
    -- doing something
end repeat
复制代码

Crash文件分析

在iOS应用程序中,每次的Crash都会生成相应的Crash文件,这个文件里面记录了Crash时最后的线程信息,内存信息,以及系统环境等等许多有价值的信息。通过这个Crash文件开发者可以十分方便的去debug,发现崩溃的问题从而解决它。

一般获取Crash文件可以从Apple提供的iTunes Connect线上管理工具获取线上用户的崩溃日志,另外就是从机器中读取。 如果你手头有刚获取的Crash文件,打开它你会发现崩溃的线程信息方法调用等这些内容都是内存地址。面对一堆的0x00000相信你是一脸懵逼的。 这个时候我们需要对Crash文件进行符号化处理。

Crash文件符号化

在我们进行Crash文件符号化之前需要了解一个概念,每一次打包生成ipa文件,Xcode都会生成一个dSYM文件,需要注意的一点是,Crash文件和ipa文件还有dSYM文件都是一一对应的。也就是说每个Crash文件对应的是具体的ipa包(可以理解为具体某个版本的包,如果存在重复打包还需要去区别某次的包),而在打包生成ipa时候又会有一个dSYM文件与ipa对应生成。所以这三者是一一对应的关系。要想符号化Crash文件,我们必须找出这个Crash文件对应的ipa和dSYM文件。

那我们找到了这三个文件,如何确定他们就是一一对应的呢,答案就是UUID,这三个文件都有UUID,如果UUID相同,则代表这三个文件是一一对应的。

另外,每个文件其实有两个UUID,对应的是armV7和arm64,在不同平台下一一对应就行了。

查看UUID

Crash文件的UUID在 Binary Images:下第一行和第二行的尖括号中。

ipa的UUID需要我们解压ipa,然后通过终端打开: dwarfdump --uuid Example.app/Example

同样的dSYM文件也是通过dwarfdump命令获取。dwarfdump --uuid /Users/wusuowei/Desktop/Example.dSYM

符号化

符号化方法可以参考这篇文章:符号化的三种方法

在这里我们采用命令行运行symbolicatecrash工具来实现。

实现

我们需要实现的效果是,将ipa内部的app文件,dSYM文件,Crash文件放在同一个文件夹中,运行脚本选取文件夹,自动输出符号化后的文件在当前的文件夹中。

选取文件夹
set filePath to choose folder
复制代码

通过choose folder可以调出选取文件夹的对话窗口。并且将文件路径赋值给filePath变量。

判断文件夹内文件

判断文件夹内存在dSYM,app,Crash文件存在,并且是唯一的。

tell application "Finder"
	set dsymFiles to (files in filePath whose name ends with ".dSYM")
	
	if (count of dsymFiles) = 0 then
		display dialog "错误:'.dSYM'文件不存在"
		return
	else if (count of dsymFiles) > 1 then
		display dialog "错误:存在多个'.dSYM'"
		return
	end if
	
	set crashFiles to (files in filePath whose name ends with ".crash")
	
	if (count of crashFiles) = 0 then
		display dialog "错误:'.crash'文件不存在"
		return
	else if (count of crashFiles) > 1 then
		display dialog "错误:存在多个'.crash'文件"
		return
	end if
	
	set appNames to (files in filePath whose name ends with ".app")
	
	if (count of appNames) = 0 then
		display dialog "错误:'.app'文件不存在"
		return
	else if (count of appNames) > 1 then
		display dialog "错误:存在多个'.app'文件"
		return
	end if
	
	set sym to (files in filePath whose name is "symbolicatecrash")
	if (count of sym) = 0 then
		display dialog "错误:'symbolicatecrash'文件不存在"
		return
	end if
	
	set dsymfile to first item of dsymFiles
	set crashfile to first item of crashFiles
	set appfile to first item of appNames
	set filePath to POSIX path of filePath
	
end tell

复制代码

最后一个方法POSIX path of作用是将文件地址转换成终端能够识别的UNIX格式的地址。 AppleScript and POSIX paths

下一步就是符号化Crash文件了

tell application "Terminal"
	set currentTab to do script
	do script "cd " & filePath in currentTab
	do script "export DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer" in currentTab
	do script "./symbolicatecrash " & filePath & name of crashfile & " " & filePath & name of dsymfile & " > " & filePath & "crashLog.crash" in currentTab
end tell
复制代码

总结

本文只是通过一个十分简单的例子来演示AppleScript并用它来做了一些事。同样的你可以用它来做其他更棒的事。毫无疑问的是用好AppleScript能够极大提升我们的效率。 最后推荐一本书《AppleScript for Absolute Starters》,这本书讲解了一些Applescript的基础语法,作为入门书籍是最好不过了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值