ShadowCoel 分析之1: APP 中的所有依赖库作用分析
本文最后更新于 2021年4月4日 晚上
准备利用业余时间开发一个自用的 iOS 端代理软件, 但是暂时没有什么头绪, 所以先找到 ShadowCoel 来分析一下如何实现.
作为门外汉, 分析了一下目前自己要实现代理软件的话, 有几个核心问题需要弄明白, 或者说是需要实现的几个核心需求:
如何在应用中控制系统的代理设置?
需要改变系统的代理设置, 让诸如 WIFI 的流量走代理, 这样才能实现整个系统的代理能力.
如何让代理功能在后台时仍然运行?
需要实现的是系统范围的代理, 这样就需要 APP 在进入后台后, 仍然能让自己内部携带的代理功能能够正常持续运行.
诸如 ShadowSocks 和 V2ray 等提供代理能力的程序如何能在 iOS 端运行起来?
ShadowSocks 和 V2ray 等都提供具体的代理功能实现, 这样就需要弄清楚如何才能让这些功能在 iOS 设备上运行起来.
ShadowCoel 分析
ShadowCoel 的官方文档中介绍说它是一款基于 Potatso
的, 实现了 ss/ssr
协议的客户端.
它的核心原理是: 利用苹果的 Network Extension framework
提供的能力来实现自定义代理.
目前 Potatso
兼容 Shadowsocks
和 ShadowsocksR
两个代理.
项目中有 33 个依赖.
题外话
由于许多无良商人(应该是做代理的)不遵守 Potatso
的开源协议, 把它作为一个赚钱工具, 复制粘贴一下就上架到苹果应用商店, 给 Potatso
的声誉带来了很多负面的影响, 所以 Potatso
的作者不再维护之前的项目, 并且已经将新版闭源了.
而 ShadowCoel
这个项目至目前也已经不再维护了…
在感谢这两个项目作者的同时, 也想说一下自己的看法: 任何方式都可以赚钱吃饭, 但有些人却总是以损害整体环境为代价满足一己私欲, 不得不说整体环境是何其可悲!!!
整体依赖分析
要看如何实现上述的几个核心需求, 作为参考, 克隆了 ShadowCoel 看它的源码. 由于工程中依赖了较多库, 先分析主 APP Target 的依赖, 总地来说有两大类:
通过 Pod 引入的依赖
工程中通过子模块(git sub-module)引入的依赖(最新版的 master 分支中已经没有这类依赖了).工程中携带的其他 Target 依赖.
通过 Pod 引入的依赖
ICSMainFramework: 提供通过外部的配置文件来配置整个 APP 的能力, 在其中提供了一个
AppDelegate
类.(Library 目录下).KeychainAccess: 提供易用的 Keychain 读写能力.
RealmSwift: ORM 数据库.
Aspects: 提供面向切面编程能力. (Library 目录下)
Cartography: Swift 版的声明式界面布局框架.
AsyncSwift: 提供 Swift 使用 GCD 的语法糖.
SwiftColor: 针对 UIColor 和 NSColor 的封装类, 提供易用的颜色接口.
Appirater: 提供让用户去 APP store 对这个 APP 进行评论和评分弹窗的能力, 比如许多 APP 经常可以看到的弹一个窗让用户去应用商店打分那种功能.
MBProgressHUD: HUD 弹窗.
ICDMaterialActivityIndicatorView: 谷歌 material 风格的过程转圈圈控件.
ICSPullToRefresh: 为 UIScrollView 提供下拉刷新等能力.
ISO8601DateFormatter: 提供将标准的 UTC 时间字符串和日期对象相互转换的能力.
Alamofire: URLSession 功能的优雅扩展, 提供丰富且易用的网络通信 API.
ObjectMapper: Swift 版的 JSON 序列化/反序列化工具.
CocoaLumberjack/Swift: iOS 和 MAC 上的日志(Logging)库.
PSOperations/Core: 对 NSOperation/NSOperationQueue 的封装, 提供更加易用的 API 和一些扩展能力.
AcknowList: 可以分析工程中使用的 CocoaPod 依赖, 从而提供一个包含所有三方依赖列表的致谢视图控制器供外界展示.
EFQRCode: 非常强大易用的二维码操作工具.
MMDB-Swift: 提供通过 IP 解析地理位置的能力.
工程中自带的 Framework
CallbackURLKit: 提供应用间或者应用同 Extension 之间的消息传递能力.
KissXML: 在 iOS 端提供类似
NSXML
的能力, 即对 XML 文件的操作能力.MMWormhole: 提供通过向相同的 App group 共享文件夹中写入数据文件(消息会被序列化到文件中)从而实现相同 APP group 中的应用以及 Extension 之间的通信能力.
CocoaAsyncSocket: 异步的 socket 网络通信框架.
libsodium: 提供加解密/签名哈希等能力的库.
pcre: 提供正则表达式处理能力, 提供自己的本地 API, 以及和 POSIX 标准兼容的 API.
mbedtls: 提供 SSL 相关的操作 API.
c-ares: 用于异步 DNS 请求的 C 语言库.
libmaxminddb: 用于处理 MaxMind DB 文件格式的 C 库.
libipset: 提供保存 IPV4 和 IPV6 地址, 以及将地址转换为整数的能力.
libcork: 提供类似 glib 功能的 C 库, 即提供构建应用程序所需的构造块或其他辅助功能, 比如自动内存管理等.
libbloom: 一个 C 语言实现的 Bloom 过滤器. 它是一个数据结构, 用于高效地判断一个 set 中是否包含某个元素.
libev: 全功能, 高性能的事件循环/模型库.
libz: zip 压缩解压库.
ssLocal: 本地的 SSServer 程序, 提供如下接口:
start_ss_local_server
start_ss_local_server_with_callback
ShadowPath: 它里面提供了事件循环和启动 ss-local 的能力.
至此, APP 中所有的相关库均罗列完毕, 下一篇文章就来详细分析一下 APP 中的依赖结构.