如今,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 倒序排列,更容易识别是否为第三方库。