def pull_file_between_time(self, src_path, dst_path, start_timestamp, end_timestamp): ''' 提取/data/anr 目录下 在起止时间戳之间的文件 :return: ''' # 在PC上创建目录 dst_path = os.path.join(dst_path, src_path.split("/")[-1]) FileUtils.makedir(dst_path) for src_file_path in self.list_dir_between_time(src_path, start_timestamp, end_timestamp): self.pull_file(src_file_path, dst_path)
def __init__(self, device_id=None, package=None, interval=None): RuntimeData.top_dir = os.getcwd() if "android" in RuntimeData.top_dir: RuntimeData.top_dir = FileUtils.get_top_dir() logger.debug("RuntimeData.top_dir:" + RuntimeData.top_dir) self.config_dic = self.parse_data_from_config() RuntimeData.config_dic = self.config_dic self.serialnum = device_id if device_id != None else self.config_dic[ 'serialnum'] #代码中重新传入device_id 则会覆盖原来配置文件config.conf的值,主要为了debug方便 self.packages = package if package != None else self.config_dic[ 'package'] #代码中重新传入package 则会覆盖原来配置文件config.conf的值,为了debug方便 self.frequency = interval if interval != None else self.config_dic[ 'frequency'] #代码中重新传入interval 则会覆盖原来配置文件config.conf的值,为了debug方便 self.timeout = self.config_dic['timeout'] self.exceptionlog_list = self.config_dic["exceptionlog"] self.device = AndroidDevice(self.serialnum) # 如果config文件中 packagename为空,就获取前台进程,匹配图兰朵,测的app太多,支持配置文件不传package if not self.packages: # 进程名不会有#,转化为list self.packages = self.device.adb.get_foreground_process().split("#") RuntimeData.packages = self.packages #与终端交互有关 self.keycode = '' self.pid = 0 self._init_queue() self.monitors = [] self.logcat_monitor = None
def _top_cpuinfo(self): self._top_pipe = self.device.adb.run_shell_cmd(self.top_cmd, sync=False) out = self._top_pipe.stdout.read() error = self._top_pipe.stderr.read() if error: logger.error("into cpuinfos error : " + str(error)) return out = str(out, "utf-8") out.replace('\r', '') top_file = os.path.join(RuntimeData.package_save_path, 'top.txt') with open(top_file, "a+", encoding="utf-8") as writer: writer.write(TimeUtils.getCurrentTime() + " top info:\n") writer.write(out + "\n\n") #避免文件过大,超过100M清理 if FileUtils.get_FileSize(top_file) > 100: os.remove(top_file) return PckCpuinfo(self.packages, out, self.sdkversion)
def run(self, time_out=None): self.clear_heapdump() # objgraph.show_growth() # 对设备连接情况的检查 if not self.serialnum: # androiddevice 没传 serialnum,默认执行adb shell logger.info( "serialnum in config file is null,default get connected phone") is_device_connect = False for i in range(0, 5): if self.device.adb.is_connected(self.serialnum): is_device_connect = True break else: logger.error("device not found:" + self.serialnum) time.sleep(2) if not is_device_connect: logger.error("after 5 times check,device not found:" + self.serialnum) return # 对是否安装被测app的检查 只在最开始检查一次 if not self.device.adb.is_app_installed(self.packages[0]): logger.error("test app not installed:" + self.packages[0]) return try: #初始化数据处理的类,将没有消息队列传递过去,以便获取数据,并处理 # datahandle = DataWorker(self.get_queue_dic()) # 将queue传进去,与datahandle那个线程交互 self.add_monitor( CpuMonitor(self.serialnum, self.packages, self.frequency, self.timeout)) self.add_monitor( MemMonitor(self.serialnum, self.packages, self.frequency, self.timeout)) self.add_monitor( TrafficMonitor(self.serialnum, self.packages[0], self.frequency, self.timeout)) # 软件方式 获取电量不准,已用硬件方案测试功耗 # self.add_monitor(PowerMonitor(self.serialnum, self.frequency,self.timeout)) self.add_monitor( FPSMonitor(self.serialnum, self.packages[0], self.frequency, self.timeout)) # 6.0以下能采集到fd数据,7.0以上没权限 if self.device.adb.get_sdk_version() <= 23: self.add_monitor( FdMonitor(self.serialnum, self.packages[0], self.frequency, self.timeout)) self.add_monitor( ThreadNumMonitor(self.serialnum, self.packages[0], self.frequency, self.timeout)) if self.config_dic["monkey"] == "true": self.add_monitor(Monkey(self.serialnum, self.packages[0])) if self.config_dic["main_activity"] and self.config_dic[ "activity_list"]: self.add_monitor( DeviceMonitor(self.serialnum, self.packages[0], self.frequency, self.config_dic["main_activity"], self.config_dic["activity_list"], RuntimeData.exit_event)) if len(self.monitors): start_time = TimeUtils.getCurrentTimeUnderline() RuntimeData.start_time = start_time if self.config_dic["save_path"]: RuntimeData.package_save_path = os.path.join( self.config_dic["save_path"], self.packages[0], start_time) else: RuntimeData.package_save_path = os.path.join( RuntimeData.top_dir, 'results', self.packages[0], start_time) FileUtils.makedir(RuntimeData.package_save_path) self.save_device_info() for monitor in self.monitors: #启动所有的monitors try: monitor.start(start_time) except Exception as e: logger.error(e) # logcat的代码可能会引起死锁,拎出来单独处理logcat try: self.logcat_monitor = LogcatMonitor( self.serialnum, self.packages[0]) # 如果有异常日志标志,才启动这个模块 if self.exceptionlog_list: self.logcat_monitor.set_exception_list( self.exceptionlog_list) self.logcat_monitor.add_log_handle( self.logcat_monitor.handle_exception) time.sleep(1) self.logcat_monitor.start(start_time) except Exception as e: logger.error(e) timeout = time_out if time_out != None else self.config_dic[ 'timeout'] endtime = time.time() + timeout while (time.time() < endtime): #吊着主线程防止线程中断 # 时间到或测试过程中检测到异常 if self.check_exit_signal_quit(): logger.error("app " + str(self.packages[0]) + " exit signal, quit!") break time.sleep(self.frequency) logger.debug("time is up,finish!!!") self.stop() # try: # datahandle.stop() # time.sleep(self.frequency*2) # # 延迟一点时间结束上报,已让数据上报完 # # report.stop() # except: # logger.debug("report or datahandle stop exception") # finally: # logger.info("time is up, end") # os._exit(0) except KeyboardInterrupt: #捕获键盘异常的事件,例如ctrl c logger.debug(" catch keyboardInterrupt, goodbye!!!") # 收尾工作 self.stop() os._exit(0) except Exception as e: logger.error("Exception in run") logger.error(e)
import sys import re import logging import logging.handlers from logging.handlers import TimedRotatingFileHandler BaseDir=os.path.dirname(__file__) sys.path.append(os.path.join(BaseDir,'../..')) from mobileperf.common.utils import FileUtils logger = logging.getLogger('mobileperf') logger.setLevel(logging.DEBUG) fmt = logging.Formatter('[%(asctime)s]%(levelname)s:%(name)s:%(module)s:%(message)s') streamhandler=logging.StreamHandler(sys.stdout) streamhandler.setFormatter(fmt) # 调试时改为DEBUG 发布改为 INFO streamhandler.setLevel(logging.DEBUG) dir = os.path.join(FileUtils.get_top_dir(), 'logs') FileUtils.makedir(dir) log_file = os.path.join(dir,"mobileperf_log") log_file_handler = TimedRotatingFileHandler(filename=log_file, when="D", interval=1, backupCount=3) log_file_handler.suffix = "%Y-%m-%d_%H-%M-%S.log" log_file_handler.extMatch = re.compile(r"^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}.log$") log_file_handler.setFormatter(fmt) log_file_handler.setLevel(logging.DEBUG) logger.addHandler(streamhandler) logger.addHandler(log_file_handler) if __name__=="__main__": logger.debug("测试3!")
"time": timestamp, "act_name": content[1], "this_time": content[2], "total_time": content[3], "launch_type": content[4] } perf_data['launch_time'].append(dic) # perf_queue.put(perf_data) with open(tmp_file, "a+") as f: csvwriter = csv.writer(f, lineterminator='\n') #这种方式可以去除csv的空行 logger.debug("save launchtime data to csv: " + str(self.launch_list)) csvwriter.writerows(self.launch_list) del self.launch_list[:] if __name__ == '__main__': logcat_monitor = LogcatMonitor("85I7UO4PFQCINJL7", "com.yunos.tv.alitvasr") # 如果有异常日志标志,才启动这个模块 exceptionlog_list = ["fatal exception", "has died"] if exceptionlog_list: logcat_monitor.set_exception_list(exceptionlog_list) logcat_monitor.add_log_handle(logcat_monitor.handle_exception) start_time = TimeUtils.getCurrentTimeUnderline() RuntimeData.package_save_path = os.path.join(FileUtils.get_top_dir(), 'results', "com.yunos.tv.alitvasr", start_time) logcat_monitor.start(start_time)
def save(self, save_file_path, loglist): monkey_file = os.path.join(save_file_path) with open(monkey_file, 'a+', encoding="utf-8") as log_f: for log in loglist: log_f.write(log + "\n") if __name__ == "__main__": test_pacakge_list = ["com.alibaba.ailabs.genie.musicplayer","com.alibaba.ailabs.genie.contacts","com.alibaba.ailabs.genie.launcher", "com.alibaba.ailabs.genie.shopping","com.youku.iot"] device = AndroidDevice() # device.adb.kill_process("monkey") # for i in range(0, 10): # for package in test_pacakge_list: # monkey = Monkey("",package,1200000000) # monkey.start(TimeUtils.getCurrentTimeUnderline()) # time.sleep(60*60*2) # monkey.stop() start_time = TimeUtils.getCurrentTimeUnderline() logger.debug(start_time) RuntimeData.top_dir = FileUtils.get_top_dir() RuntimeData.package_save_path = os.path.join(RuntimeData.top_dir, 'results', "com.alibaba.ailabs.genie.contacts", start_time) main_activity = ["com.alibaba.ailabs.genie.contacts.MainActivity"] activity_list = ["com.alibaba.ailabs.genie.contacts.MainActivity", "com.alibaba.ailabs.genie.contacts.cmd.CmdDispatchActivity", "com.alibaba.ailabs.genie.contacts.cmd.transform.VoipToPstnActivity", "com.alibaba.ailabs.genie.contacts.add.AddContactsActivity"] monkey = Monkey("WST4DYVWKBFEV8Q4","com.alibaba.ailabs.genie.smartapp") monkey.start(start_time)