Пример #1
0
 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)
Пример #2
0
    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
Пример #3
0
 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)
Пример #4
0
    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)
Пример #5
0
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!")
Пример #6
0
            "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)
Пример #7
0
    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)