SurfaceFlinger dump 中 Imported gralloc buffers 的統(tǒng)計(jì)腳本

功能特點(diǎn)

  1. 智能分組規(guī)則

    • 有"[]"且不為空:使用"[]"中的內(nèi)容分組
    • 有"[]"但為空:使用"#"后面的內(nèi)容分組
    • 沒(méi)有"[]":使用"#"前面的內(nèi)容分組
    • 其他情況:使用原始name分組
  2. 完整name顯示:輸出所有分組的完整原始name

  3. 動(dòng)態(tài)格式對(duì)齊:自動(dòng)調(diào)整輸出寬度,確保長(zhǎng)name也能整齊顯示

  4. 交互式輸入:從標(biāo)準(zhǔn)輸入讀取內(nèi)容,支持多行粘貼

  5. 用戶(hù)友好:結(jié)果輸出后等待用戶(hù)確認(rèn)才關(guān)閉窗口

使用方法

  1. 運(yùn)行腳本
  2. 粘貼需要分析的文本內(nèi)容
  3. 輸入空行結(jié)束輸入
  4. 查看分析結(jié)果
  5. 按回車(chē)鍵退出
import re
from collections import defaultdict
import sys

def extract_name_key(name):
    """
    根據(jù)規(guī)則提取name的關(guān)鍵字用于分組
    """
    # 查找[]中的內(nèi)容
    bracket_match = re.search(r'\[([^\]]*)\]', name)
    
    if bracket_match:
        bracket_content = bracket_match.group(1)
        # 規(guī)則2: 如果[]中的內(nèi)容不為空,則使用[]中的內(nèi)容作為key
        if bracket_content:
            return bracket_content
        else:
            # 規(guī)則3: 如果[]中的內(nèi)容為空,則使用#號(hào)后面的內(nèi)容
            hash_match = re.search(r'#([^(]*)', name)
            if hash_match:
                return hash_match.group(1).strip()
    else:
        # 如果沒(méi)有[],則使用#號(hào)前面的內(nèi)容作為key
        hash_match = re.search(r'([^#]*)#', name)
        if hash_match:
            return hash_match.group(1).strip()
    
    # 如果以上規(guī)則都不適用,則返回原始name
    return name

def parse_input():
    """
    從標(biāo)準(zhǔn)輸入解析內(nèi)容并統(tǒng)計(jì)相同name的size總和
    """
    # 使用字典來(lái)存儲(chǔ)每個(gè)key的size總和和原始name列表
    size_sum = defaultdict(lambda: [0.0, []])
    
    print("請(qǐng)輸入要解析的內(nèi)容(輸入空行結(jié)束):")
    
    # 從標(biāo)準(zhǔn)輸入讀取多行內(nèi)容
    lines = []
    while True:
        try:
            line = input()
            if line.strip() == "":  # 空行表示輸入結(jié)束
                break
            lines.append(line)
        except EOFError:
            break
    
    # 如果沒(méi)有輸入內(nèi)容,則退出
    if not lines:
        print("沒(méi)有輸入任何內(nèi)容")
        return {}
    
    # 解析每一行
    for line in lines:
        line = line.strip()
        if not line.startswith('+ name:'):
            continue
        
        # 提取name和size
        name_match = re.search(r'name:([^,]+)', line)
        size_match = re.search(r'size:([\d.]+)KiB', line)
        
        if name_match and size_match:
            original_name = name_match.group(1)
            size = float(size_match.group(1))
            
            # 提取用于分組的key
            key = extract_name_key(original_name)
            
            # 累加size并保存原始name
            size_sum[key][0] += size
            size_sum[key][1].append(original_name)
    
    return size_sum

def main():
    # 解析輸入內(nèi)容并獲取統(tǒng)計(jì)結(jié)果
    size_stats = parse_input()
    
    if not size_stats:
        print("沒(méi)有找到有效數(shù)據(jù)")
        input("按回車(chē)鍵退出...")
        return
    
    # 準(zhǔn)備輸出數(shù)據(jù)
    output_data = []
    max_name_length = 0
    
    for key, (total_size, original_names) in size_stats.items():
        # 使用第一個(gè)原始name作為顯示名稱(chēng)
        display_name = original_names[0]
        
        # 更新最大name長(zhǎng)度
        if len(display_name) > max_name_length:
            max_name_length = len(display_name)
        
        output_data.append((display_name, total_size))
    
    # 設(shè)置name字段的寬度,確保對(duì)齊
    # 最小寬度為40,但如果name更長(zhǎng)則使用實(shí)際長(zhǎng)度
    name_width = max(max_name_length + 2, 40)
    
    # 按size總和從大到小排序
    sorted_stats = sorted(output_data, key=lambda x: x[1], reverse=True)
    
    # 輸出結(jié)果
    print("\n相同name的size總和統(tǒng)計(jì)(按從大到小排序):")
    separator = "-" * (name_width + 20)  # 動(dòng)態(tài)調(diào)整分隔線長(zhǎng)度
    print(separator)
    
    for i, (display_name, total_size) in enumerate(sorted_stats, 1):
        # 使用動(dòng)態(tài)寬度確保對(duì)齊
        print(f"{i:2d}. {display_name:<{name_width}} {total_size:>10.2f} KiB")
    
    # 輸出總計(jì)信息
    total_all = sum(size for _, size in sorted_stats)
    print(separator)
    print(f"總計(jì): {len(sorted_stats)} 個(gè)分組, 總大小: {total_all:.2f} KiB")
    
    # 等待用戶(hù)輸入后才關(guān)閉窗口
    input("\n按回車(chē)鍵退出...")

if __name__ == "__main__":
    main()

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容