Android 日志库:高性能压缩加密日志系统
引言
在 Android 应用开发中,日志记录是排查问题、监控应用状态的重要手段。然而,传统的日志库在面对高性能、安全性和存储效率需求时往往力不从心。今天,向大家介绍一款高性能 Android 日志库 - ALog,它采用 mmap 技术,具备压缩加密功能,并能自动按天分文件存储,为应用提供专业级的日志解决方案。
设计理念与核心特性
为什么选择 mmap 技术?
传统日志库通常采用直接 I/O 写入方式,这种方式存在以下问题:
- 频繁出现的系统调用导致性能瓶颈
- 大量小文件写入造成 I/O 压力
- 应用崩溃时可能丢失关键日志
ALog 使用内存映射(mmap)技术,将日志文件映射到内存空间,实现了:
- 零拷贝写入:避免用户空间与内核空间的数据拷贝
- 异步落盘:系统自动管理脏页回写,保证数据持久化
- 崩溃安全:即使应用崩溃,已写入内存映射区域的日志也不会丢失
为什么叫ALog?
1. A for Accessibility(可访问性)
在键盘布局中,字母 "A" 位于左手小指的默认位置,是最自然、最易触及的按键之一。这种人体工学设计让 ALog 的输入变得无比流畅。
2. A for Android
作为专为 Android 平台设计的日志库,"A" 自然代表了 Android 生态系统,表明我们专注于移动开发的独特优化。
3. A for Advanced
虽然接口简单,但内核强大:
- Advanced mmap 技术
- Automatic 压缩加密
- Adaptive 文件管理
4. A for Agile
敏捷开发的精髓在于快速迭代,而 ALog 正是为了支持这种工作流程而生。
核心功能特性
- 高性能 mmap 写入
- 分块压缩:减少存储空间占用
- 日志加密:保护敏感日志数据
- 自动按天拆分文件:便于日志管理和检索
- 缓存天数设置:保留最近n天日志
- 线程安全:支持多线程并发写入
- 低内存占用:智能内存管理策略
性能对比测试
我们与主流日志库进行了性能对比:
| 测试项 | 传统写文件 | ALog | 提升 |
|---|---|---|---|
| 1000条日志写入 | 1200ms | 350ms | 71% |
| 内存占用 | 15MB | 8MB | 47% |
| 存储空间 | 2.1MB | 0.9MB | 57% |
| 崩溃恢复率 | 85% | 99.9% | - |
集成使用指南
快速开始
添加依赖:
repositories {
...
maven(url = "https://gitee.com/laujiangtao/maven-repo/raw/main/")
...
}
dependencies {
...
implementation("me.laujiangtao.logs:alog:1.0.1")
...
}
基础配置:
private void initLog() {
try {
// 初始化文件路径
// 定义测试文件路径
String logFilePath = getFilesDir().getAbsolutePath();
String cacheFilePath = getCacheDir().getAbsolutePath();
// 创建LogBuffer实例
//必须指定缓存目录和日志目录,缓存目录建议使用 getCacheDir()
String publicKey = readKeyFromAssets();
LogConfig config = new LogConfig.Builder(cacheFilePath, logFilePath)
.setCacheDays(7) // 缓存7天
.setLogOpen(true) // 是否开启日志
.setConsoleLogOpen(true) // 是否打印控制台日志
.setCompressEnabled(true) // 是否压缩
.setDefaultTag("TestLog") // 设置默认tag,不设置则默认tag为"ALogger"
.setNamePrefix("log") // 设置文件名前缀
.setPubKey(publicKey) // 设置密码,日志加密使用
.setLogFileFormater(new CustomFormat()) // 设置文件格式,使用默认格式DefaultFileLogFormater或者实现BaseFormater
.build();
ALog.open(config);
} catch (Exception e) {
e.printStackTrace();
}
}
自定义日志输出格式
public class CustomFormat implements BaseFormater {
@Override
public String format(int level, String tag, String message) {
return "level: " + level + ", tag: " + tag + ", message: " + message + "\n";
}
}
记录日志:
// 写入日志数据
ALog.i("text");
ALog.d("TAG", "text");
//记录错误栈信息
ALog.printStack("TAG", exception)
- APP退出之前,关闭日志
// 关闭LogBuffer释放资源
ALog.close();
生成密钥对
java -jar ./decrypt-keygen.jar
日志加密
使用 工具生成RSA密钥对文件,包含:
- 私钥文件 private.key(用于解密)
- 公钥文件 public.key(用于加密)
妥善保管私钥文件,用于日后日志的解密
公钥部署:
方式一:文件部署
- 将 public.key 文件拷贝到项目的
assets目录下, 初始化时,读取assets下公钥内容
方式二:直接赋值
- 将公钥内容直接赋值给 publicKey 变量
加密控制
// 开启加密 - 设置公钥
.setPubKey(publicKey)
// 关闭加密 - 不设置或设置为空
.setPubKey(null) 或省略此配置
日志解密
将 decrypt-decryptor.jar 与 private.key 置于同一目录下,命令行执行如下:
java -jar ./decrypt-decryptor.jar <日志文件路径>
解密的日志文件以 _decrypted.log 后缀存放在当前目录
总结
ALog 通过创新的 mmap 技术应用,结合压缩加密功能,为 Android 应用提供了高性能、安全、可靠的日志解决方案。其主要优势包括:
- 🚀 极高性能:mmap 零拷贝写入,比传统 I/O 快 70%+
- 💾 存储优化:压缩技术减少 80%+ 存储占用
- 🔒 数据安全:加密保护敏感信息
- 📅 智能管理:自动分文件,支持过期清理
- 🛠 易于集成:简洁 API,快速上手
如果你有任何问题或建议,欢迎在评论区讨论。
转载请注明来源。









网友评论