修改mars-xlog 源码并编译成so文件(全程记录)
本地环境:Mac+AndroidStudio+python3
本地编译文档:
由于近期项目使用了mars的xlog进行记录本地日志,之前没有对native层有太多的了解,所以想借此机会研究下这个库,并且对这个库进行自定义修改,编译。本文章只记录了如何对xlog进行编译的过程,并没有对如何修改xlog源码进行记录,之后抽时间我会再写一篇文章分析mars的xlog库。
文档上写的是python2.7,但是小王使用python3版本的编译写没有问题,下面是具体操作:
开始编译
小王是直接在AndroidStudio的终端进行操作的,首先是进入mars项目的当前文件中,直接使用python显示出错:zsh:command not found:python
zsh: command not found: python2
因为我的电脑安装的是python3,所以下面直接使用python3来执行编译命令
Error: ndk does not exist or you do not set it into NDK_ROOT.
又报错了,说我没有配置NDK_ROOT
具体配置NDK_ROOT的步骤如下:
首先需要你在AndroidStudio下载NDK,我下载的是NDK20的版本,因为文档推荐的是ndk-r20
-
确认NDK的安装路径: 首先,你需要知道你的NDK安装在哪个路径下。如果你通过Android Studio的SDK Manager安装,它通常位于
~/Library/Android/sdk/ndk/
目录下,具体版本号会有所不同。 -
打开终端: 打开你的终端应用程序,这可以在
应用程序 > 实用工具
中找到。 -
编辑shell配置文件: 如果你使用的是bash shell,你需要编辑
~/.bash_profile
文件;如果你使用的是zsh shell(macOS Catalina及以后的版本默认使用zsh),则需要编辑~/.zshrc
文件。你可以使用文本编辑器打开这些文件,例如使用nano
或vim
:nano ~/.zshrc # 或者使用 vim ~/.zshrc
-
添加NDK环境变量: 在打开的配置文件中,添加以下两行,确保替换为你的实际NDK路径:
export NDK_ROOT=/path/to/your/ndk export PATH=$PATH:$NDK_ROOT
例如,如果你的NDK安装在
/Users/yourusername/Library/Android/sdk/ndk/20.0.5594570
,那么你应该这样设置:export NDK_ROOT=/Users/yourusername/Library/Android/sdk/ndk/20.0.5594570 export PATH=$PATH:$NDK_ROOT
-
保存并关闭文件: 如果你使用的是
nano
,可以按Ctrl + X
,然后按Y
,最后按Enter
保存并退出。如果你使用的是vim
,可以按Esc
,输入:wq
,然后按Enter
保存并退出。 -
使更改生效: 为了让更改立即生效,你需要运行以下命令:
source ~/.zshrc
-
验证配置: 在终端中输入
ndk-build
,如果没有报错,并且能够看到NDK的版本信息,那么就说明配置成功了。
xiaowang@MacBook-Pro-9 mars % nano ~/.zshrc
xiaowang@MacBook-Pro-9 mars % source ~/.zshrc
刷新完成后,我继续执行下面的命令
python3 build_android.py
sh: cmake: command not found
又又又报错了,不过这次换了个错误,说我的电脑上没有cmake,不知道cmake是干啥的,可以看我的这篇文章:Android NDK开发入门详解
安装完cmake之后,我们继续执行下面的这个命令
python3 build_android.py
终于终于我们看到编译成功了!,在libs文件夹下面生成了两个文件,libmarsxlog.so,也就是说我们已经成功的得到了我们想要的文件。
如何集成so文件到项目
那我现在想用这个so文件怎么办呢?
在Android项目中,如果你需要将本地(native)库(如 .so
文件)包含到你的应用中,你应该将这些文件放在项目的 src/main/jniLibs
目录下。这个目录是专门用来存放不同架构的本地库文件的。
以下是具体的步骤和说明:
- 创建目录结构:
- 在你的项目的
main
目录下,创建一个名为jniLibs
的目录。这个目录应该和java
、res
、assets
等目录在同一个级别。
- 在你的项目的
- 放置
.so
文件:- 在
jniLibs
目录下,根据不同的CPU架构创建子目录。常见的架构包括armeabi-v7a
、arm64-v8a
、x86
和x86_64
。例如,对于ARM v7设备,你应该在jniLibs/armeabi-v7a
目录下放置你的.so
文件。 - 如果你的应用支持多个架构,你需要为每个架构创建一个对应的子目录,并在每个子目录中放置相应架构的
.so
文件。
- 在
- 配置
build.gradle
文件:- 在你的模块级别的
build.gradle
文件中,确保已经包含了对本地库的支持。你可能需要添加如下配置: -
android { ... defaultConfig { ... externalNativeBuild { cmake { // 如果你使用CMake来构建你的本地库 } } } externalNativeBuild { cmake { // 这里可以配置CMake的参数 } } }
- 如果你使用ndk-build来构建你的本地库,确保
NDK
配置正确,并且build.gradle
中指定了正确的路径和参数。
- 在你的模块级别的
- 构建项目:
- 使用Android Studio的构建系统来构建你的项目。构建过程会自动将
jniLibs
目录下的.so
文件复制到相应的输出目录中,这样应用在运行时就可以加载这些本地库了。
- 使用Android Studio的构建系统来构建你的项目。构建过程会自动将
其实在mars的库中已经将这两个so文件进行了加载,我们使用的话,直接将Xlog和Log文件拷贝到我们的项目中,并且配置好cmake,就可以使用啦。下面是这两个文件的连接地址。
觉得有用的同学,帮忙点个赞吧~~
评论区