导航:首页 > 操作系统 > android流量测试

android流量测试

发布时间:2024-10-02 14:52:27

① 软件测试教程之手机软件测试方法

第一:兼容性测试

针对App通常会考虑这些方面:

1)操作系统版本

包括Andoird版本,iOS版本

2)屏幕分辨率

android 800*480, 960*640,1280*720(720p),1920*1080(1080p),2560*1440(2k).

对于iOS,考虑最近几代机型对应的分辨率即可.

3)不同厂家的ROM

不同厂家的ROM,大多厂家都对android 系统进行了定制、实际中会遇到例如调用相机和底层服务出现的不兼容问题以及摇一摇遇到的不同手机对于方向和重力传感器灵敏度设置不同的问题.

4) 网络类型

网络类型通常考虑wifi,2g,3g4g下的功能情况。另外针对m版网站考虑不同浏览器类型和屏幕分辨率.

第二:流量测试

在移动产品的测试中,很有必要对App使用的流量进行度量,大致来说,流量可以从用户使用的的相关性角度分为:一类是用户的操作直接导致的流量消耗;另一类是后台,即在用户没有直接使用情况下的流量消耗。

流量的测试方法:

1. 基于系统自带功能.

eg android proc/uid_stat/{uid} /tcp_send

android proc/uid_stat/{uid} /tcp_rcv

2. 通过API或者系统埋点来获取数据。

3. 通用的流量测试方法:手机抓包,或者wifi代理(Fiddler, Charles)。

常见的流量节省方法:

1. 数据压缩

压缩包含接口文本数据的压缩,js文件的压缩及图片的压缩。

2. 不同数据格式的采用

例如采用JSON格式作为接口数据返回格式通常比XML格式要小。

3. 控制访问的频次

这个主要针对后台数据上报,PUSH消息检查等定时机制的。

4. 只获取必要的数据

有时候APP一页的内容非常多,而用户可能只会看一部分,过多的从后台拉去数据就是浪费,所以可以采用分屏加载或者懒加载的方式来减少流量消耗。

5. 缓存

可将图片,js等数据暂存起来,但由于手机存储空间有限,也需要控制整个缓存大小,并给用户提供清理缓存的选项。

6. 针对不同网络类型设计不同的访问策略

有些APP不同的网络类型返回的内容不一样。

第三:电量测试

在电器电池技术没有取得巨大突破前提下,这方面始终会存在一些瓶颈,如果一些App架构设计的不好,或者代码偶缺陷,就可能导致电量消耗比较高,所以电量测试也是很重要的。

工具 GSam Battery Monitor Pro.

第四:弱网络测试

移动互联网产品相比PC互联网产品,有一个特点是前者使用的网络比较多样,除了Wif之外,很多时候是在移动网络下使用的,移动网络遇到的情况又比较复杂,比如地铁、隧道、 体育 场等。所以网络不稳定的情况是比较容易发生的,很多情况下App的一些问题是在复杂的网络情况下才会暴露,与其让用户发现和投诉这些问题,不如我们在测试阶段尽量模拟这样的网络情况,及早发现和修复这些问题。

工具:

1. Windows下的Network Delay Simulator

2. Mac下的Network Link Conditioner

第五:稳定性测试

在保证基本功能正确基础之上,App的稳定性就显得非常重要,如果一个App经常出现闪退或者卡死,那么用户体验就会受到很大伤害,在有其他竞争产品的情况下很容易造成用户的流失。

第六:安全测试

包括安装包的安全测试(能否反编译代码、安装包是否签名,完整性校验,权限设置检查等)。

敏感信息测试(数据库,日志,配置文件)。

软键盘劫持(金融类APP登录页面的用户名密码输入框)、

账户安全(密码是否明文,密码传输是否加密,账户输入错误次数过多锁定,同时会话提醒, 注销机制)

数据通信安全(关键数据是否散列或加密,关键连接是否使用安全通信,是否对数字证书合法性进行验证,是否校验数据合法性。

组件安全测试。

服务器端接口测试(SQL注入测试、XSS跨站脚本攻击, CSRF跨站请求伪造,越权访问等)。

第七:环境相关的测试

在实际项目中,有一些缺陷我发现是和App所处的运行环境相关的,所以设计测试的时候,要多考虑这些场景,比如:

1)干扰测试

收到电话、收到短信、收到通知栏消息、无电提示框弹出、第三方安全软件告警弹出。

2)权限测试

一些用户在实际使用App的时候回有意识阻止某些功能。例如有的用户感觉让某个App访问电话本或者相册可能泄漏隐私,就在手机中设置了禁止了该App访问相册的权限。

3)边界测试

手机环境本身也有其边界情况需要在测试中覆盖。常见的场景有:

可用存储空间过少、没有SD卡/双SD卡、飞行模式、系统时间有误(晚于和早于标准时间)、第三方依赖(比如我们的App依赖第三方App,但是现在第三方App没有安装或者版本过低的测试情况)。

4)Android定位测试

用白盒方式模拟

② Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇

3)查看进程列表:adb shell "ps",同时也能获取到应用的UID,方式如下(不需root权限):

u0_a开头的都是Android的应用进程,Android的应用的UID是从10000开始,到19999结束,可以在Process.java中查看到(FIRST_APPLICATION_UID和LAST_APPLICATION_UID),u0_a后面的数字就是该应用的UID值减去FIRST_APPLICATION_UID所得的值,所以,对于截图这个应用进程,它是u0_a155,按前面的规制,它的UID就是155 + FIRST_APPLICATION_UID = 10155。

VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

使用 adb shell "mpsys meminfo -s <pakagename | pid>"命令,输出结果分以下4部分:

PS:在apk内调用运行获取其他app的内存数据则需要root权限

adb命令:adb shell mpsys gfxinfo <package | pid>

正常情况下帧率应该在16.67ms左右,1秒60帧,执行结果如下:

详细计算方法如下:

还有一个命令是: adb shell mpsys SurfaceFlinger --latency LayerName

其中LayerName在各个不同系统中获取的命令是不一样的
在Android 6系统直接就是SurfaceView
在Android 7系统中可以通过 mpsys window windows | grep mSurface | grep SurfaceView 然后通过数据截取到
在Android 8系统中可以通过 mpsys SurfaceFlinger | grep android包名获取到

执行命令结果如下:

计算方法比较简单,一般打印出来的数据是129行(部分机型打印两次257行,但是第一部分是无效数据,取后半部分),取len-2的第一列数据为end_time,取len-128的第一列数据为start_time
fps = 127/((end_time - start_time) / 1000000.0)
至于为啥要取第一列数据,这里不做过多介绍,欢迎参看这两篇文章
老罗的文章SurfaceView原理
Android性能测试之fps获取
至于为啥要处于1000000,因为命令打印出来的是纳秒单位,要转为毫秒进行计算,127就是因为命令一次打印出来127帧的数据而已

有两种方法可以获取
1) adb shell "top -n 5 | grep <package | pid>" ,第三列就是实时监控的CPU占用率(-n 指定执行次数,不需root权限),这边top命令执行需要2到3s左右,一般可以采用busybox 的top命令执行,效率会快很多

2) adb shell "mpsys cpuinfo | grep <package | pid>"
两种方法直接区别在于,top是持续监控状态,而mpsys cpuinfo获取的实时CPU占用率数据

adb命令:adb shell "mpsys batterystats < package | pid>" (Android 5.0后引入)
获取单个应用的耗电量信息,具体返回结果待研究

adb命令:adb shell "mpsys battery"
出现信息解读:
AC powered:false 是否连接AC(电源)充电线
USB powered:true 是否连接USB(PC或笔记本USB插口)充电
Wireless powered:false 是否使用了无线电源
status: 1 电池状态,2为充电状态,其他为非充电状态
level:58 电量(%)
scale: 100. 电量最大数值
voltage: 3977 当前电压(mV)
current now: -335232. 当前电流(mA)
temperature:355 电池温度,单位为0.1摄氏度

adb 命令:adb shell "mpsys< package | pid> | grep UID" [通过ps命令,获取app的UID(安装后唯一且固定)]
adb shell cat /proc/uid_stat/UID/tcp_rcv [cat为查看命令,读取tcp_rcv获取应用接收流量信息(设备重启后清零)]
adb shell cat /proc/uid_stat/UID/tcp_snd [cat为查看命令,读取tcp_snd获取应用发送流量信息(设备重启后清零)]
计算流量消耗步骤:

或者还有一种方式获取应用流量消耗:

首先判断类型:
cat /sys/class/thermal/thermal_zone*/type

只有红框框出来的是有效的
cat /sys/class/thermal/thermal_zone*/temp
获取CPU温度

mpsys battery | grep temperature 单位0.1摄氏度

获取/proc/stat文件内容(无权限限制)

总的cpu时间片是 total = user+nice+system+idle+iowait+irq+softirq
忙碌时间为 notidle = user+nice+system +iowait+irq+softirq
cpu使用率计算方法为,先取开始的total值和忙碌时间notidle,隔一段时间片,再取一次计算total2,notidle2, cpuuse = (notidle2 – notidle) * 100 / (total2 - total)%

PS:由于Android 8权限收紧,在Android 8系统手机内apk内读取文件内容为空,需要shell权限才可获取文件内容,下同

读/sys/devices/system/cpu/cpuX/cpufreq/scaling_cur_freq文件的值,X不定,看是几核手机,scaling_cur_freq是否存在也不一定,需要判断

至于为啥不取cpuinfo_cur_freq文件的值,原因是android 6,7系统获取的时候,这个文件shell没有读取权限,需要root权限

参考文章: https://blog.csdn.net/long_meng/article/details/45934899

Android 6,7系统可执行
mpsys window windows | grep "mCurrentFocus"

执行结果一般为类似:
mCurrentFocus=Window{81caaa5 u0 com.tencent.mobileqq/com.tencent.mobileqq.activity.SplashActivity}
按照一定规则把com.tencent.mobileqq提取出来即可

直接apk内读取文件即可,不需要shell权限(支持到Android8)
Gpu使用率获取:会得到两个值,(前一个/后一个)*100%=使用率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpubusy

Gpu工作频率:
adb shell cat /sys/class/kgsl/kgsl-3d0/gpuclk
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq

Gpu最大、最小工作频率:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq

Gpu可用频率
adb shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies

Gpu可用工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors

Gpu当前工作模式:
adb shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor

③ android中这两个权限起什么作用

描述不清楚啊,这是所有的权限
---------------------
访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据库属性表的权限
获取错略位置 android.permission.ACCESS_COARSE_LOCATION,通过WiFi或移动基站的方式获取用户错略的经纬度信息,定位精度大概误差在30~1500米
获取精确位置 android.permission.ACCESS_FINE_LOCATION,通过GPS芯片接收卫星的定位信息,定位精度达10米以内
访问定位额外命令 android.permission.ACCESS_LOCATION_EXTRA_COMMANDS,允许程序访问额外的定位提供者指令
获取模拟定位信息 android.permission.ACCESS_MOCK_LOCATION,获取模拟定位信息,一般用于帮助开发者调试应用
获取网络状态 android.permission.ACCESS_NETWORK_STATE,获取网络信息状态,如当前的网络连接是否有效
访问Surface Flinger android.permission.ACCESS_SURFACE_FLINGER,Android平台上底层的图形显示支持,一般用于游戏或照相机预览界面和底层模式的屏幕截图
获取WiFi状态 android.permission.ACCESS_WIFI_STATE,获取当前WiFi接入的状态以及WLAN热点的信息
账户管理 android.permission.ACCOUNT_MANAGER,获取账户验证信息,主要为GMail账户信息,只有系统级进程才能访问的权限
验证账户 android.permission.AUTHENTICATE_ACCOUNTS,允许一个程序通过账户验证方式访问账户管理ACCOUNT_MANAGER相关信息
电量统计 android.permission.BATTERY_STATS,获取电池电量统计信息
绑定小插件 android.permission.BIND_APPWIDGET,允许一个程序告诉appWidget服务需要访问小插件的数据库,只有非常少的应用才用到此权限
绑定设备管理 android.permission.BIND_DEVICE_ADMIN,请求系统管理员接收者receiver,只有系统才能使用
绑定输入法 android.permission.BIND_INPUT_METHOD ,请求InputMethodService服务,只有系统才能使用
绑定RemoteView android.permission.BIND_REMOTEVIEWS,必须通过RemoteViewsService服务来请求,只有系统才能用
绑定壁纸 android.permission.BIND_WALLPAPER,必须通过WallpaperService服务来请求,只有系统才能用
使用蓝牙 android.permission.BLUETOOTH,允许程序连接配对过的蓝牙设备
蓝牙管理 android.permission.BLUETOOTH_ADMIN,允许程序进行发现和配对新的蓝牙设备
变成砖头 android.permission.BRICK,能够禁用手机,非常危险,顾名思义就是让手机变成砖头
应用删除时广播 android.permission.BROADCAST_PACKAGE_REMOVED,当一个应用在删除时触发一个广播
收到短信时广播 android.permission.BROADCAST_SMS,当收到短信时触发一个广播
连续广播 android.permission.BROADCAST_STICKY,允许一个程序收到广播后快速收到下一个广播
WAP PUSH广播 android.permission.BROADCAST_WAP_PUSH,WAP PUSH服务收到后触发一个广播
拨打电话 android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码
通话权限 android.permission.CALL_PRIVILEGED,允许程序拨打电话,替换系统的拨号器界面
拍照权限 android.permission.CAMERA,允许访问摄像头进行拍照
改变组件状态 android.permission.CHANGE_COMPONENT_ENABLED_STATE,改变组件是否启用状态
改变配置 android.permission.CHANGE_CONFIGURATION,允许当前应用改变配置,如定位
改变网络状态 android.permission.CHANGE_NETWORK_STATE,改变网络状态如是否能联网
改变WiFi多播状态 android.permission.CHANGE_WIFI_MULTICAST_STATE,改变WiFi多播状态
改变WiFi状态 android.permission.CHANGE_WIFI_STATE,改变WiFi状态
清除应用缓存 android.permission.CLEAR_APP_CACHE,清除应用缓存
清除用户数据 android.permission.CLEAR_APP_USER_DATA,清除应用的用户数据
底层访问权限 android.permission.CWJ_GROUP,允许CWJ账户组访问底层信息
手机优化大师扩展权限 android.permission.CELL_PHONE_MASTER_EX,手机优化大师扩展权限
控制定位更新 android.permission.CONTROL_LOCATION_UPDATES,允许获得移动网络定位信息改变
删除缓存文件 android.permission.DELETE_CACHE_FILES,允许应用删除缓存文件
删除应用 android.permission.DELETE_PACKAGES,允许程序删除应用
电源管理 android.permission.DEVICE_POWER,允许访问底层电源管理
应用诊断 android.permission.DIAGNOSTIC,允许程序到RW到诊断资源
禁用键盘锁 android.permission.DISABLE_KEYGUARD,允许程序禁用键盘锁
转存系统信息 android.permission.DUMP,允许程序获取系统mp信息从系统服务
状态栏控制 android.permission.EXPAND_STATUS_BAR,允许程序扩展或收缩状态栏
工厂测试模式 android.permission.FACTORY_TEST,允许程序运行工厂测试模式
使用闪光灯 android.permission.FLASHLIGHT,允许访问闪光灯
强制后退 android.permission.FORCE_BACK,允许程序强制使用back后退按键,无论Activity是否在顶层
访问账户Gmail列表 android.permission.GET_ACCOUNTS,访问GMail账户列表
获取应用大小 android.permission.GET_PACKAGE_SIZE,获取应用的文件大小
获取任务信息 android.permission.GET_TASKS,允许程序获取当前或最近运行的应用
允许全局搜索 android.permission.GLOBAL_SEARCH,允许程序使用全局搜索功能
硬件测试 android.permission.HARDWARE_TEST,访问硬件辅助设备,用于硬件测试
注射事件 android.permission.INJECT_EVENTS,允许访问本程序的底层事件,获取按键、轨迹球的事件流
安装定位提供 android.permission.INSTALL_LOCATION_PROVIDER,安装定位提供
安装应用程序 android.permission.INSTALL_PACKAGES,允许程序安装应用
内部系统窗口 android.permission.INTERNAL_SYSTEM_WINDOW,允许程序打开内部窗口,不对第三方应用程序开放此权限
访问网络 android.permission.INTERNET,访问网络连接,可能产生GPRS流量
结束后台进程 android.permission.KILL_BACKGROUND_PROCESSES,允许程序调用killBackgroundProcesses(String).方法结束后台进程
管理账户 android.permission.MANAGE_ACCOUNTS,允许程序管理AccountManager中的账户列表
管理程序引用 android.permission.MANAGE_APP_TOKENS,管理创建、摧毁、Z轴顺序,仅用于系统
高级权限 android.permission.MTWEAK_USER,允许mTweak用户访问高级系统权限
社区权限 android.permission.MTWEAK_FORUM,允许使用mTweak社区权限
软格式化 android.permission.MASTER_CLEAR,允许程序执行软格式化,删除系统配置信息
修改声音设置 android.permission.MODIFY_AUDIO_SETTINGS,修改声音设置信息
修改电话状态 android.permission.MODIFY_PHONE_STATE,修改电话状态,如飞行模式,但不包含替换系统拨号器界面
格式化文件系统 android.permission.MOUNT_FORMAT_FILESYSTEMS,格式化可移动文件系统,比如格式化清空SD卡
挂载文件系统 android.permission.MOUNT_UNMOUNT_FILESYSTEMS,挂载、反挂载外部文件系统
允许NFC通讯 android.permission.NFC,允许程序执行NFC近距离通讯操作,用于移动支持
永久Activity android.permission.PERSISTENT_ACTIVITY,创建一个永久的Activity,该功能标记为将来将被移除
处理拨出电话 android.permission.PROCESS_OUTGOING_CALLS,允许程序监视,修改或放弃播出电话
读取日程提醒 android.permission.READ_CALENDAR,允许程序读取用户的日程信息
读取联系人 android.permission.READ_CONTACTS,允许应用访问联系人通讯录信息
屏幕截图 android.permission.READ_FRAME_BUFFER,读取帧缓存用于屏幕截图
读取收藏夹和历史记录 com.android.browser.permission.READ_HISTORY_BOOKMARKS,读取浏览器收藏夹和历史记录
读取输入状态 android.permission.READ_INPUT_STATE,读取当前键的输入状态,仅用于系统
读取系统日志 android.permission.READ_LOGS,读取系统底层日志
读取电话状态 android.permission.READ_PHONE_STATE,访问电话状态
读取短信内容 android.permission.READ_SMS,读取短信内容
读取同步设置 android.permission.READ_SYNC_SETTINGS,读取同步设置,读取Google在线同步设置
读取同步状态 android.permission.READ_SYNC_STATS,读取同步状态,获得Google在线同步状态
重启设备 android.permission.REBOOT,允许程序重新启动设备
开机自动允许 android.permission.RECEIVE_BOOT_COMPLETED,允许程序开机自动运行
接收彩信 android.permission.RECEIVE_MMS,接收彩信
接收短信 android.permission.RECEIVE_SMS,接收短信
接收Wap Push android.permission.RECEIVE_WAP_PUSH,接收WAP PUSH信息
录音 android.permission.RECORD_AUDIO,录制声音通过手机或耳机的麦克
排序系统任务 android.permission.REORDER_TASKS,重新排序系统Z轴运行中的任务
结束系统任务 android.permission.RESTART_PACKAGES,结束任务通过restartPackage(String)方法,该方式将在外来放弃
发送短信 android.permission.SEND_SMS,发送短信
设置Activity观察其 android.permission.SET_ACTIVITY_WATCHER,设置Activity观察器一般用于monkey测试
设置闹铃提醒 com.android.alarm.permission.SET_ALARM,设置闹铃提醒
设置总是退出 android.permission.SET_ALWAYS_FINISH,设置程序在后台是否总是退出
设置动画缩放 android.permission.SET_ANIMATION_SCALE,设置全局动画缩放
设置调试程序 android.permission.SET_DEBUG_APP,设置调试程序,一般用于开发
设置屏幕方向 android.permission.SET_ORIENTATION,设置屏幕方向为横屏或标准方式显示,不用于普通应用
设置应用参数 android.permission.SET_PREFERRED_APPLICATIONS,设置应用的参数,已不再工作具体查看addPackageToPreferred(String) 介绍
设置进程限制 android.permission.SET_PROCESS_LIMIT,允许程序设置最大的进程数量的限制
设置系统时间 android.permission.SET_TIME,设置系统时间
设置系统时区 android.permission.SET_TIME_ZONE,设置系统时区
设置桌面壁纸 android.permission.SET_WALLPAPER,设置桌面壁纸
设置壁纸建议 android.permission.SET_WALLPAPER_HINTS,设置壁纸建议
发送永久进程信号 android.permission.SIGNAL_PERSISTENT_PROCESSES,发送一个永久的进程信号
状态栏控制 android.permission.STATUS_BAR,允许程序打开、关闭、禁用状态栏
访问订阅内容 android.permission.SUBSCRIBED_FEEDS_READ,访问订阅信息的数据库
写入订阅内容 android.permission.SUBSCRIBED_FEEDS_WRITE,写入或修改订阅内容的数据库
显示系统窗口 android.permission.SYSTEM_ALERT_WINDOW,显示系统窗口
更新设备状态 android.permission.UPDATE_DEVICE_STATS,更新设备状态
使用证书 android.permission.USE_CREDENTIALS,允许程序请求验证从AccountManager
使用SIP视频 android.permission.USE_SIP,允许程序使用SIP视频服务
使用振动 android.permission.VIBRATE,允许振动
唤醒锁定 android.permission.WAKE_LOCK,允许程序在手机屏幕关闭后后台进程仍然运行
写入GPRS接入点设置 android.permission.WRITE_APN_SETTINGS,写入网络GPRS接入点设置
写入日程提醒 android.permission.WRITE_CALENDAR,写入日程,但不可读取
写入联系人 android.permission.WRITE_CONTACTS,写入联系人,但不可读取
写入外部存储 android.permission.WRITE_EXTERNAL_STORAGE,允许程序写入外部存储,如SD卡上写文件
写入Google地图数据 android.permission.WRITE_GSERVICES,允许程序写入Google Map服务数据
写入收藏夹和历史记录 com.android.browser.permission.WRITE_HISTORY_BOOKMARKS,写入浏览器历史记录或收藏夹,但不可读取
读写系统敏感设置 android.permission.WRITE_SECURE_SETTINGS,允许程序读写系统安全敏感的设置项
读写系统设置 android.permission.WRITE_SETTINGS,允许读写系统设置项
编写短信 android.permission.WRITE_SMS,允许编写短信
写入在线同步设置 android.permission.WRITE_SYNC_SETTINGS,写入Google在线同步设置

④ 如何绕过Android网络安全配置

Android Nougat(Android 7)引入了一种名叫网络安全配置(Network Security Configuration)的新型安全功能,这种新功能可以允许Android开发者们在无需修改App代码的情况下自定义他们的网络安全设置。

但是这种功能将有可能影响Android移动端应用的安全测评。如果需要拦截HTTPS流量,那么就必须安装代理证书,而且还必须安装在“用户证书”之中,而默认情况下这类证书是不被信任的。

接下来,我们将给大家介绍这种新机制的运行模式,以及如何通过重新编译或运行时钩子机制来修改这种新型安全机制的默认行为。

开发者如何使用该功能

为了修改默认配置,我们需要在resources目录中创建一个XML文件来指定自定义配置信息。下面给出的是一份配置文件样本,代码给应用程序的所有HTTPS链接配置了用户证书:

<?xml version="1.0"encoding="utf-8"?>
<network-security-config>
<base-config>
<trust-anchors>
<certificates src="system"/>
<certificates src="user"/>
</trust-anchors>
</base-config>
</network-security-config>

除此之外,该文件还需要在AndroidManifest文件中进行引用,即在application标签中的android:networkSecurityConfig参数中指定:

<?xml version="1.0"encoding="utf-8"?>
<manifest ... >
<applicationandroid:networkSecurityConfig="@xml/network_security_config"
... >
...
</application>
</manifest>

渗透测试人员如何绕过该功能

重新编译

如果待测试的应用程序运行在Android 7以及更高版本的Android平台中(或者targetSdkVersion键配置为版本24或更高),应用程序很可能使用的是默认配置。因此,用户证书(例如代理CA证书)将不会被应用程序所信任。

一般来说,修改默认配置的方法是在插入了XML内容(激活证书容器)之后再对应用程序进行重新编译。那么接下来,我们就要使用apktool来对应用程序进行修改了。

首先,我们要做的就是使用apktool来对应用程序进行反编译。完成之后,我们还需要在resources目录中创建一个XML文件并修改AndroidManifest.xml文件中的相关参数(指向网络安全配置文件)。此时,我们就可以再次使用apktool来对应用程序进行重新编译,然后使用jarsigner工具来对生成的APK文件签名。

当我们使用任意证书完成对APK文件的重新签名后,我们就可以使用adb来将其安装到手机之中了。如果手机经过配置后可以通过中间代理(例如Burp Suite)来发送流量,那么只要手机系统中安装了CA证书,我们就可以拦截HTTPS流量了。

运行时钩子

但是在某些情况下,刚才所介绍的方法也许是不可行的。比如说,如果应用程序使用了shareId来跟其他应用程序共享同一ID,而我们又需要直接访问其数据的话,那么这两个应用程序必须使用同一份证书来进行签名。如果应用程序经过了重新编译和重新签名之后,那这个保护功能也就多余了,而且我们也不可能再使用开发者之前的初始证书来对修改后的APK进行签名。

对于这种场景,我们就可以使用动态构造技术了,因为这种方法可以允许我们在运行时对程序的行为进行修改而无须修改应用程序的代码。为了实现这种操作,我们需要创建一个Frida脚本来调整应用程序(目标SDK版本>=24)网络安全配置的默认行为。

android.security.net.config包实现了网络安全配置模块,其主类ManifestConfigSource可以加载XML文件中自定义的配置信息,如果resources文件不存在的话,它将会加载默认配置。相关代码如下所示:

package android.security.net.config;
public class ConfigSource {

. . .
private ConfigSource getConfigSource() { synchronized (mLock) {

. . .
if (mConfigResourceId != 0) {

. . .

source = newXmlConfigSource(mContext, mConfigResourceId, debugBuild, mTargetSdkVersion,mTargetSandboxVesrsion);
} else {
. . .
source = new DefaultConfigSource(usesCleartextTraffic,mTargetSdkVersion, mTargetSandboxVesrsion);
}
mConfigSource = source; return mConfigSource;
}
}
. . .
}

DefaultConfigSource类是ManifestConfigSource类中定义的一个私类,如果没有使用XML文件来修改配置信息的话,系统将会默认使用这个类:

package android.security.net.config;
public class ConfigSource {
...
private static final class DefaultConfigSource implements ConfigSource { private final NetworkSecurityConfig mDefaultConfig; public DefaultConfigSource(boolean usesCleartextTraffic, inttargetSdkVersion, int targetSandboxVesrsion) {
mDefaultConfig =NetworkSecurityConfig.getDefaultBuilder(targetSdkVersion,
targetSandboxVesrsion)
.setCleartextTrafficPermitted(usesCleartextTraffic)
.build();
} @Override
public NetworkSecurityConfig getDefaultConfig() { return mDefaultConfig;
} @Override
public Set<Pair<Domain, NetworkSecurityConfig>>getPerDomainConfigs() { return null;
}
}
}

请大家看看这个类的构造器,它可以接收三个参数,其中一个就是应用程序的目标SDK版本。这个值可以使用getDefaultBuilder()方法来构造NetworkSecurityConfig类。在最后一段代码中,如果targetSdkVersion的值小于或等于23(Android Marshmallow,即Android 6.0),代码将会加载用户证书。

package android.security.net.config;
public final class NetworkSecurityConfig {
...
public static final Builder getDefaultBuilder(int targetSdkVersion, inttargetSandboxVesrsion) {
Builder builder = new Builder()
.setHstsEnforced(DEFAULT_HSTS_ENFORCED) // System certificatestore, does not bypass static pins.
.addCertificatesEntryRef(
newCertificatesEntryRef(SystemCertificateSource.getInstance(), false)); final = targetSandboxVesrsion < 2;
builder.setCleartextTrafficPermitted(cleartextTrafficPermitted); // Applications targeting N andabove must opt in into trusting the user added certificate
// store.
if (targetSdkVersion <=Build.VERSION_CODES.M) { // User certificate store,does not bypass static pins.
builder.addCertificatesEntryRef(
newCertificatesEntryRef(UserCertificateSource.getInstance(), false));
} return builder;
}

...

接下来,我们需要使用一个Frida脚本来挂钩DefaultConfigSource类的构造器,并修改其中的targetSdkVersion值。除此之外,这个脚本还需要挂钩getDefaultBuilder()方法来确保这个值已经被成功修改了。

Java.perform(function(){
var ANDROID_VERSION_M = 23;

var DefaultConfigSource =Java.use("android.security.net.config.ManifestConfigSource$DefaultConfigSource");
var NetworkSecurityConfig = Java.use("android.security.net.config.NetworkSecurityConfig");

DefaultConfigSource.$init.overload("boolean","int").implementation = function(usesCleartextTraffic,targetSdkVersion){
console.log("[+] Modifying DefaultConfigSource constructor"); return this.$init.overload("boolean","int").call(this, usesCleartextTraffic, ANDROID_VERSION_M);
};

DefaultConfigSource.$init.overload("boolean", "int","int").implementation = function(usesCleartextTraffic,targetSdkVersion, targetSandboxVersion){
console.log("[+]Modifying DefaultConfigSource constructor"); return this.$init.overload("boolean", "int","int").call(this, usesCleartextTraffic, ANDROID_VERSION_M,targetSandboxVersion);
};

NetworkSecurityConfig.getDefaultBuilder.overload("int").implementation= function(targetSdkVersion){
console.log("[+] getDefaultBuilder original targetSdkVersion =>" + targetSdkVersion.toString()); return this.getDefaultBuilder.overload("int").call(this, ANDROID_VERSION_M);
};

NetworkSecurityConfig.getDefaultBuilder.overload("int","int").implementation = function(targetSdkVersion,targetSandboxVersion){
console.log("[+] getDefaultBuilder original targetSdkVersion =>" + targetSdkVersion.toString()); return this.getDefaultBuilder.overload("int","int").call(this, ANDROID_VERSION_M, targetSandboxVersion);
};
});

现在,在上面给出的Frida脚本的帮助下,我们可以使用类似Burp Suite之类的HTTP代理来拦截应用程序(所有目标SDK版本>=24的应用程序)的网络流量。

$ frida -U -l ntc.js -f<package_name> --no-pause

⑤ 手机APP评测:神速!这20家农商行全面适配鸿蒙2.0系统

零售手机银行APP行业竞争愈发激烈,但最终落脚点都是在“用户体验”上。据数据统计,页面响应时间超过5秒,用户将明显反馈不满,如果移动端页面响应时间增加1秒,将会降低7%的访问量,可能会导致近三成的用户选择竞争对手的产品,只有把用户体验做到极致,才可能从移动应用这片“红海”中脱颖而出,成为最后的赢家。

为持续跟踪和检测手机银行APP的兼容性和易用性等方面的表现,为行业发展提供有益参考,CFCA兼容和性能测试平台对20家农村商业银行客户端进行测试。经测试发现,20家农村商业银行APP安卓和IOS客户端整体兼容性表现良好,多数银行在当前市面流行的主流手机适配测试均测试通过。在IOS客户端,20家农村商业银行手机银行性能数据优化明显,这将对提升手机银行用户体验有着较为积极的意义。

对比近两年安卓系统性能数据,不难看出20家农村商业银行手机银行APP经过一年的努力,部分性能指标有一定改善,其中兼容性和总流量消耗改善最为明显。另一方面,随着农村商业银行功能的不断丰富、视频图片等功能增强,在用户体验用时、内存占用及耗电量方面性能消耗呈现增强趋势。 对比近两年IOS系统版本性能数据,除兼容性和内存占用外,其他性能指标均有所优化改善。

安卓系统:

(由于测试机型和APP版本不同,因此以上数据仅作为参考)

IOS系统:

(由于测试机型和APP版本不同,因此以上数据仅作为参考)

兼容性测试

80%手机银行APP均未提前适配Android 12 BETA版

在测试的100台安卓端设备里,整体兼容性表现良好,可以正常安装、运行、卸载,且没有明显UI问题,15%的手机银行在个别机型中出现页面显示不全等兼容性问题;在Harmony OS 2.0.0系统中20家手机银行APP全部运行顺畅。此外,在测试安卓12 BETA版的适配性时,有80%的农村商业银行手机银行安卓客户端未提前进行适配,在该系统设备中出现启动闪退、启动失败的情况,仅有4家银行未发现任何兼容性问题,正式版本已于今年5月19号发布,手机银行还需尽快适配。

在IOS客户端中,20家农村商业银行APP在20台IPHONE设备中,15家银行未出现兼容性问题,整体兼容性表现良好,可以正常安装、运行、卸载,且没有明显UI问题。

性能测试

应用启动用户体验用时最大差距可超5倍

根据用户最佳体验原则,在今年测试的20家农村商业银行中,有85%的手机银行APP启动后5秒内完成所有加载达到用户可操作首页面体验最佳标准,有3家银行未满足该原则。其中,Android端有3家银行APP启动时间大于5秒,IOS端仅有1家银行APP启动时间大于5秒。总体而言,在APP启动用户体验用时方面,今年的评测结果基本与去年结果持平(去年有85%的手机银行APP完全加载完成用时在最佳体验用时以内),用户体验用时还需加强改善。

在安卓客户端,20家农村商业银行启动用户体验时间分布在1.76秒到9.85秒之间,差别较大,平均为3.67秒,平均用时明显高于去年的2.56秒,中位数为3.40秒,最大为9.85秒。其中,深圳农商银行手机银行APP启动用户体验时间最短,从用户点击APP图标到可操作的首页面完全加载完成仅用时1.76秒。

在IOS客户端,20家农村商业银行启动用户体验时间分布在0.82秒到11.3秒之间,平均为2.39秒,较去年2.77秒有较大提升,中位数为1.82秒,最大为11.3秒。其中,成都农商手机银行APP启动用户体验耗时最短,从用户点击APP图标到可操作的首页面完全加载完成用时为0.82秒。

CPU占用率均在7%以内

20家农村商业银行安卓和IOS客户端APP CPU占用率均在7%以内。在安卓客户端,APP 运行时的CPU占用率在0.106%到6.234%不等,平均占用为2.71%,较去年同比降低7.19%,中位数为2.497%,最高占用为6.234%。其中,四川农信手机银行APP CPU占用率最低,运行时平均占用仅为0.106%。

在IOS客户端,手机银行APP运行时的CPU占用率在0.5%到1.37%不等,平均占用为0.91%,中位数为0.87%,最高占用为1.37%。其中,CPU占用率最低为山东农信手机银行APP,运行时平均占用达0.5%。

内存占用各行差距逐渐缩小

20家农村商业银行APP在安卓客户端内存占用存在一定差距,差距最大约为2.5倍,但各行差距呈现逐年缩小的态势,内存占用差距也可体现出不同银行APP对于内存优化的优劣。而在IOS客户端的内存占用,各家银行APP基本处于统一水平,平均在28MB左右,所有银行APP运行均可顺畅运行且不会对设备造成较大资源占用。

在安卓客户端,20家农村商业银行APP 运行时内存占用是163.07MB到430.32MB不等,平均占用为268.07MB,中位数为263.79MB,最高占用为430.32MB。其中,最低内存占用为成都农商手机银行,运行时平均占用163.07MB。

在IOS客户端,20家农村商业银行APP 运行时的内存占用是28.06MB到30.64MB不等,差距较小,平均占用为28.55MB,中位数为28.42MB,最高占用为30.64MB。其中,最低内存占用为昆山农商手机银行APP,运行时平均占用28.06MB。

流量消耗改善明显 安卓端平均消耗不到10KB

20家农村商业银行安卓和IOS客户端APP网络流量普遍在可接受范围内,与去年同期数据对比流量消耗明显下降。在安卓客户端,手机银行APP运行时2分钟随机点击消耗总流量是0.391KB到33.309KB不等,平均消耗9.295KB,较去年平均消耗67.57KB,性能同比提升7倍有余,中位数为3.818KB,最高为33.309KB。其中,山东农信手机银行APP流量消耗最低,运行时流量消耗仅为0.391KB。

在IOS客户端,20家农村商业银行APP 运行时2分钟随机点击消耗总流量128KB到1991KB不等,平均消耗968.4KB,较去年同业流量消耗2376KB有较大优化,中位数为1039.5KB,最高为1991KB。其中,最低流量消耗为江西·农商银行手机银行APP,运行消耗流量仅为128KB。

安卓端平均耗电量较去年增加一倍

20家农村商业银行安卓和IOS客户端APP电量消耗均在可接受范围内,安卓端平均耗电量较去年增加近一倍。其中,安卓客户端APP 运行时2分钟随机点击消耗总电量2.29毫安到28毫安不等,平均消耗6.091毫安,较去年增加近一倍,中位数为4.525毫安,最高消耗为28毫安。最低电量消耗为江阴农商手机银行APP,运行消耗仅为2.29毫安。

IOS客户端APP 运行时2分钟随机点击消耗总电量36.1毫安到41.25毫安不等,平均消耗38.53毫安,中位数为38.22毫安,最高消耗为41.25毫安。最低电量消耗是江西·农商银行手机银行APP,运行消耗36.1毫安。

其他测试

各行APP平均页面响应时间提速 均在1.5秒以内

20家农村商业银行在安卓和IOS客户端APP页面的平均响应时间较快。安卓客户端,手机银行APP“账户”、“理财产品”、“缴费”、“转账”和“我的页面”平均响应时间从0.21秒到1.1秒不等,平均为0.45秒,中位数为0.39秒,最慢为1.1秒。其中,响应时间最短的是云南农信手机银行APP,仅为0.21秒。

在IOS客户端,手机银行APP在“我的账户”、“转账”、“理财”、“信用卡”和“生活页面”的平均响应时间从0.568秒到1.206秒不等,平均为0.85秒,中位数为0.84秒。其中,平均响应时间最短的是成都农商手机银行APP,为0.568秒。

测试说明

本次测试包含20家农村商业银行的个人手机银行安卓和IOS手机客户端,包括了北京农商银行、上海农商银行、张家港农商银行、常熟农商银行、成都农商银行、深圳农村商业银行、江阴农商银行、无锡农村商业银行、江西·农商银行、广州农商银行、苏州农商银行、重庆农村商业银行、昆山农村商业银行、宁波鄞州农村商业银行、浙江省农村信用社联合社、安徽省农村信用社联合社、山东省农村信用社联合社、四川省农村信用社联合社、云南省农村信用社联合社、广东省农村信用社联合社。(银行顺序随机排布)

测试APP的版本截止于2021年5月31日,各个银行官网的下载版本。详细如下:

安卓客户端(版本列表随机排布):

IOS客户端(版本列表随机排布):

本次测试共分为APP兼容性测试、性能测试、其他测试三大方面,共7个指标。包括主流手机设备兼容情况、APP用户体验启动时间、CPU占用率、网络流量、内存占用、电量消耗、5个典型页面的响应时间。

具体指标解释如下:

兼容性测试情况覆盖了100款主流安卓手机、20款IPHONE手机进行。本次测试使用性能测试环境安卓端为华为P40 PRO,安卓系统版本10,IOS端为iPhone 11 Pro Max IOS系统版本为13.3.1。网络环境为CFCA测试WIFI(中国电信网络)连接。测试过程中系统无其他APP后台运行,被测试银行手机银行APP在无其他APP干扰情况下冷启动开始测试,测试过程采取随机测试,测试时长大约2到3分钟。

本次测试兼容性情况使用设备分布情况如下:

安卓客户端:

IOS客户端:

阅读全文

与android流量测试相关的资料

热点内容
什么叫e筋加密锁 浏览:712
世界无敌简单的折纸解压球 浏览:943
安卓开服光遇什么季节 浏览:565
破解的系统怎么用银行app 浏览:265
java三层架构mvc 浏览:880
徐州编程教育加盟 浏览:899
苹果手机脸书app如何设置中文 浏览:538
pdf文件在线修改 浏览:399
服务器上如何搭建自己的网站 浏览:467
云南省青少年学习编程 浏览:480
c工程的编译时间 浏览:587
java判断字符串包含某个字符串中 浏览:977
3匹单相谷轮压缩机用多大的电容 浏览:784
比心app怎么样用 浏览:741
和平精英怎么改国际服的服务器 浏览:946
手机存储卡128是哪个文件夹 浏览:180
安北解压包密码 浏览:651
阿里巴巴app静态编译 浏览:725
命令世界怎么获得迷你币 浏览:651
应用加密重新安装 浏览:83