DevCheck-lib/MemInfo内存类型检测使用示例.md
2025-12-24 15:32:35 +08:00

344 lines
10 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 文件系统检测 ✅
- 设备树检测 ✅
- 内核日志检测 ✅
- 智能推测 ✅
- 内存类型解析 ✅
- 支持所有主流内存类型 ✅
- 完整的中文注释 ✅
- 详细的使用文档 ✅
所有功能都已正确实现并可以使用!🎉