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