1 介紹
1.1 mars
mars是微信官方的跨平臺跨業務的終端基礎元件。
- comm:可以獨立使用的公共庫,包括 socket、執行緒、訊息佇列、協程等;
- xlog:高可靠性高效能的執行期日誌元件;
- SDT: 網路診斷元件;
- STN: 信令分發網路模組,也是 Mars 最主要的部分。
1.2 protobuf
protobuf: Google`s data interchange format.
protobuf是google提供的一個開源序列化框架,類似於XML,JSON這樣的資料表示語言,其最大的特點是基於二進位制,因此比傳統的XML表示高效短小得多。雖然是二進位制資料格式,但並沒有因此變得複雜,開發人員通過按照一定的語法定義結構化的訊息格式,然後送給命令列工具,工具將自動生成相關的類,可以支援php、java、c++、python等語言環境。通過將這些類包含在專案中,可以很輕鬆的呼叫相關方法來完成業務訊息的序列化與反序列化工作。
2 建立framework
2.1 生成framework
// 下載 mars 倉庫:
git clone https://github.com/Tencent/mars.git
// 切換到 libraries路徑
cd mars-master/mars/libraries
// 執行python指令碼
python build_apple.py
提示輸入儲存資料夾的字首:(隨意)
input prefix for save directory. like trunk,br,tag:
選擇build的型別: 1代表iphone版mars(其中包括xlog)
Enter menu:
build mars for iphone.
複製程式碼
2.2 引入framework
// log_crypt.cc.rewriteme, log_crypt.h 這兩個檔案已被廢棄,可直接刪除
// 刪除.rewriteme的字尾
共三個檔案log_crypt.cc.rewriteme(廢棄),longlink_packer.cc.rewriteme, shortlink_packer.cc.rewriteme
// 拖入工程,並新增庫
SystemConfiguration, CoreTelephony, Foundation, libz.tbd, libresolv9.tbd
複製程式碼
2.3 xlog
/// 新增檔案(demo中有)
LogHelper.h(.mm)、LogUtil.h(.mm), appender-swift-bridge.h(.mm)
/// 橋接標頭檔案新增
#import "appender-swift-bridge.h"
// 配置xlog, 引數分別代表:debug時記錄的級別,release時記錄的級別,儲存檔案的相對路徑,檔案字首
JinkeyMarsBridge().initXlogger(...)
// 自定義log
JinkeyMarsBridge().log(...)
複製程式碼
在didFinishLaunchingWithOptions配置xlog
在applicationWillTerminate中destory
2.4 引入protobuf
2.4.1 生成.pb.swift
// 安裝protobuf
brew install protobuf
// 安裝swift-protobuf-plugin
git clone https://github.com/apple/swift-protobuf.git
cd swift-protobuf
swift build -c release -Xswiftc -static-stdlib
// 將.proto檔案轉換成.swift
protoc --swift_out=. name.proto
複製程式碼
寫了個shell,可以批量將當前資料夾下的所有.proto轉換成對應的.pb.swift
地址為install.sh,可直接雙擊使用
內容如下:
cd $(cd `dirname $0`; pwd)
for i in find *.proto
do
if [ $i == "find" ]; then
continue
fi
protoc --swift_out=. $i
echo "生成檔案:$i.pb.swift"
done
複製程式碼
2.4.2 引入.pb.swift
swift-protobuf: Plugin and runtime library for using protobuf with Swift
// pod引用
pod `SwiftProtobuf`
// 將.pb.swift新增到工程中(不用新增.proto)
// 使用
var con = Conversation()
con.name = "ashen"
con.notice = "for test"
// 傳輸時,直接傳遞data資料
let data = try? con.serializedData()
複製程式碼
2.5 新增橋接檔案(可選)
由於該framework是C++寫的,對於不會C++的人(比如我)來說, 呼叫是個很大的問題, 可以通過demo中的相關檔案 + swift-oc橋接標頭檔案直接轉換成swift可以直接呼叫的類
3 xlog檔案解析
3.1 安裝python依賴庫.
首先需要檢視自己的python版本, decode_mars_crypt_log_file.py只在python2.+下支援,3.+不能正常執行
安裝依賴庫pyelliptic, 如果同時存在2.+ 和3.+ 版本,請使用pip2
pyelliptic的最新版本1.5.8,存在bug, 需要指定版本為1.5.7
pip install pyelliptic==1.5.7
複製程式碼
3.2 解密logger日誌
// 切換到crypt資料夾
cd mars/mars/log/crypt
// 解密logger
python2 decode_mars_crypt_log_file.py logger_20171205.xlog
// logger_20171205.xlog.log 即為解密出的log日誌
複製程式碼
fix bugs:
-
ImportError: No module named pyelliptic
原因:沒有正確安裝pyelliptic的依賴庫
解決: pip2 install pyelliptic==1.5.7
如果安裝後依然報錯,可能是由於安裝了多個版本的python,pyelliptic並沒有安裝在2.+的python下.
在MacOS上, 如果同時安裝了2.+ 和3.+的python, pip2 和pip3 分別代表安裝到2.+ 和3.+的庫中. 所以可以通過pip2 install pyelliptic==1.5.7 安裝 -
AttributeError: dlsym(0x7fc443f02f50, EVP_CIPHER_CTX_reset): symbol not found
原因: pyelliptic的最新版本1.5.8的bug
解決: 使用1.5.7版本pip uninstall pyelliptic pip install pyelliptic==1.5.7 複製程式碼