ShadowCoel 分析之1: APP 中的所有依赖库作用分析

本文最后更新于 2021年4月4日 晚上

准备利用业余时间开发一个自用的 iOS 端代理软件, 但是暂时没有什么头绪, 所以先找到 ShadowCoel 来分析一下如何实现.

作为门外汉, 分析了一下目前自己要实现代理软件的话, 有几个核心问题需要弄明白, 或者说是需要实现的几个核心需求:

  1. 如何在应用中控制系统的代理设置?

    需要改变系统的代理设置, 让诸如 WIFI 的流量走代理, 这样才能实现整个系统的代理能力.

  2. 如何让代理功能在后台时仍然运行?

    需要实现的是系统范围的代理, 这样就需要 APP 在进入后台后, 仍然能让自己内部携带的代理功能能够正常持续运行.

  3. 诸如 ShadowSocks 和 V2ray 等提供代理能力的程序如何能在 iOS 端运行起来?

    ShadowSocks 和 V2ray 等都提供具体的代理功能实现, 这样就需要弄清楚如何才能让这些功能在 iOS 设备上运行起来.

ShadowCoel 分析

ShadowCoel 的官方文档中介绍说它是一款基于 Potatso 的, 实现了 ss/ssr 协议的客户端.

它的核心原理是: 利用苹果的 Network Extension framework 提供的能力来实现自定义代理.

目前 Potatso 兼容 ShadowsocksShadowsocksR 两个代理.

项目中有 33 个依赖.

题外话

由于许多无良商人(应该是做代理的)不遵守 Potatso 的开源协议, 把它作为一个赚钱工具, 复制粘贴一下就上架到苹果应用商店, 给 Potatso 的声誉带来了很多负面的影响, 所以 Potatso 的作者不再维护之前的项目, 并且已经将新版闭源了.

ShadowCoel 这个项目至目前也已经不再维护了…

在感谢这两个项目作者的同时, 也想说一下自己的看法: 任何方式都可以赚钱吃饭, 但有些人却总是以损害整体环境为代价满足一己私欲, 不得不说整体环境是何其可悲!!!

整体依赖分析

要看如何实现上述的几个核心需求, 作为参考, 克隆了 ShadowCoel 看它的源码. 由于工程中依赖了较多库, 先分析主 APP Target 的依赖, 总地来说有两大类:

  1. 通过 Pod 引入的依赖

  2. 工程中通过子模块(git sub-module)引入的依赖(最新版的 master 分支中已经没有这类依赖了).

  3. 工程中携带的其他 Target 依赖.

通过 Pod 引入的依赖

  1. ICSMainFramework: 提供通过外部的配置文件来配置整个 APP 的能力, 在其中提供了一个 AppDelegate 类.(Library 目录下).

  2. KeychainAccess: 提供易用的 Keychain 读写能力.

  3. RealmSwift: ORM 数据库.

  4. Aspects: 提供面向切面编程能力. (Library 目录下)

  5. Cartography: Swift 版的声明式界面布局框架.

  6. AsyncSwift: 提供 Swift 使用 GCD 的语法糖.

  7. SwiftColor: 针对 UIColor 和 NSColor 的封装类, 提供易用的颜色接口.

  8. Appirater: 提供让用户去 APP store 对这个 APP 进行评论和评分弹窗的能力, 比如许多 APP 经常可以看到的弹一个窗让用户去应用商店打分那种功能.

  9. MBProgressHUD: HUD 弹窗.

  10. ICDMaterialActivityIndicatorView: 谷歌 material 风格的过程转圈圈控件.

  11. ICSPullToRefresh: 为 UIScrollView 提供下拉刷新等能力.

  12. ISO8601DateFormatter: 提供将标准的 UTC 时间字符串和日期对象相互转换的能力.

  13. Alamofire: URLSession 功能的优雅扩展, 提供丰富且易用的网络通信 API.

  14. ObjectMapper: Swift 版的 JSON 序列化/反序列化工具.

  15. CocoaLumberjack/Swift: iOS 和 MAC 上的日志(Logging)库.

  16. PSOperations/Core: 对 NSOperation/NSOperationQueue 的封装, 提供更加易用的 API 和一些扩展能力.

  17. AcknowList: 可以分析工程中使用的 CocoaPod 依赖, 从而提供一个包含所有三方依赖列表的致谢视图控制器供外界展示.

  18. EFQRCode: 非常强大易用的二维码操作工具.

  19. MMDB-Swift: 提供通过 IP 解析地理位置的能力.

工程中自带的 Framework

  1. CallbackURLKit: 提供应用间或者应用同 Extension 之间的消息传递能力.

  2. KissXML: 在 iOS 端提供类似 NSXML 的能力, 即对 XML 文件的操作能力.

  3. MMWormhole: 提供通过向相同的 App group 共享文件夹中写入数据文件(消息会被序列化到文件中)从而实现相同 APP group 中的应用以及 Extension 之间的通信能力.

  4. CocoaAsyncSocket: 异步的 socket 网络通信框架.

  5. libsodium: 提供加解密/签名哈希等能力的库.

  6. pcre: 提供正则表达式处理能力, 提供自己的本地 API, 以及和 POSIX 标准兼容的 API.

  7. mbedtls: 提供 SSL 相关的操作 API.

  8. c-ares: 用于异步 DNS 请求的 C 语言库.

  9. libmaxminddb: 用于处理 MaxMind DB 文件格式的 C 库.

  10. libipset: 提供保存 IPV4 和 IPV6 地址, 以及将地址转换为整数的能力.

  11. libcork: 提供类似 glib 功能的 C 库, 即提供构建应用程序所需的构造块或其他辅助功能, 比如自动内存管理等.

  12. libbloom: 一个 C 语言实现的 Bloom 过滤器. 它是一个数据结构, 用于高效地判断一个 set 中是否包含某个元素.

  13. libev: 全功能, 高性能的事件循环/模型库.

  14. libz: zip 压缩解压库.

  15. ssLocal: 本地的 SSServer 程序, 提供如下接口:

    • start_ss_local_server

    • start_ss_local_server_with_callback

  16. ShadowPath: 它里面提供了事件循环和启动 ss-local 的能力.

至此, APP 中所有的相关库均罗列完毕, 下一篇文章就来详细分析一下 APP 中的依赖结构.


ShadowCoel 分析之1: APP 中的所有依赖库作用分析
https://blog.rayy.top/2019/09/14/2019-2019-09-14-shadowcoel0/
作者
貘鸣
发布于
2019年9月14日
许可协议