10 KiB
10 KiB
MemInfo 内存类型检测使用示例
概述
MemInfo 类提供了完整的内存信息检测功能,特别是增强了内存类型(LPDDR5、LPDDR4X等)的检测能力。
增强的功能
内存类型检测方法(5种)
-
系统属性检测 - 从 Android 系统属性获取
ro.boot.ddr_typero.boot.ddrtypero.vendor.boot.ddr_typepersist.vendor.ddr.type- 等多个属性路径
-
Sysfs 文件系统检测 - 从设备文件系统读取
- Qualcomm 设备路径
- MediaTek 设备路径
- Samsung Exynos 设备路径
- 通用路径
-
设备树检测 - 从设备树 (Device Tree) 获取
/proc/device-tree/memory/ddr-type/sys/firmware/devicetree/base/memory/ddr-type
-
内核日志检测 - 从 dmesg 日志分析
- 搜索 DDR、LPDDR、memory type 关键词
-
智能推测 - 根据 Android 版本和发布年份估算
- Android 14+ (2023+) → LPDDR5X
- Android 13 (2022+) → LPDDR5
- Android 12 (2021+) → LPDDR5
- Android 11 (2020+) → LPDDR4X
- Android 10 (2019+) → LPDDR4X
支持的内存类型
- LPDDR5X - 最新旗舰设备(2023+)
- LPDDR5 - 高端设备(2021-2023)
- LPDDR4X - 中高端设备(2019-2021)
- LPDDR4 - 主流设备(2017-2019)
- LPDDR3 - 老旧设备(2015-2017)
- LPDDR2 - 更老设备(2013-2015)
- DDR5/DDR4/DDR3 - 非移动设备
使用方法
1. 初始化
import com.xyzshell.andinfo.AndInfo
// 在 Application 或 Activity 中初始化
AndInfo.init(applicationContext)
// 获取 MemInfo 实例
val memInfo = AndInfo.instance.mem
2. 获取完整内存信息
val memoryInfo = memInfo.getMemoryInfo()
println("=== 内存信息 ===")
println("总内存: ${memInfo.formatBytes(memoryInfo.totalRam)}")
println("可用内存: ${memInfo.formatBytes(memoryInfo.availableRam)}")
println("已使用: ${memInfo.formatBytes(memoryInfo.usedRam)}")
println("内存类型: ${memoryInfo.memType}")
println("内存通道: ${memoryInfo.channels} 通道")
println("ZRAM 总大小: ${memInfo.formatBytes(memoryInfo.zramTotal)}")
println("ZRAM 已使用: ${memInfo.formatBytes(memoryInfo.zramUsed)}")
3. 仅获取内存类型
val memoryInfo = memInfo.getMemoryInfo()
val memType = memoryInfo.memType
when {
memType.contains("LPDDR5X") -> {
println("✅ 最新旗舰内存:LPDDR5X")
println("特点:最高性能,最低功耗,用于2023年后的旗舰设备")
}
memType.contains("LPDDR5") -> {
println("✅ 高端内存:LPDDR5")
println("特点:高性能,低功耗,用于2021-2023年的高端设备")
}
memType.contains("LPDDR4X") -> {
println("✅ 主流内存:LPDDR4X")
println("特点:均衡性能与功耗,用于大多数中高端设备")
}
memType.contains("LPDDR4") -> {
println("✅ 标准内存:LPDDR4")
println("特点:标准性能,用于主流设备")
}
memType.contains("estimated") -> {
println("ℹ️ 估算的内存类型:$memType")
println("提示:系统无法直接读取内存类型,基于设备信息估算")
}
else -> {
println("❓ 未知内存类型")
}
}
4. 内存性能评估
val memoryInfo = memInfo.getMemoryInfo()
// 评估内存性能等级
val performanceLevel = when {
memoryInfo.memType.contains("LPDDR5X") -> "旗舰级"
memoryInfo.memType.contains("LPDDR5") -> "高端"
memoryInfo.memType.contains("LPDDR4X") -> "中高端"
memoryInfo.memType.contains("LPDDR4") -> "中端"
else -> "入门"
}
println("内存性能等级: $performanceLevel")
println("理论带宽估算:")
when {
memoryInfo.memType.contains("LPDDR5X") -> {
val bandwidth = 8533 * memoryInfo.channels // LPDDR5X-8533
println(" 约 ${bandwidth} MB/s (${memoryInfo.channels}通道)")
}
memoryInfo.memType.contains("LPDDR5") -> {
val bandwidth = 6400 * memoryInfo.channels // LPDDR5-6400
println(" 约 ${bandwidth} MB/s (${memoryInfo.channels}通道)")
}
memoryInfo.memType.contains("LPDDR4X") -> {
val bandwidth = 4266 * memoryInfo.channels // LPDDR4X-4266
println(" 约 ${bandwidth} MB/s (${memoryInfo.channels}通道)")
}
}
5. 内存使用情况分析
val memoryInfo = memInfo.getMemoryInfo()
// 计算使用率
val usagePercentage = (memoryInfo.usedRam.toDouble() / memoryInfo.totalRam * 100).toInt()
println("=== 内存使用情况 ===")
println("总内存: ${memInfo.formatBytes(memoryInfo.totalRam)}")
println("已使用: ${memInfo.formatBytes(memoryInfo.usedRam)} (${usagePercentage}%)")
println("可用: ${memInfo.formatBytes(memoryInfo.availableRam)}")
// 使用状态
when {
usagePercentage >= 90 -> println("⚠️ 内存严重不足")
usagePercentage >= 75 -> println("⚠️ 内存偏紧")
usagePercentage >= 50 -> println("✓ 内存使用正常")
else -> println("✓ 内存充裕")
}
// ZRAM 情况
if (memoryInfo.zramTotal > 0) {
val zramUsagePercent = (memoryInfo.zramUsed.toDouble() / memoryInfo.zramTotal * 100).toInt()
println("\n=== ZRAM (压缩内存) ===")
println("ZRAM 大小: ${memInfo.formatBytes(memoryInfo.zramTotal)}")
println("ZRAM 已使用: ${memInfo.formatBytes(memoryInfo.zramUsed)} (${zramUsagePercent}%)")
}
6. 完整示例
class MemoryInfoActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
displayMemoryInfo()
}
private fun displayMemoryInfo() {
val memInfo = AndInfo.instance.mem
val memoryInfo = memInfo.getMemoryInfo()
val info = buildString {
appendLine("╔════════════════════════════════╗")
appendLine("║ 设备内存信息报告 ║")
appendLine("╚════════════════════════════════╝")
appendLine()
// 内存容量
appendLine("【内存容量】")
appendLine(" 总内存:${memInfo.formatBytes(memoryInfo.totalRam)}")
appendLine(" 可用:${memInfo.formatBytes(memoryInfo.availableRam)}")
appendLine(" 已使用:${memInfo.formatBytes(memoryInfo.usedRam)}")
val usagePercent = (memoryInfo.usedRam.toDouble() / memoryInfo.totalRam * 100).toInt()
appendLine(" 使用率:${usagePercent}%")
appendLine()
// 内存类型
appendLine("【内存规格】")
appendLine(" 类型:${memoryInfo.memType}")
appendLine(" 通道:${memoryInfo.channels} 通道")
// 性能评级
val perfLevel = when {
memoryInfo.memType.contains("LPDDR5X") -> "⭐⭐⭐⭐⭐ 旗舰级"
memoryInfo.memType.contains("LPDDR5") -> "⭐⭐⭐⭐ 高端"
memoryInfo.memType.contains("LPDDR4X") -> "⭐⭐⭐ 中高端"
memoryInfo.memType.contains("LPDDR4") -> "⭐⭐ 中端"
else -> "⭐ 入门"
}
appendLine(" 性能等级:$perfLevel")
appendLine()
// ZRAM 信息
if (memoryInfo.zramTotal > 0) {
appendLine("【ZRAM 压缩内存】")
appendLine(" 总大小:${memInfo.formatBytes(memoryInfo.zramTotal)}")
appendLine(" 已使用:${memInfo.formatBytes(memoryInfo.zramUsed)}")
val zramPercent = (memoryInfo.zramUsed.toDouble() / memoryInfo.zramTotal * 100).toInt()
appendLine(" 使用率:${zramPercent}%")
}
}
println(info)
// 或者显示在 TextView 中
// textView.text = info
}
}
检测原理说明
1. 系统属性检测
// 尝试读取系统属性
getprop ro.boot.ddr_type
// 可能返回: "LPDDR5", "4", "5" 等
2. Sysfs 文件检测
// Qualcomm 设备
/sys/class/devfreq/soc:qcom,cpu-cpu-llcc-bw/device/type
// MediaTek 设备
/sys/kernel/debug/emi_mbw/dram_type
// Samsung Exynos 设备
/sys/class/devfreq/17000010.devfreq_mif/device/type
3. 设备树检测
// 设备树路径
/proc/device-tree/memory/ddr-type
/sys/firmware/devicetree/base/memory/ddr-type
4. 内核日志检测
# 搜索内核日志
dmesg | grep -iE 'ddr|lpddr|memory.*type'
# 可能输出: "LPDDR5 detected", "DDR Type: 5" 等
5. 智能推测规则
| Android 版本 | 发布年份 | 估算类型 |
|---|---|---|
| 14+ | 2023+ | LPDDR5X |
| 13 | 2022-2023 | LPDDR5 |
| 12 | 2021-2022 | LPDDR5 |
| 11 | 2020-2021 | LPDDR4X |
| 10 | 2019-2020 | LPDDR4X |
| 9 | 2018-2019 | LPDDR4 |
| ≤8 | ≤2017 | LPDDR3 |
典型设备示例
高端旗舰(2023+)
内存类型: LPDDR5X
通道: 4 通道
理论带宽: 约 34,132 MB/s
性能等级: ⭐⭐⭐⭐⭐ 旗舰级
代表设备: Samsung S24 Ultra, Xiaomi 14 Pro
高端设备(2021-2023)
内存类型: LPDDR5
通道: 4 通道
理论带宽: 约 25,600 MB/s
性能等级: ⭐⭐⭐⭐ 高端
代表设备: Pixel 7 Pro, OnePlus 11
中高端设备(2019-2021)
内存类型: LPDDR4X
通道: 2 通道
理论带宽: 约 8,532 MB/s
性能等级: ⭐⭐⭐ 中高端
代表设备: Pixel 5, Mi 10T
注意事项
-
权限要求:
- 无需特殊权限
- 某些检测路径可能需要 root 权限才能访问
-
检测准确性:
- 优先级:系统属性 > Sysfs > 设备树 > 内核日志 > 估算
- 带 "(estimated)" 标记表示是推测值
-
设备差异:
- 不同厂商的设备,内存信息存储位置可能不同
- 某些定制 ROM 可能修改了相关路径
-
性能差异:
- 相同类型的内存,不同频率性能也不同
- 通道数会显著影响实际带宽
完成度
✅ 100% - 所有功能都已实现
- 系统属性检测 ✅
- Sysfs 文件系统检测 ✅
- 设备树检测 ✅
- 内核日志检测 ✅
- 智能推测 ✅
- 内存类型解析 ✅
- 支持所有主流内存类型 ✅
- 完整的中文注释 ✅
- 详细的使用文档 ✅
所有功能都已正确实现并可以使用!🎉