Skip to content

Commit

Permalink
update python api
Browse files Browse the repository at this point in the history
  • Loading branch information
rafa0128 committed Apr 10, 2023
1 parent 18044f7 commit 7e32ba3
Show file tree
Hide file tree
Showing 4 changed files with 39 additions and 36 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,10 @@ python -m solox --host={ip} --port={port}
from solox.public.apm import APM
# solox version >= 2.1.2

apm = APM(pkgName='com.bilibili.app.in',deviceId='ca6bd5a5',platform='Android', surfaceview=True)
apm = APM(pkgName='com.bilibili.app.in',deviceId='ca6bd5a5',platform='Android', surfaceview=True, noLog=True)
# apm = APM(pkgName='com.bilibili.app.in', platform='iOS') only supports one device
# surfaceview: False = gfxinfo (Developer - GPU rendering mode - adb shell dumpsys gfxinfo)
# noLog : False (Save test data to log file)

cpu = apm.collectCpu() # %
memory = apm.collectMemory() # MB
Expand Down
3 changes: 2 additions & 1 deletion README.zh.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,9 +50,10 @@ python -m solox --host={ip} --port={port}
from solox.public.apm import APM
# solox version >= 2.1.2

apm = APM(pkgName='com.bilibili.app.in',deviceId='ca6bd5a5',platform='Android', surfaceview=True)
apm = APM(pkgName='com.bilibili.app.in',deviceId='ca6bd5a5',platform='Android', surfaceview=True, noLog=True)
# apm = APM(pkgName='com.bilibili.app.in', platform='iOS') only supports one device
# surfaceview: False = gfxinfo (手机开发者-GPU呈现模式- adb shell dumpsys gfxinfo)
# noLog : False (会把测试数据写到log文件)
cpu = apm.collectCpu() # %
memory = apm.collectMemory() # MB
flow = apm.collectFlow(wifi=True) # KB
Expand Down
57 changes: 29 additions & 28 deletions solox/public/apm.py
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,9 @@ def getiOSCpuRate(self, sueApi=False):
f.add_log(os.path.join(f.report_dir,'cpu_sys.log'), apm_time, sysCpuRate)
return appCpuRate, sysCpuRate

def getCpuRate(self, useApi=False):
def getCpuRate(self, noLog=False):
"""Get the cpu rate of a process, unit:%"""
appCpuRate, systemCpuRate = self.getAndroidCpuRate(useApi) if self.platform == Platform.Android else self.getiOSCpuRate(useApi)
appCpuRate, systemCpuRate = self.getAndroidCpuRate(noLog) if self.platform == Platform.Android else self.getiOSCpuRate(noLog)
return appCpuRate, systemCpuRate


Expand Down Expand Up @@ -132,10 +132,10 @@ def getiOSMem(self):
dalvikPass = 0
return totalPass, nativePass, dalvikPass

def getProcessMem(self, useApi=False):
def getProcessMem(self, noLog=False):
"""Get the app memory"""
totalPass, nativePass, dalvikPass = self.getAndroidMem() if self.platform == Platform.Android else self.getiOSMem()
if useApi is False:
if noLog is False:
time.sleep(1)
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'mem_total.log'), apm_time, totalPass)
Expand All @@ -150,15 +150,15 @@ def __init__(self, deviceId, platform=Platform.Android):
self.deviceId = deviceId
self.platform = platform

def getBattery(self, useApi=False):
def getBattery(self, noLog=False):
if self.platform == Platform.Android:
level, temperature = self.getAndroidBattery(useApi)
level, temperature = self.getAndroidBattery(noLog)
return level, temperature
else:
temperature, current, voltage, power = self.getiOSBattery(useApi)
temperature, current, voltage, power = self.getiOSBattery(noLog)
return temperature, current, voltage, power

def getAndroidBattery(self, useApi=False):
def getAndroidBattery(self, noLog=False):
"""Get android battery info, unit:%"""
# Switch mobile phone battery to non-charging state
cmd = 'dumpsys battery set status 1'
Expand All @@ -168,22 +168,22 @@ def getAndroidBattery(self, useApi=False):
output = adb.shell(cmd=cmd, deviceId=self.deviceId)
level = int(re.findall(u'level:\s?(\d+)', output)[0])
temperature = int(re.findall(u'temperature:\s?(\d+)', output)[0]) / 10
if useApi is False:
if noLog is False:
time.sleep(1)
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'battery_level.log'), apm_time, level)
f.add_log(os.path.join(f.report_dir,'battery_tem.log'), apm_time, temperature)
return level, temperature

def getiOSBattery(self, useApi=False):
def getiOSBattery(self, noLog=False):
"""Get ios battery info, unit:%"""
d = tidevice.Device()
ioDict = d.get_io_power()
tem = m._setValue(ioDict['Diagnostics']['IORegistry']['Temperature'])
current = m._setValue(abs(ioDict['Diagnostics']['IORegistry']['InstantAmperage']))
voltage = m._setValue(ioDict['Diagnostics']['IORegistry']['Voltage'])
power = current * voltage / 1000
if useApi is False:
if noLog is False:
time.sleep(1)
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'battery_tem.log'), apm_time, tem) # unknown
Expand Down Expand Up @@ -242,10 +242,10 @@ def getiOSNet(self):
recNum = round(float(apm_data[0]), 2)
return sendNum, recNum

def getNetWorkData(self, wifi=True, useApi=False):
def getNetWorkData(self, wifi=True, noLog=False):
"""Get the upflow and downflow data, unit:KB"""
sendNum, recNum = self.getAndroidNet(wifi) if self.platform == Platform.Android else self.getiOSNet()
if useApi is False:
if noLog is False:
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'upflow.log'), apm_time, sendNum)
f.add_log(os.path.join(f.report_dir,'downflow.log'), apm_time, recNum)
Expand All @@ -261,40 +261,40 @@ def __init__(self, pkgName, deviceId, platform=Platform.Android, surfaceview=Tru
self.surfaceview = surfaceview
self.apm_time = datetime.datetime.now().strftime('%H:%M:%S.%f')

def getAndroidFps(self, useApi=False):
def getAndroidFps(self, noLog=False):
"""get Android Fps, unit:HZ"""
monitors = FPSMonitor(device_id=self.deviceId, package_name=self.pkgName, frequency=1,
surfaceview=self.surfaceview, start_time=TimeUtils.getCurrentTimeUnderline())
monitors.start()
fps, jank = monitors.stop()
if useApi is False:
if noLog is False:
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'fps.log'), apm_time, fps)
f.add_log(os.path.join(f.report_dir,'jank.log'), apm_time, jank)
return fps, jank

def getiOSFps(self, useApi=False):
def getiOSFps(self, noLog=False):
"""get iOS Fps"""
apm = iosAPM(self.pkgName)
fps = int(apm.getPerformance(apm.fps))
if useApi is False:
if noLog is False:
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'fps.log'), apm_time, fps)
return fps, 0

def getFPS(self, useApi=False):
def getFPS(self, noLog=False):
"""get fps、jank"""
fps, jank = self.getAndroidFps(useApi) if self.platform == Platform.Android else self.getiOSFps(useApi)
fps, jank = self.getAndroidFps(noLog) if self.platform == Platform.Android else self.getiOSFps(noLog)
return fps, jank

class GPU(object):
def __init__(self, pkgName):
self.pkgName = pkgName

def getGPU(self, useApi=False):
def getGPU(self, noLog=False):
apm = iosAPM(self.pkgName)
gpu = apm.getPerformance(apm.gpu)
if useApi is False:
if noLog is False:
apm_time = datetime.datetime.now().strftime('%H:%M:%S')
f.add_log(os.path.join(f.report_dir,'gpu.log'), apm_time, gpu)
return gpu
Expand Down Expand Up @@ -339,30 +339,31 @@ def getPerformance(self, perfTpe: DataType):
class APM(object):
"""for python api"""

def __init__(self, pkgName, deviceId='', platform=Platform.Android, surfaceview=True):
def __init__(self, pkgName, deviceId='', platform=Platform.Android, surfaceview=True, noLog=True):
self.pkgName = pkgName
self.deviceId = deviceId
self.platform = platform
self.surfaceview = surfaceview
self.noLog = noLog
d.devicesCheck(platform=self.platform, deviceid=self.deviceId, pkgname=self.pkgName)

def collectCpu(self):
_cpu = CPU(self.pkgName, self.deviceId, self.platform)
appCpuRate, systemCpuRate = _cpu.getCpuRate(useApi=True)
appCpuRate, systemCpuRate = _cpu.getCpuRate(noLog=self.noLog)
result = {'appCpuRate': appCpuRate, 'systemCpuRate': systemCpuRate}
logger.info(f'cpu: {result}')
return result

def collectMemory(self):
_memory = MEM(self.pkgName, self.deviceId, self.platform)
totalPass, nativePass, dalvikPass = _memory.getProcessMem(useApi=True)
totalPass, nativePass, dalvikPass = _memory.getProcessMem(noLog=self.noLog)
result = {'totalPass': totalPass, 'nativePass': nativePass, 'dalvikPass': dalvikPass}
logger.info(f'memory: {result}')
return result

def collectBattery(self):
_battery = Battery(self.deviceId, self.platform)
final = _battery.getBattery(useApi=True)
final = _battery.getBattery(noLog=self.noLog)
if self.platform == Platform.Android:
result = {'level': final[0], 'temperature': final[1]}
else:
Expand All @@ -372,14 +373,14 @@ def collectBattery(self):

def collectFlow(self, wifi=True):
_flow = Flow(self.pkgName, self.deviceId, self.platform)
upFlow, downFlow = _flow.getNetWorkData(wifi=wifi,useApi=True)
upFlow, downFlow = _flow.getNetWorkData(wifi=wifi,noLog=self.noLog)
result = {'upFlow': upFlow, 'downFlow': downFlow}
logger.info(f'network: {result}')
return result

def collectFps(self):
_fps = FPS(self.pkgName, self.deviceId, self.platform, self.surfaceview)
fps, jank = _fps.getFPS(useApi=True)
fps, jank = _fps.getFPS(noLog=self.noLog)
result = {'fps': fps, 'jank': jank}
logger.info(f'fps: {result}')
return result
Expand All @@ -388,7 +389,7 @@ def collectGpu(self):
_gpu = GPU(self.pkgName)
if self.platform == Platform.Android:
raise Exception('not support android')
gpu = _gpu.getGPU(useApi=True)
gpu = _gpu.getGPU(noLog=self.noLog)
result = {'gpu': gpu}
logger.info(f'gpu: {result}')
return result
12 changes: 6 additions & 6 deletions solox/view/apis.py
Original file line number Diff line number Diff line change
Expand Up @@ -236,7 +236,7 @@ def getNetWorkData():
case _:
deviceId = d.getIdbyDevice(device, platform)
flow = Flow(pkgName=pkgname, deviceId=deviceId, platform=platform)
data = flow.getNetWorkData(wifi=wifi,useApi=False)
data = flow.getNetWorkData(wifi=wifi,noLog=False)
result = {'status': 1, 'upflow': data[0], 'downflow': data[1]}
except Exception:
logger.error('get network data failed')
Expand Down Expand Up @@ -436,23 +436,23 @@ def apmCollect():
match(target):
case Target.CPU:
cpu = CPU(pkgName=pkgname, deviceId=deviceid, platform=platform)
appCpuRate, systemCpuRate = cpu.getCpuRate(useApi=True)
appCpuRate, systemCpuRate = cpu.getCpuRate(noLog=True)
result = {'status': 1, 'appCpuRate': appCpuRate, 'systemCpuRate': systemCpuRate}
case Target.Memory:
mem = MEM(pkgName=pkgname, deviceId=deviceid, platform=platform)
totalPass, nativePass, dalvikPass = mem.getProcessMem(useApi=True)
totalPass, nativePass, dalvikPass = mem.getProcessMem(noLog=True)
result = {'status': 1, 'totalPass': totalPass, 'nativePass': nativePass, 'dalvikPass': dalvikPass}
case Target.Network:
flow = Flow(pkgName=pkgname, deviceId=deviceid, platform=platform)
data = flow.getNetWorkData(wifi=True, useApi=True)
data = flow.getNetWorkData(wifi=True, noLog=True)
result = {'status': 1, 'upflow': data[0], 'downflow': data[1]}
case Target.FPS:
fps_monitor = FPS(pkgName=pkgname, deviceId=deviceid, platform=platform)
fps, jank = fps_monitor.getFPS(useApi=True)
fps, jank = fps_monitor.getFPS(noLog=True)
result = {'status': 1, 'fps': fps, 'jank': jank}
case Target.Battery:
battery_monitor = Battery(deviceId=deviceid)
final = battery_monitor.getBattery(useApi=True)
final = battery_monitor.getBattery(noLog=True)
if platform == 'Android':
result = {'status': 1, 'level': final[0], 'temperature': final[1]}
else:
Expand Down

0 comments on commit 7e32ba3

Please sign in to comment.