如今,APP 越来越多,公司之间面临着同一个问题,竞品越来越多,公司之间为获取更多流量不得不在APP的体验上做足功课。那么,研究竞品变得越来越重要,比如研究竞品某个核心功能使用了哪些第三方服务、架构是什么样的、某个接口是如何设计的、数据库是如何设计的、沙盒目录结构是什么样的等。最近研究第三方 APP 比较多,希望可以总结一套研究第三方 APP 的流程,目前正在研究微信,如果有机会分享给读者朋友们。
研究某个竞品APP时,需要了解其使用的第三方库,使用 class-dump 导出的头文件非常多,仅靠肉眼查看时,耗时耗力。为了解决这个痛点,便发明了这个工具。下面是获取微信 使用的第三方库,可以查看 pod 库的 star 数,源地址。
- pop - (18872)
- GPUImage - (17338)
- WebViewJavascriptBridge - (10649)
- FBSDKCoreKit - (5894)
- WCDB - (5700)
- GCDWebServer - (4011)
- EGOTableViewPullRefresh - (3336)
- KSCrash - (1942)
- OpenUDID - (1909)
- YYImage - (1193)
- SKBounceAnimation - (912)
- YYAsyncLayer - (405)
原理
在介绍原理前,需要了解 class-dump,它可以根据某个被砸坑的应用,导出APP中所有的头文件,包含第三方库的头文件,那么可以利用导出的第三库头文件反查第三方库。iOS 的同学都清楚,目前主流的第三方库都使用 Pod 管理,所有的第三方开源库都被放到 CocoaPods/Specs 中。而这些源文件都可以通过 Github 提供的 API 获取到它的源文件。对比 class-dump 导出的头文件和通过 Github 提供的 API 获取到它的源文件即可确定它使用的第三方库。
以 AFNetworking 为例:
使用 class-dump 导出的头文件(部分):
AFHTTPRequestSerializer.h
AFHTTPResponseSerializer.h
AFHTTPSessionManager.h
复制代码
使用 Github 提供的 API (部分) 获取源文件
[{
"name": "AFURLResponseSerialization.h",
"path": "AFNetworking/AFURLResponseSerialization.h"
},
{
"name": "AFURLResponseSerialization.m",
"path": "AFNetworking/AFURLResponseSerialization.m"
},
{
"name": "AFURLSessionManager.h",
"path": "AFNetworking/AFURLSessionManager.h"
}]
复制代码
对比 class-dump 导出的头文件 和 使用 Github 提供的 API 获取的头文件,可以推出使用的第三方库为 AFNetworking。
但是这样有个问题,遍历 class-dump 导出的头文件,需要每个头文件都需要请求Github提供的API,这样速度非常慢,是无法忍受的。为解决这个问题,需要提前把 CocoaPods 中第三方库的源文件名缓存到数据库中,这样就不需要每次从网络中获取pod库的源文件。
CREATE TABLE podlib (
name TEXT PRIMARY KEY
NOT NULL,
source TEXT,
summary TEXT,
star INT,
file1 TEXT,
file2 TEXT,
file3 TEXT,
source_file TEXT
);
复制代码
使用
本工具基于 python 写的,在 这里 可以找到源码。下载源码后修改 main.py 文件的 IPA_HEADER_PATH 为 class-dump 导出的头文件目录。执行 python main.py
IPA_HEADER_PATH = '/Users/lefex/Desktop/header/xxx'
复制代码
总结
- 由于本工具是基于导出的头文件查找第三方库,而有些库如果不支持 pod,那么就不能查找到该三方库(如果连 Pod 都不支持,你还会用吗?);
- 如果项目中的文件名恰好和第三方库中的文件名相同,会被判定为第三方库,所以添加了 star 数作为参考(如果 star 数小于 100,你会用吗?);
- 由于 xxx.podspec.json 文件中的 source_files 有时候没有,导致生成 Github API 时获取不到源文件,导致有些pod库查不出来,这块需要后续逐步完善数据库;
- 查找出来的第三方库,会以 star 倒序排列,更容易识别是否为第三方库。