iOS APM性能統計 - 基礎篇


Tips:若是未發布應用,可以利用Xcode自帶的instruments工具,對我們的應用進行cpu占用、內存占用、FPS、循環引用、離屏渲染、卡頓、頁面耗時、網絡、啟動時長等各個維度進行分析。若為線上應用,我們只能通過自行打點采集各個維度的信息,來進行性能分析。

一、性能統計維度

1.設備屬性維度

  • OS類型
  • 廣告標示符idfa (iOS14.5開始強制權限,iOS14.0-iOS14.5可強行讀取idfa,14以下老方法)
  • 廠商標識符idfv (也可認為是應用維度)
  • 設備名稱
  • 系統版本
  • 設備Machine
  • 運營商
  • 硬盤總容量
  • 物理內存總容量
  • 當前硬盤容量
  • 當前內存容量
  • 分辨率
  • 設備Model
  • 時區
  • 國家
  • 設備語言
  • 系統上次啟動時間
  • 系統上次更新時間
  • 當前可用空間
  • 當前網絡類型
  • 當前ip
  • 當前cpu使用率
  • 是否越獄標識
  • 當前電池電量
  • 當前屏幕亮度
  • 當前充電狀態
  • gps開關狀態
  • UserAgent
  • 最近一次定位坐標(需要定位權限)
  • ssid 當前wifi名稱 (iOS13開始需要定位權限)
  • bssid 當前wifi的bssid(iOS13開始需要定位權限)
  • bundleSeedID

2.應用基本屬性維度

  • 應用名稱
  • 應用bundle id
  • 應用版本
    • BundleShortVersion
    • BundleVersion
  • 應用熱更版本(若有)
  • 應用RN包版本(若有)
  • 業務灰度包版本(若有)
  • 小程序版本(若有)
  • 性能統計SDK版本
  • user id
  • session id
  • 自定義uuid(存儲在keychain里)
  • 是否在后台
  • 應用運行時長
  • 當前應用商店地區
  • 當前應用商店商品貨幣類型

3.應用性能維度

  • 持續電量統計
  • 持續cpu使用率統計
  • 持續內存使用率統計
    • 各個模塊、插件、大文件內存使用
    • 循環引用監測
  • 網絡持續監測
    • 網絡類型持續監測
    • 網絡流量持續監測
    • 網絡錯誤類型
  • FPS
  • 主線程卡頓監測
  • 頁面渲染時長
  • 大文件存儲監測
  • 閃退日志記錄
  • 啟動時間監測
    • 冷啟動時間監測
    • 熱啟動時間監測
  • 全打點,每個函數耗時監測(線上不推薦)
  • Flutter、RN、web、小程序等問題日志(若有)

4.應用業務維度

  • 應用生命周期打點
  • 各個業務頁面打點、停留時長打點
  • 用戶行為打點(通過AOP,自動獲取view的鏈路樹打點)
  • 根據實際產品定制維度。。。
注意:由於蘋果對標識設備、用戶的行為監管越來越嚴,采集過多的設備信息會被蘋果認為違規,會收到蘋果的整改郵件通知。另外,中廣協的CAID暫時不要對接,蘋果審核時候會被勸退。

二、數據落地

0.設計理念

  • 性能統計SDK接入足夠輕量、簡單、無侵入
  • 策略配置靈活、易控制
  • 性能損耗低、絕不能影響主業務本身
  • 盡量不使用私有API,避免被蘋果審核誤判
  • 本地數據做好持久化,避免閃退時候寫本地失敗,使用mmap
  • 數據大小盡量小,可使用protobuf;另外部分數據可壓縮上傳
  • 數據需要加密傳輸
  • 上傳數量策略靈活:部分點位實時上傳、部分點位可以合並壓縮后上傳、斷網重試等
  • 針對不同機型,有不同配置
  • 打點點位可以灰度、服務器下發
  • 配套監控、報警體系,實時跟進線上突發以及新功能問題
  • 全球化業務需要做到滿足各國法規,國內三級等保、歐盟GDPR 等 ,隱私策略或是用戶協議里需說明

1.數據采集

采集維度分為六大類:

  • 啟動后打點記錄一次性基本設備信息維度: 機型、系統版本、idfa等
  • 每次打點都需要包含的base維度:uuid、userid、會話id、sdk版本等
  • 持續性的性能監測維度:電量、cpu使用率、內存使用率、卡頓、網絡相關等
  • 偶發性的統計維度:冷啟動耗時、熱啟動耗時、閃退等
  • 業務維度:模塊、頁面打點、停留時間打點等
  • 自定義日志:自定義log等
{
     //base信息
     "timestamp":"事件產生時間(13位 毫秒)",
     "appId":"應用ID",
     "device":"設備型號",
     "sessionId":"會話id",
     "idfv":"應用開發商標識符",
     "advertisingId":"idfa",
     "deviceId":"自定義存keychain uuid",
     "sdkVer":"SDK版本號",
     "appVer":"應用版本號",
     "userID":"用戶ID",
     ...  
     "deviceInfo":{
       ...
     },
     "crashInfo":{
       ...
     },
     "performanceInfo":{
       ...
     },
     "moduleInfo":{
       ...
     },
     "eventInfo":{
       ...
     }
}

采集時機:

  • 實時上傳維度
  • 部分數據合並后擇機上傳
  • 突破某個閥值上傳
  • 斷網重試或是下次啟動上傳

2.數據合成、壓縮、存儲

  • 數據存儲,若為實時上傳類型,則不用存儲端側,若實時上傳失敗且重試機制情況下依然失敗,則需要存儲端側;若為非實時數據,則需要存儲端側;擇機上傳;
  • 考慮到app意外退出,會有日志或是閃退信息無法存儲端側的情況,可以采用mmap方式存儲日志;
  • 考慮到頻繁的IO會造成性能上的消耗,我們需要對數據進行合並,且讀寫時候,需要參照當前機型的虛擬內存頁的大小,老的機型是4KB。即每次讀寫都是按開辟4KB存儲;
  • 考慮到上傳數據的大小問題,可以考慮使用protobuf對數據進行壓縮;另外,protobuf數據本地持久化的過程可以參照微信的MMKV設計;
  • 另外數據是否加密,可以酌情考慮
  • 端側日志數據存儲上限應針對不同硬盤大小設定

3.上傳服務器

  • 上傳失敗重試機制
  • app閑時或是剛進入后台等時機,擇機上傳
  • https

4.數據分析處理

  • 數據上傳到數據服務器,進行解壓、處理、按業務維度進行處理
  • 根據具體業務進行多維度處理
  • 入庫需要的數據,定時清理老日志文件

5.web儀表盤展示

  • 按應用維度、版本維度、系統維度、業務維度、動作維度、機型維度 等等進行展示;
  • 業務點擊率、轉化率等;
  • 按PV、UV、DAU、MAU、PCU、APA、ARPU等維度;
  • 異常、閃退維度;
  • 更多。。。

6.監控、報警體系搭建

  • 根據已有的維度以及數據,對線上業務或是新版本進行監控,比如初始化成功率、登錄成功率、支付成功率、某個業務的點擊或是完成率、在線用戶數,針對不同時段給到一個上、下限,若是觸發了邊界值,則通過郵件、企業微信、短信或是報警電話等方式通知相關干系人;
  • 具體的監控以及報警體系以實際業務為基准定制;
  • 我們部門有買了小米75寸電視作為監控屏幕,掛在部門牆上;
  • 按照經驗,我們部門在凌晨會經常收到誤報,常見的是蘋果支付的問題(一般是蘋果服務器抽風), 另外是業務部門在做停服更新,登錄、支付、用戶等指標驟降,會觸發報警,還是需要跟各個業務部門定好更新機制;

三、復盤、優化、整改

  • 有了以上的日志分析,需要對各個業務線進行復盤、優化、整改,再監測,再優化整改,不斷循環;
  • 監控與報警體系搭建也不是一朝一夕,也需要不斷優化,使其更加精准,尤其是節假日的時候,發揮其作用;
  • 這么多的數據如何有效的利用以及如何用來改善產品,需要運營、產品一起去有效的開發,而不是純粹的只是記錄、監控;
  • 這些數據可以有效的幫助市場同學分析,在各個移動平台廣告投放的效果 以及轉化;
  • 作為技術人員,除了關注技術側的應用本身質量、穩定性、性能等,視野也要拓展,協同運營、產品、市場給應用帶來更多的用戶,更好的體驗;

四、總結

APM開發力度如何,應視業務規模而定,若達到一定的量,必須認真對待。本文更多的提了一些iOS側,對於android也一樣適用,除了部分設備指紋維度有所區別。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM