???traceview??dmtracedump????Android????
???????????? ???????[ 2013/3/7 11:06:54 ] ????????
????str1=r1.sub("_"??all_methods[method_id][1])
????str2=r1.sub("_"??all_methods[method_id][2])
????return str1+"_"+str2
????def gen_dot_script_file():
????myoutfile = open("graph.dot"?? "w")
????myoutfile.write("digraph vanzo {/n/n");
????for one in all_methods.keys():
????if parent_methods.has_key(one):
????myoutfile.write(gen_funcname(one)+" [shape=rectangle];/n")
????else:
????if child_methods.has_key(one):
????myoutfile.write(gen_funcname(one)+" [shape=ellipse];/n")
????for one in method_calls.keys():
????for two in method_calls[one]:
????myoutfile.write(gen_funcname(one) + ' -> ' + gen_funcname(two) + ' [label="' + str(method_calls[one][two]) + '" fontsize="10"];/n')
????myoutfile.write("/n}/n");
????myoutfile.close
????############################################################
????########################## Script starts from here #########
????############################################################
????if len(sys.argv) < 2:
????print 'No input file specified.'
????sys.exit()
????if not (os.path.exists(sys.argv[1])):
????print "input file not exists"
????sys.exit()
????#Now handle the text part
????current_section=0
????for line in open(sys.argv[1]):
????line2 = line.strip()
????if (line2.startswith("*")):
????if (line2.startswith("*version")):
????current_section=1
????else:
????if (line2.startswith("*threads")):
????current_section=2
????else:
????if (line2.startswith("*methods")):
????current_section=3
????else:
????if (line2.startswith("*end")):
????current_section=4
????break
????continue
????if current_section==2:
????add_one_thread(line2)
????if current_section==3:
????add_one_method(line2)
????#Now handle the binary part
????mybinfile = open(sys.argv[1]?? "rb")
????alldata = mybinfile.read()
????mybinfile.close()
????pos=alldata.find("SLOW")
????offset??=struct.unpack("H"??alldata[pos+6:pos+8])
????pos2=pos+offset #pos2 is where the record begin
????numofrecords = len(alldata) - pos2
????numofrecords = numofrecords / 9
????for i in xrange(numofrecords):
????add_one_record(alldata[pos2 + i * 9:pos2 + i * 9 + 9])
????my_stack=[0]
????for onerecord in all_records:
????thread_id=onerecord[0];
????method_id=onerecord[1];
????action=onerecord[2];
????time=onerecord[3];
????if(action==0):
????if(len(my_stack) > 1):
????parent_method_id=my_stack[-1]
????handle_one_call(parent_method_id??method_id)
????my_stack.append(method_id)
????else:
????if(action==1):
????if(len(my_stack) > 1):
????my_stack.pop()
????gen_dot_script_file()
????os.system("dot -Tjpg graph.dot -o output.jpg;rm -f graph.dot");
????#!/usr/bin/env python
????"""
????turn the traceview data into a jpg pic?? showing methods call relationship
????"""
????import sys
????import os
????import struct
????import re
????#####################################################
????######################## Global Variable ############
????#####################################################
????target_thread=1 #the thread that we want to track?? filt out other threads
????#all_actions = ["enter"??"exit"??"exception"??"reserved"]
????all_threads = {}
????all_methods = {}
????all_records = []
????parent_methods = {}
????child_methods = {}
????method_calls = {}
????######################################################
????############################## Methods ###############
????######################################################
????def add_one_thread(line):
????fields = line.split("/t")
????all_threads[int(fields[0]??10)]=fields
????def add_one_method(line):
??????
???·???
??????????????????
2023/3/23 14:23:39???д?ò??????????
2023/3/22 16:17:39????????????????????Щ??
2022/6/14 16:14:27??????????????????????????
2021/10/18 15:37:44???????????????
2021/9/17 15:19:29???·???????·
2021/9/14 15:42:25?????????????
2021/5/28 17:25:47??????APP??????????
2021/5/8 17:01:11