344 lines
10 KiB
Markdown
344 lines
10 KiB
Markdown
# MemInfo 内存类型检测使用示例
|
||
|
||
## 概述
|
||
MemInfo 类提供了完整的内存信息检测功能,特别是增强了内存类型(LPDDR5、LPDDR4X等)的检测能力。
|
||
|
||
## 增强的功能
|
||
|
||
### 内存类型检测方法(5种)
|
||
|
||
1. **系统属性检测** - 从 Android 系统属性获取
|
||
- `ro.boot.ddr_type`
|
||
- `ro.boot.ddrtype`
|
||
- `ro.vendor.boot.ddr_type`
|
||
- `persist.vendor.ddr.type`
|
||
- 等多个属性路径
|
||
|
||
2. **Sysfs 文件系统检测** - 从设备文件系统读取
|
||
- Qualcomm 设备路径
|
||
- MediaTek 设备路径
|
||
- Samsung Exynos 设备路径
|
||
- 通用路径
|
||
|
||
3. **设备树检测** - 从设备树 (Device Tree) 获取
|
||
- `/proc/device-tree/memory/ddr-type`
|
||
- `/sys/firmware/devicetree/base/memory/ddr-type`
|
||
|
||
4. **内核日志检测** - 从 dmesg 日志分析
|
||
- 搜索 DDR、LPDDR、memory type 关键词
|
||
|
||
5. **智能推测** - 根据 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. 初始化
|
||
|
||
```kotlin
|
||
import com.xyzshell.andinfo.AndInfo
|
||
|
||
// 在 Application 或 Activity 中初始化
|
||
AndInfo.init(applicationContext)
|
||
|
||
// 获取 MemInfo 实例
|
||
val memInfo = AndInfo.instance.mem
|
||
```
|
||
|
||
### 2. 获取完整内存信息
|
||
|
||
```kotlin
|
||
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. 仅获取内存类型
|
||
|
||
```kotlin
|
||
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. 内存性能评估
|
||
|
||
```kotlin
|
||
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. 内存使用情况分析
|
||
|
||
```kotlin
|
||
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. 完整示例
|
||
|
||
```kotlin
|
||
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. 系统属性检测
|
||
```kotlin
|
||
// 尝试读取系统属性
|
||
getprop ro.boot.ddr_type
|
||
// 可能返回: "LPDDR5", "4", "5" 等
|
||
```
|
||
|
||
### 2. Sysfs 文件检测
|
||
```kotlin
|
||
// 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. 设备树检测
|
||
```kotlin
|
||
// 设备树路径
|
||
/proc/device-tree/memory/ddr-type
|
||
/sys/firmware/devicetree/base/memory/ddr-type
|
||
```
|
||
|
||
### 4. 内核日志检测
|
||
```bash
|
||
# 搜索内核日志
|
||
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
|
||
```
|
||
|
||
## 注意事项
|
||
|
||
1. **权限要求**:
|
||
- 无需特殊权限
|
||
- 某些检测路径可能需要 root 权限才能访问
|
||
|
||
2. **检测准确性**:
|
||
- 优先级:系统属性 > Sysfs > 设备树 > 内核日志 > 估算
|
||
- 带 "(estimated)" 标记表示是推测值
|
||
|
||
3. **设备差异**:
|
||
- 不同厂商的设备,内存信息存储位置可能不同
|
||
- 某些定制 ROM 可能修改了相关路径
|
||
|
||
4. **性能差异**:
|
||
- 相同类型的内存,不同频率性能也不同
|
||
- 通道数会显著影响实际带宽
|
||
|
||
## 完成度
|
||
|
||
✅ **100%** - 所有功能都已实现
|
||
- 系统属性检测 ✅
|
||
- Sysfs 文件系统检测 ✅
|
||
- 设备树检测 ✅
|
||
- 内核日志检测 ✅
|
||
- 智能推测 ✅
|
||
- 内存类型解析 ✅
|
||
- 支持所有主流内存类型 ✅
|
||
- 完整的中文注释 ✅
|
||
- 详细的使用文档 ✅
|
||
|
||
所有功能都已正确实现并可以使用!🎉
|
||
|