導航:首頁 > 操作系統 > 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流量測試相關的資料

熱點內容
安卓底部三鍵怎麼關閉 瀏覽:649
php高效分頁 瀏覽:15
輕閱讀的伺服器的地址是什麼 瀏覽:957
得力app如何刪除設備 瀏覽:603
怎麼把伺服器卡死 瀏覽:479
ug加密的key文件 瀏覽:165
編程理論基礎 瀏覽:311
安卓boot配置文件都有什麼 瀏覽:534
數量關系排序演算法 瀏覽:184
serv文件怎麼傳到伺服器上 瀏覽:274
開發者聯名貢獻源碼 瀏覽:338
sae部署java 瀏覽:18
校園330app怎麼下載 瀏覽:23
javahashcode演算法 瀏覽:714
pdf轉doc手機軟體 瀏覽:531
方舟手游開伺服器機床怎麼選 瀏覽:255
qt編程入門pdf下載 瀏覽:784
java編程的三個步驟 瀏覽:776
s點b點主圖源碼 瀏覽:436
電腦可以刪除的臨時文件夾 瀏覽:9