學習背景:
項目中用到,但是隻停留在用的範疇,並未知曉如何使用,此行記錄一下,以便在其他項目中使用
資源整理:
Mars源碼下載:
Github鏈接:(有時候網真的不行啊)https://github.com/Tencent/mars
網盤鏈接: https://pan.baidu.com/s/1tNKH937ncLArsHrjwWTkgg 提取碼: z5aq
pyelliptic-百度網盤鏈接: https://pan.baidu.com/s/1BqFbFyyZMWv3jjCF8ywGxg 提取碼: tgen
環境配置: JDK + NDK + Python + CMake
運行環境:
1. 系統:Ubuntu20.04 LTS 64位
2. Android Studio 4.0
配置環境:
Ubuntu配置環境主要操作 bashrc 文件,常用的兩個命令:
打開bashrc文件:sudo gedit ~/.bashrc
使bashrc文件改動立即生效:source ~/.bashrc
1. 配置jdk環境
2. 配置ndk環境:
下載android-ndk-r20b(其它版本會出現編譯錯誤的問題),下載網址:https://developer.android.com/ndk/downloads/older_releases
配置環境變量:
命令1:Ctrl + Alt + T 打開終端,輸入命令:sudo gedit ~/.bashrc
在文本最下方加入ndk環境配置:
#ndk
export NDK_ROOT=/../../android-ndk-r20b
export PATH=$PATH:$NDK_ROOT
命令2:驗證ndk環境是否配置成功
輸入命令:ndk-build -v
3. 配置CMake環境
命令1:安裝Cmake
sudo apt-get intsall CMake
命令2:驗證CMake是否安裝成功
cmake --version
4. 配置Python環境
命令1:安裝Python
sudo apt-get intsall python
命令2:驗證CMake是否安裝成功
python
編譯指定架構的庫
1. 下載mars源碼,git倉庫地址爲:https://github.com/Tencent/mars
2. 進入源碼中:mars/mars目錄,執行腳本:
生成armeabi-v7a架構:python build_android.py (默認生成)
生成arm64-v8a架構:python build_android.py (修改此文件中的arch參數爲arm64-v8a)
選擇3,然後Enter,只生成xlog模塊的庫;
其它架構生成方式也是如此;
3. 生成後的庫保存在:sample/mars-master/mars/libraries/mars_xlog_sdk/libs目錄下;
項目配置:
1. build.gradle(app)--->android標籤下加入:
externalNativeBuild {
cmake {
cppFlags "-std=c++11"
abiFilters 'armeabi-v7a', 'arm64-v8a'
}
}
2. 創建與java目錄平級別的目錄jniLibs,分別將剛生成的兩個架構so文件複製進去
3. 將xlog的完整路徑複製到項目中,與包名同級
4. 項目Application中進行XLog初始化(封裝XLog,代替Log進行打印)
//保存路徑
final String SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
final String logPath = SDCARD + "/marssample/log";
MarsLog.init(this, "app name", logPath);
/**
* 初始化操作
*
* true : 是否加載so庫
* Xlog.LEVEL_DEBUG 或 Xlog.LEVEL_INFO :打印日誌的等級
* Xlog.AppednerModeSync: 同步
* Xlog.AppednerModeAsync: 異步
* cachePath: 這個參數必傳,而且要data下的私有文件目錄,例如 /data/data/packagename/files/xlog,
* mmap文件會放在這個目錄,如果傳空串,可能會發生 SIGBUS 的crash。
* logPath : xlog文件保存的路徑
* namePrefix: 一般填寫項目名稱
* pub_key : 加/解密 用到的key (此處未加密)
*/
public class MarsLog {
public static void init(Context context, String namePrefix, String logPath) {
String cacheDir = context.getFilesDir() + "/xlog";
if (BuildConfig.DEBUG) {
Xlog.open(true, Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cacheDir, logPah, namePrefix, "");
Xlog.setConsoleLogOpen(true);
} else {
Xlog.open(true, Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cacheDir, logPah, namePrefix, "");
Xlog.setConsoleLogOpen(false);
}
Log.setLogImp(new Xlog());
}
此處也可以重新Log中打印的方法,使用MarsLog.v的形式進行日誌打印,皆可
}
5. 在程序完全退出時,進行初始化,加入代碼:
Log.appenderClose();
打印XLog與查看Xlog
1. 直接在項目中打印xlog,打印完畢,在logcat日誌模塊成功看到日誌;
使用studio自帶Device File Explorer 工具,進入data/data/當前包名/files/log , 即可查看到xlog ,右鍵save as到本地
2. 找到之前下載好的mars源碼,尋找目錄 mars-master/mars/log/crypt目錄下,其中有兩個文件我們將要使用:
decode_mars_crypt_log_file.py :使用此腳本可以打開 加密 的xlog文件
decode_mars_nocrypt_log_file.py : 使用此腳本可以打開 未加密 的xlog文件
當前我們生成的是沒有加密的xlog文件,在mars-master/mars/log/crypt目錄下,打開終端,命令行輸入:
python decode_mars_nocrypt_log_file.py + 導出到本地的xlog文件路徑 ,
此時會在xlog文件同級的目錄下,生成一個與xlog文件名稱相同的 .xlog文件,使用文本編輯器 即可查看剛打印的日誌
Xlog日誌的加密與解密
1. 安裝 openssl
命令:sudo apt-get install openssl
2.下載 pyelliptic1.5.7
pyelliptic1.5.7 不支持 openssl 1.1 版本,會報以下錯誤:
AttributeError: /usr/lib/x86_64-linux-gnu/libcrypto.so.1.1: undefined symbol: ECDH_OpenSSL
安裝下面這個打補丁的版本
pip install https://github.com/mfranciszkiewicz/pyelliptic/archive/1.5.10.tar.gz#egg=pyelliptic
百度網盤鏈接: https://pan.baidu.com/s/1BqFbFyyZMWv3jjCF8ywGxg 提取碼: tgen
3. 複製文件到指定位置
openssl安裝完畢 且 pyelliptic1.5.7補丁版下載完畢,進入重要一步:
解壓:pyelliptic1.5.7,進入其根目錄下,將其所有文件複製到 mars源碼的 mars-master/mars/log/crypt目錄下,
執行命令:python gen_key.py,會生成private_key 和 appender_open`s parameter 兩個key
使用文本保存好這兩個key,接下來要用;
4. 將上一步得到的key設置到 mars-master/mars/log/crypt中的decode_mars_crypt_log_file.py腳本中,如:
#PRIV_KEY : private_key
#PUB_KEY : appender_open`s parameter
5. 把 pulic key作爲appender_open 函數參數設置進去,private key務必保存在安全的位置,防止泄露
public class MarsLog {
final String pub_key = “”;
public static void init(Context context, String namePrefix, String logPath) {
String cacheDir = context.getFilesDir() + "/xlog";
if (BuildConfig.DEBUG) {
Xlog.open(true, Xlog.LEVEL_DEBUG, Xlog.AppednerModeAsync, cacheDir, logPah, namePrefix, pub_key);
Xlog.setConsoleLogOpen(true);
} else {
Xlog.open(true, Xlog.LEVEL_INFO, Xlog.AppednerModeAsync, cacheDir, logPah, namePrefix, pub_key);
Xlog.setConsoleLogOpen(false);
}
Log.setLogImp(new Xlog());
}
驗證加密,驗證解密
1. 導出加密的日誌:
卸載之前運行的程序,加入pub_key參數運行程序,按照之前的方法,
使用studio自帶Device File Explorer 工具,進入data/data/當前包名/files/log , 即可查看到xlog ,右鍵save as到本地
2. 錯誤的解密方式:
使用不加密decode_mars_nocrypt_log_file的腳本,對xlog進行解密,
命令1 :python decode_mars_nocrypt_log_file.py + 導出到本地的xlog文件路徑 ,查看剛打印的日誌
提示:use wrong decode script ,這是因爲xlog已經加密了,使用這個nocrypt的腳本錯誤導致的,需要使用另一個腳本
3. 正確的解密方式:(確保private_key和pub_key設置正確)
命令1:python decode_mars_crypt_log_file.py + 導出到本地的xlog文件路徑 ,查看剛打印的日誌