本文中含有需要您注意的重要提示信息,忽略該信息可能對您的業務造成影響,請務必仔細閱讀。
歡迎使用性能體驗SDK集成指南。本文檔將指導您如何在我們的移動應用中正確使用性能體驗SDK,實現全域數據采集與性能監控。
準備階段
1. 基礎使用
1.1 崩潰異常采集
如您完成統計SDK和性能體驗SDK的接入,即可使用Java異常、Native崩潰異常、ANR異常自動采集功能
如果您使用我們的SDK捕獲native崩潰后,其他捕獲工具將無法捕獲到native 崩潰,可以使用如下方法在初始化SDK后進行設置,使其他SDK可以捕獲到native 崩潰。
import com.uc.crashsdk.export.CrashApi
...
final Bundle customInfo = new Bundle();
customInfo.putBoolean("mCallNativeDefaultHandler",true);
CrashApi.getInstance().updateCustomInfo(customInfo);
1.2 崩潰回調(自定義字段)
注冊回調必需在sdk初始化以后,否則注冊無效
當崩潰發生時,您可以在該回調方法中返回string類型的業務自定義數據,該數據會寫入到崩潰文件中并上傳到服務器展示。注意:崩潰回調中返回string類型數據的長度限制為256個字符。
接口示例:
import com.umeng.umcrash.UMCrash
...
UMCrash.registerUMCrashCallback(new UMCrashCallback(){
@Override
public String onCallback(){
return"崩潰時register的自定義內容字符串";
}
});
上傳后即可在管理平臺 性能監控-崩潰分析-錯誤詳情-自定義字段
中查看到回調信息
1.2 自定義異常
如果開發者自己捕獲了錯誤,需要手動上傳到【QuickTracking】服務器進行分析可以調用下面兩種方法:
方法一:
public static void UMCrash.generateCustomLog(Throwable e,String type)
參數 | 含義 |
e | 錯誤異常 |
type | 自定義錯誤的類型 |
示例:
try{
// 拋出異常的代碼
} catch(Exception e){
UMCrash.generateCustomLog(e,"Custom Exception");
}
方法二:
public static void UMCrash.generateCustomLog(String e,String type)
參數 | 含義 |
e | 錯誤異常 |
type | 自定義錯誤的類型 |
示例:
String e ="自定義異常代碼";
UMCrash.generateCustomLog(e,"Comtom Exception");
使用自定義錯誤,查看時請在錯誤列表頁面選擇【自定義異?!?/span>
1.3 卡頓異常采集
采集卡頓異常無法做額外配置,默認為開啟,如果您需要關閉此采集功能,請參考開關與采樣配置文檔
安卓卡頓分析默認的值為超過2秒計為卡頓,如果您需要設置不同的閾值,可以通過下方的API進行設置,API和示例如下:
import com.umeng.umefs.UMEfs
...
/** 設置卡頓閾值的API是通過UMEfs.initConfig(Bundle bundle)方法設置,
* bundle對象中傳入對應的key為UMEfs.KEY_PA_TIMEOUT_TIME,
* 對應的值為您設置的卡頓的閾值 *
**/
Bundle bundle = new Bundle();
bundle.putLong(UMEfs.KEY_PA_TIMEOUT_TIME, 2000L);//設置卡頓閾值為2000L
UMEfs.initConfig(bundle);
注意: 需要在初始化之前設置,閾值限制為大于0且小于等于4,如傳入的閾值為非法值(負數或大于4),SDK默認取值2秒設置閾值;
1.4 內存異常采集
內存采集支持采集OOM異常和內存占用指標。
OOM異常是崩潰分析的子集,因此不單獨提供開關配置,是否采集OOM與是否采集崩潰異常同步,如您需要關閉某類崩潰,可通過【管理后臺】-【性能體驗】- 【配置管理】-【開關與采樣配置】調整。
內存占用,需要接入APM SDK 1.6.0.001.210_guomi
及以上版本,并建議搭配最新版本統計分析SDK接入, 如您不希望采集內存占用相關指標,可通過調整配置進行關閉。如下圖所示:
1.5 網絡監控
此操作僅代表手動集成網絡監控的方法適用范圍
目前網絡監控僅支持監控OkHttp網絡請求 ,并且需要手動設置eventListenerFactory和NetworkInterceptor
需要使用OkHttp的最低版本是3.11.0
1.5.1 集成方式
集成網絡監控即需要您手動將網絡監控 SDK 相關 API 預埋到您項目工程的OkHttp中。
設置eventListenerFactory和NetworkInterceptor。
在您構建OkHttpClient時,通過OkHttp的eventListenerFactory方法和addNetworkInterceptor方法分別設置事件監聽器和攔截器,示例如下:
OkHttpClient okHttpClient = newOkHttpClient.Builder()
//設置事件監聽器,OkHttpListener.get()為SDK API
.eventListenerFactory(OkHttpListener.get())
//設置攔截器,new OkHttpInterceptor()為SDK API
.addNetworkInterceptor(new OkHttpInterceptor())
.build();
1.6 啟動監控
啟動監控用于監控、還原C端用戶啟動您App時的真實感知情況。分類如下:
啟動類型 | 啟動場景 | 流程分解 | 監控指標 |
首次啟動 | App安裝后的第一次啟動 | 初始化時長、構建時長、頁面加載時長 | Application的attachbaseContext()開始到第一個Activity的onResume()結束 |
冷啟動 | App進程被"殺死"(包括手動方式、被動系統回收等),再次觸發啟動的過程 | 初始化時長、構建時長、頁面加載時長 | Application的attachbaseContext()開始到第一個Activity的onResume()結束 |
熱啟動 | App進程存活,再次觸發啟動的過程(包括前后臺切換、back退出再次進入等) | 啟動時長 | 如果退出時的Activity存在則從恢復該Activity的onRestart()開始到onResume()結束,如果退出時的Activity不存在則從Activity的onCreate()開始到onResume()結束。 |
1.6.1 集成方式
集成方式主要包括手動集成和自動集成(即編譯插件集成)兩種
原理說明:
啟動監控的觸發時機與說明如圖
手動集成:
手動集成啟動監控,需要您主動將啟動監控模塊相關 API 預埋到您項目工程中
使用方法
您可以在Application生命周期
添加LaunchManager.onTraceApp(this, "參數2", 參數3);
和在Activity生命周期
中添加LaunchManager.onTracePage(this, "參數2", 參數3);
來使其生效
其中:
參數 | 參數名 | 參數類型 | 參數說明 |
param1 | context | Context | ApplicationContext,或者ActivityContext |
param2 | methodName | String | 填寫當前參數 |
param3 | isBegin | boolean | 是否開始計時 |
填寫規則的說明如下:
添加地點 | 填寫參數2 | 填寫參數3 | 添加時機 |
Application | LaunchManager.APP_ATTACH_BASE_CONTEXT | true | Application 的 attachBaseContext()方法開始 |
LaunchManager.APP_ATTACH_BASE_CONTEXT | false | Application 的 attachBaseContext()方法結束 | |
LaunchManager.APP_ON_CREATE | false | Application 的 onCreate()方法結束 | |
Activity | LaunchManager.PAGE_ON_CREATE | true | Activity 的 onCreate()方法開始 |
LaunchManager.PAGE_ON_RE_START | true | Activity 的 onRestart()方法開始 | |
LaunchManager.PAGE_ON_START | true | Activity 的 onStart()方法開始 | |
LaunchManager.PAGE_ON_RESUME | false | Activity 的 onResume()結束 | |
LaunchManager.PAGE_ON_STOP | true | Activity 的 onStop()方法開始 |
代碼示例如下:
import com.efs.sdk.launch.LaunchManager
...
// Application部分
public class TestApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
LaunchManager.onTraceApp(this, LaunchManager.APP_ATTACH_BASE_CONTEXT, true);
super.attachBaseContext(base);
...
LaunchManager.onTraceApp(this, LaunchManager.APP_ATTACH_BASE_CONTEXT, false);
}
@Override
public void onCreate() {
super.onCreate();
...
LaunchManager.onTraceApp(this, LaunchManager.APP_ON_CREATE, false);
}
}
// Activity部分
public class TestActivity extends Activity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
LaunchManager.onTracePage(this, LaunchManager.PAGE_ON_CREATE, true);
}
@Override
protected void onRestart() {
LaunchManager.onTracePage(this, LaunchManager.PAGE_ON_RE_START, true);
super.onRestart();
}
@Override
protected void onStart() {
LaunchManager.onTracePage(this, LaunchManager.PAGE_ON_START, true);
super.onStart();
...
}
@Override
protected void onResume() {
super.onResume();
...
LaunchManager.onTracePage(this, LaunchManager.PAGE_ON_RESUME, false);
}
@Override
protected void onStop() {
LaunchManager.onTracePage(this, LaunchManager.PAGE_ON_STOP, true);
super.onStop();
}
}
自動集成
您也可以添加APM Gradle插件來自動完成應用啟動監控過程的埋點
依賴插件
打開您工程根目錄的build.gradle,在dependencies中添加如下:
classpath "com.lydaas.qtsdk:apm-plugin:2.0.0"
注意:確保您已在工程根目錄的build.gradle中添加Maven地址。
示例如下:
buildscript {
repositories {
//配置 阿里云鏡像 maven地址
maven { setUrl("https://maven.aliyun.com/repository/central") }
google()
jcenter()
}
dependencies {
//引入apm性能分析插件
classpath 'com.lydaas.qtsdk:apm-plugin:2.0.0'
}
}
...
allprojects {
repositories {
//配置 阿里云鏡像 maven地址
maven { setUrl("https://maven.aliyun.com/repository/central") }
google()
jcenter()
}
}
配置插件
打開您App的build.gradle添加使用插件,在文件頭添加代碼如下:
apply plugin: 'com.efs.sdk.plugin'
同時添加插件的相關配置,代碼如下:
efs {
//是否對啟動過程進程插樁的開關,如果使用自動集成監控則必須開啟,false則不開啟啟動插件
enable = true
//白名單,支持包力度,必須填寫,如填寫自己應用的包名
whiteList = [
"com.efs.sdk.demo.test", // 如需要針對test目錄下所有的Activity進行自動
"com.efs.sdk.demo.work.WorkActivity" // 針對work目錄下的WorkActivity進行監聽
]
//黑名單,支持包力度,必須填寫,如填寫自己應用的包名
blackList = [
"com.efs.sdk.demo.work" // work下的所有Activity都不需要監聽
]
}
注意: 白名單的判斷優先級是高于黑名單的,如果有個白名單Activity在黑名單包目錄下,則會正常監聽
完整示例:
如何確認插件是否正確集成:
編譯時查看編譯中的Log搜索關鍵字EfsPluginTracer
,出現下列關鍵字,即代表集成自動采集插件
[INFO][EfsPluginTransform]begin efs transform.
[INFO][EfsPluginTracer]dir need trace file is
如下圖所示:
1.6.2 自定義啟動階段數據
如果您想在啟動監控過程中加入自定義的監控階段,比如初始化業務數據(initData)、初始化頁面組件(initView)等,您可以使用自定義啟動階段API加入您自定義的啟動階段數據。
1、自定義啟動階段只支持冷啟動階段,熱啟動不支持
2、如果自定義啟動階段超過SDK所定義的啟動結束時間點(即Activity生命周期中的 onResume方法被),則會被SDK丟棄
您可以通過在啟動前后添加LaunchManager.onTraceBegin
和LaunchManager.onTraceEnd
來實現自定義啟動階段上報
注意:LaunchManager.onTraceBegin
和LaunchManager.onTraceEnd
方法必須配套使用,否則會被SDK上報丟棄
方法
在您自定義階段開始處添加LaunchManager.onTraceBegin
如:
注:自定義階段key長度不可以超過10個字符
/**
* 參數1:上下文
* 參數2:自定義階段key,需要和onTraceEnd配對使用
* 參數3:時間戳
*/
LaunchManager.onTraceBegin(context, "自定義階段key_1", System.currentTimeMillis());
在您自定義階段結束處添加和LaunchManager.onTraceEnd
如下API:
注:自定義階段key長度不可以超過10個字符
/**
* 參數1:上下文
* 參數2:自定義階段key,需要和onTraceBgin配對使用
* 參數3:時間戳
*/
LaunchManager.onTraceEnd(context, "自定義階段key_1", System.currentTimeMillis());
代碼示例:
//監控initData()方法在啟動階段的耗時
LaunchManager.onTraceBegin(MainActivity.this, "initData", System.currentTimeMillis());
initData();
LaunchManager.onTraceEnd(MainActivity.this, "initData", System.currentTimeMillis());
結果驗證
集成完成啟動App,過濾efs.px.api,可以看到如下啟動數據發送成功相關信息,即表示啟動數據成功上報。
1.7 APP應用內H5頁面的APM功能
集成QuickTracking JS SDK的網頁在嵌入到App后,JS SDK采集到的數據可以通過App端上傳到服務器,該功能默認關閉。如果開啟,需要在每一個webview loadUrl前調用如下方法:
import com.efs.sdk.h5pagesdk.H5Manager
...
//以下方法僅支持APM SDK Android 1.6.0.001及以上版本
H5Manager.enableJavaScriptBridge(webView);
webView.loadUrl("https://www.demo.com");
在API 16及以下版本中,注入JavaScript有安全漏洞,請謹慎使用。
嵌入到App中的H5頁面集成APM SDK后需要設置App應用包名白名單,橋接場景下H5不需要設置收數域名。
詳情參考性能體驗Web SDK接入
1.8 原生頁面
1.8.1自動集成
原生頁面的自動集成與啟動監控的自動集成一致,參考啟動監控-依賴插件章節進行插件依賴的添加即可自動集成
1.8.2 自定義頁面階段數據
如果您想在頁面監控過程中加入自定義的監控階段,比如初始化業務數據(initData)、初始化頁面組件(initView)等,您可以使用自定義頁面階段API加入您自定義的頁面階段數據。
在您自定義階段開始處添加如下API: 注:
1、自定義階段key長度不可以超過10個字符;
2、key的名稱不能以"UM_"開頭;
3、單個頁面使用上限為6個,超出則過濾。
import com.umeng.pagesdk.PageManger
在您自定義階段開始處添加如下API
/**
* 參數1: 當前activity對象
* 參數2: 自定義階段key,需要和onTracePageEnd配對使用
*/
PageManger.onTracePageBegin(MainActivity.this, "initView");
在您自定義階段結束處添加如下API:
/**
* 參數1: 當前activity對象
* 參數2: 自定義階段key,需要和onTracePageBegin配對使用
*/
PageManger.onTracePageEnd(MainActivity.this, "initView");
代碼示例:
import com.umeng.pagesdk.PageManger
public class TestActivity extends Activity {
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//監控initView()方法在頁面階段的耗時
PageManger.onTracePageBegin(MainActivity.this, "initView");
initView(); // 業務方初始化邏輯
PageManger.onTracePageEnd(MainActivity.this, "initView");
}
...
}
2. 高級功能
2.1 采集開關
注:您在產品管理平臺
中「開關與采樣配置」中設置的開關和采樣率優先級高于在SDK中設置的開關,SDK會間隔8小時同步是否有開關和采樣配置更新的請求
本采集開關適用于開發者在不想使用某個APM SDK監控模塊時靈活自定義采集范圍。如目前提供功能都需要采集,則不需要使用該開關,如需要調整某個模塊,可按照下面bundle控制說明,選擇key進行設置。
此API需要在調用初始化方法前使用
import com.umeng.umcrash.UMCrash
import com.umeng.umefs.UMEfs
...
/**
* 通過Bundle中指定的key和key的value值(boolean類型)來控制該key對應APM模塊的關閉
*/
UMCrash.initConfig(Bundle args)
//用于控制UMCrash.KEY_ENABLE_CRASH_JAVA
//UMCrash.KEY_ENABLE_CRASH_NATIVE
//UMCrash.KEY_ENABLE_ANR
UMEfs.initConfig(Bundle args)
//用于控制UMEfs.KEY_ENABLE_PA
//UMEfs.KEY_ENABLE_LAUNCH
//UMEfs.KEY_ENABLE_MEM
//UMEfs.KEY_ENABLE_NET
//UMEfs.KEY_ENABLE_H5PAGE
//UMEfs.KEY_ENABLE_PAGE
Bundle控制說明:
key | 說明 | 開關級別 |
UMCrash.KEY_ENABLE_CRASH_JAVA | 用于關閉java crash捕獲,默認為true可設置為false進行關閉 | 二級 |
UMCrash.KEY_ENABLE_CRASH_NATIVE | 用于關閉native crash捕獲,默認為true可設置為false進行關閉 | 二級 |
UMCrash.KEY_ENABLE_ANR | 用于關閉ANR捕獲,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_PA | 用于關閉卡頓捕獲,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_LAUNCH | 用于關閉啟動捕獲,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_MEM | 用于關閉內存占用捕獲,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_NET | 用于關閉網絡分析捕獲,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_H5PAGE | 用于關閉App與H5打通開關,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_PAGE | 用于關閉Page開關,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_CODE_LOG | 用于關閉日志回撈開關,默認為true可設置為false進行關閉 | 一級 |
UMEfs.KEY_ENABLE_INIT_SEND_PV | 用于開啟冷起PV上報開關,默認為false可設置為true進行開啟) | 一級 |
代碼示例如下:
QtConfigure.setLogEnabled(true);
Bundle bundle = new Bundle();
bundle.putBoolean(UMCrash.KEY_ENABLE_CRASH_JAVA, true);
bundle.putBoolean(UMCrash.KEY_ENABLE_CRASH_NATIVE, true);
bundle.putBoolean(UMCrash.KEY_ENABLE_ANR, false);
bundle.putBoolean(UMEfs.KEY_ENABLE_PA, false);
bundle.putBoolean(UMEfs.KEY_ENABLE_LAUNCH, false);
bundle.putBoolean(UMEfs.KEY_ENABLE_MEM, false);
bundle.putBoolean(UMEfs.KEY_ENABLE_H5PAGE, false);
bundle.putBoolean(UMEfs.KEY_ENABLE_CODE_LOG, false);
bundle.putBoolean(UMEfs.KEY_ENABLE_INIT_SEND_PV, true); //v2.0.2 及以上版本支持
UMCrash.initConfig(bundle);
UMEfs.initConfig(bundle)
QtConfigure.init(this,"您的appkey","應用商店名稱",QtConfigure.DEVICE_TYPE_PHONE, "");
1、由于啟動監控早于SDK初始化,所以徹底去掉啟動監控還需關閉插件插樁或去掉手動API埋點。
2、卡頓開關關閉情況下不會對卡頓模塊進行初始化,并輸出如下日志內容:enablePaLog is false 。
3、啟動開關關閉情況下不會對卡頓模塊進行初始化,并輸出如下日志內容:enableLaunchLog is false 。
4、內存開關關閉情況下不會對內存模塊進行初始化,并輸出如下日志內容:enableMemLog is false 。
5、日志回撈關閉情況下不會對日志回撈模塊進行初始化,并輸出如下日志內容:enable codeLog is false 。
2.2 符號表
2.2.1 什么是符號表
符號表是內存地址與函數名、文件名、行號的映射表。符號表元素如下所示:
<起始地址> <結束地址> <函數> [<文件名:行號>]
為了能快速并準確地定位用戶APP發生Crash的代碼位置,我們使用符號表對APP發生Crash的程序堆棧進行解析和還原。 因此在使用APM SDK還原時需要先上傳符號表!
2.2.2 為什么要上傳符號表
為了能快速并準確地定位用戶APP發生Crash的代碼位置,使用符號表對APP發生Crash的程序堆棧進行解析和還原。
舉一個例子,解析前:
解析后:
管理平臺-性能體驗-配置管理處提供了手動上傳符號表功能如下圖:
2.2.3 Android 打包符號表方式
Java 符號表
需要將多個mapping文件請自行處理追加到一個文件中,最終命名為mapping.txt,并打包成zip文件,如果需要同時包含so符號,可以把so文件打包在一起。(具體結構可參考下面符號文件建議示例)
Android so庫
保證符號表的so文件與發布的so文件同名,so壓縮前最大支持400M;如果一個版本里包含同文件名,不同架構的so,可以壓縮到不同的目錄中,反符號化時需要通過buildid去關聯;建議編譯時使用-g參數,帶上debug信息,崩潰堆棧可以解析到代碼行級,實際發布時,再使用strip命令去掉調試信息;如果不帶debug信息,則只能定位到函數名級下列情況下,需要so文件帶有buildid
不同CPU架構的so文件名一樣,放在不同的路徑下
同一個應用版本里,可能有多個版本的so庫,使用了動態加載的技術如何生成帶buildid的so,請檢查編譯參數,確保沒有帶”—build-id=none”,如果還是沒有buildid,可以添加編譯參數”ld_flags += -Wl,--build-id=sha1”可通過file命令檢查so文件是否帶buildid,調試信息
符號文件建議示例:
如果您是使用CMake編譯的項目,那么so文件在工程中的位置為:
<項目文件夾>/<Module>/build/intermediates/cmake/debug/obj/local<架構>/對應的so
文件
mapping文件的位置:
<項目文件夾><Module>/build/outputs/mapping/<build-type>/
版本選擇
當前支持現有版本列表和手動輸入兩種方式:
如果是已經有錯誤上報到APM后臺的版本,可以直接在上傳符號表時的版本下拉框中選擇
如果是即將發布的新版本,支持手動輸入版本號,請輸入與新版本完全一致的內容,并點擊‘添加版本號‘即可手動添加
2.2.4 手動上傳方式
按照文檔說明將符號表文件壓縮到一起:查看【符號文件建議示例】
登錄平臺,進入
【性能體驗】-【配置管理】
點擊符號表管理 ,點擊
上傳符號表文件
,將第一步壓縮好的符號表文件上傳即可已經上傳的符號表可以在符號表管理頁面進行查看
當前支持上傳方式:后臺手動上傳(最大支持400M)
2.3 設置HTTP接口API
您可以通過調用UMEfs.setRequestProtocol
來設置http接口
//isHttpsProtocol默認為true,為false則SDK本地默認發送HTTP請求
UMEfs.setRequestProtocol(boolean isHttpsProtocol);
接口說明:
該接口僅影響UAPM 性能部分發送請求,UMCrash模塊不受該API控制;
該接口需要在初始化SDK之前設置;
用戶可通過該接口修改SDK本地是以HTTP頭發送還是HTTPS頭發送,默認SDK是以HTTPS頭發送,并且可以通過云控配置動態下發修改,并且云控下發會覆蓋該接口的設置;
通過setCustomDomainEfs接口傳入的域名中的HTTP或HTTPS頭接口內會自動切掉,以SDK默認值(HTTPS頭)或setRequestProtocol接口或云控決定SDK使用HTTP或HTTPS。
2.4 日志回撈
2.4.1 設置回撈標識
您可以通過如下接口設置回撈標識:
Bundle bundle = new Bundle();
//設置回撈標識為android0911
bundle.putString(UMEfs.KEY_LOG_USER_ID, "android0911");
UMEfs.initConfig(bundle);
注意:
該設置必須在初始化SDK之前完成,運行時不可再次設置
回撈標識不能為空,且長度不能超過128
如果不設置回撈標識,默認以UMID作為標識回撈
2.4..2 日志記錄
您可以通過如下接口完成相關日志的記錄:
import com.umeng.logsdk.ULog;
...
ULog.v("日志TAG", "日志內容");
ULog.d("日志TAG", "日志內容");
ULog.i("日志TAG", "日志內容");
ULog.w("日志TAG", "日志內容");
ULog.e("日志TAG", "日志內容");
注意:
共提供五種日志等級,包括:v/d/i/w/e
參數1為日志的TAG,不能為空或長度超過64,參數2為日志的內容,不能為空或長度超過1024
務必使用「import com.umeng.logsdk.ULog;」類下的ULog.v等方法,且必須要在初始化SDK之后調用。如果使用「com.umeng.commonsdk.statistics.common.ULog;」將不生效
2.4.3 日志策略
日志持久化存儲上限為5MB,當達到上限時則僅保留最近7天的日志,如果最近7天日志達到上限則不再繼續存儲日志
觸發日志持久化存儲:
2.1. 前后臺切換;
2.2. 緩存數據達到上限則進行持久化日志存儲
當回撈任務下發到本地,并成功加載后,則進行回撈任務和本地日志的匹配,匹配到的日志開始上傳,當前進程正在產生的日志需要下次啟動后匹配任務繼續上傳
2.4.4 日志排查
日志回撈模塊開啟,輸出如下日志:
enable codeLog is true
正確讀取并加載日志任務,輸出如下日志:
09-13 14:56:28.988 15994-15994/com.efs.demo I/ULogConfigManager: [log register] begin. 09-13 14:56:29.704 15994-15994/com.efs.demo I/ULogConfigManager: [log register] call back config. 09-13 14:56:29.709 15994-15994/com.efs.demo I/ULogConfigManager: [log register] save did is 9560fe0f75e7c92fff351d537633a91cia 09-13 14:56:29.709 15994-15994/com.efs.demo I/ULogConfigManager: [log register] save uid is android0911 09-13 14:56:29.710 15994-15994/com.efs.demo I/ULogConfigManager: [log register] save task id is 1660130437264, task is {"task_etime":1663257599000,"target_type":0,"task_id":"1660130437264","task_btime":1662307200000,"task_type":0} 09-13 14:56:29.710 15994-15994/com.efs.demo I/ULogConfigManager: [log register] add mem task id is 1660130437264 09-13 14:56:29.710 15994-15994/com.efs.demo I/ULogConfigManager: [log register] save task id is 1660130437265, task is {"task_etime":1663257599000,"target_type":1,"task_id":"1660130437265","task_btime":1662307200000,"task_type":0} 09-13 14:56:29.710 15994-15994/com.efs.demo I/ULogConfigManager: [log register] add mem task id is 1660130437265 09-13 14:56:29.710 15994-15994/com.efs.demo I/ULogConfigManager: [log register] save task id set is 1660130437264_1660130437265
持久化存儲日志(如前后臺切換),輸出如下日志:
09-13 15:06:23.445 15994-16722/com.efs.demo I/efs.base: {"fr":"android","sdk":23,"others_OS":"Android","stime":1663052188738,"dsp_h":1920,"rom":"6.0.1","sdk_ver":"1.3.11.umeng","w_tm":1663052783,"um_access":"wifi","lang":"zh","um_umid_header":"aid03bc207717fd2238c5d8bf93ed4fffb","pkg":"com.efs.demo","type":"codelogperf","dsp_w":1080,"um_network_type":0,"wid":"54d8e67e-0a4e-4e11-9517-08ac993aa670","log_uid":"android0911","pid":15994,"ps":"com.efs.demo","build_model":"MI 4LTE","appid":"ez2cookeijezdgu3nxmci6zt","um_app_carrier":"","ctime":1663052783,"net":"wifi","um_crash_sdk_version":"efs.1.6.0.001.200","um_os":"android","vcode":"1","tzone":"Asia\/Shanghai","um_app_channel":"Umeng","brand":"xiaomi","log_did":"9560fe0f75e7c92fff351d537633a91cia","codelog":{"taskid":"","status":0,"time_start":1663052782368,"time_end":1663052783439,"uid":"android0911","did":"9560fe0f75e7c92fff351d537633a91cia","body":[{"tag":"walle","msg":"button 1 --->>> ","level":0,"time":1663052782367,"process":"com.efs.demo","thread":"main"},{"tag":"walle","msg":"button 1 --->>> ","level":2,"time":1663052782370,"process":"com.efs.demo","thread":"main"}]},"uid":"54d8e67e-0a4e-4e11-9517-08ac993aa670","ver":"1.0","model":"mi-4lte"} 09-13 15:06:23.459 15994-16077/com.efs.demo I/RecordLogCacheProcessor: save file, type is codelogperf 09-13 15:06:23.463 15994-16077/com.efs.demo I/RecordLogCacheProcessor: upload file, name is codelogperf_none_1_1_15994_2442_1663052783458_android0911_9560fe0f75e7c92fff351d537633a91cia_1663052782368_1663052783439
查看data/data/<你的app>/app_UApm/<你的appkey>/upload_codelog中有日志文件,則表示日志保存成功
日志匹配并上傳成功,輸出如下日志:
09-13 15:06:39.255 15994-16077/com.efs.demo I/efs.cache: [-->>] add file is codelogperf_gzip_2_1_15994_3356_1663052783463_android0911_9560fe0f75e7c92fff351d537633a91cia_1663052782368_1663052783439 09-13 15:06:39.262 15994-16141/com.efs.demo I/efs.LogSendAction.Codelog: send data url is http://aplus2-portal-lite.emas-poc.com 09-13 15:06:39.272 15994-16141/com.efs.demo I/efs.px.api: Upload file, url is http://aplus2-portal-lite.emas-poc.com/apm_logs 09-13 15:06:39.478 15994-16141/com.efs.demo I/efs.px.api: upload result : true, resp is HttpResponse {succ=true, code=200, data='{"msg":"成功","code":0,"cip":"XXX.XX.XX.XXX","stm":1663052801}', extra={req_url=http://aplus2-portal-lite.emas-poc.com/apm_logs, flow_limit=true, biz_code=0, size=592, type=codelogperf}} 09-13 15:06:39.480 15994-16077/com.efs.demo I/efs.send_log: send secess.
3. 本地Log說明
本地Log僅用于排查本地是否正確集成性能體驗SDK,以及各項功能的正確觸發,不代表管理平臺處表現
開啟本地日志
可通過QtConfigure.setLogEnabled(boolean)接口控制Log的輸出。
App正式上線前請關閉SDK運行調試日志。避免無關Log輸出。
日志開關
可以通過調用如下方法控制SDK運行調試日志是否輸出,默認情況下SDK運行調試日志為關閉。需要用戶手動打開。
/**
* 設置組件化的Log開關
* @param boolean 默認為false,如需查看Log設置為true
*/
QtConfigure.setLogEnabled(true);
如果查看初始化過程中的Log,一定要在調用初始化方法前將Log開關打開。
日志等級
日志分為四種等級,方便用戶查看:
Error(打印SDK集成或運行時錯誤信息)。
Warn(打印SDK警告信息)。
Info(打印SDK提示信息)。
Debug(打印SDK調試信息)。
常見場景與日志說明:
初始化
初始化成功后,會產生初始化成功log 您可以通過過濾
QtLog
來查看崩潰分析
模擬崩潰后查看是否采集到崩潰日志,您可以通過過濾
DEBUG
關鍵字來查看日志內存異常采集上報
模擬內存溢出后查看是否采集到崩潰日志,您可以通過過濾
DEBUG
關鍵字來查看日志啟動上報
模擬崩潰后查看是否采集到崩潰日志,您可以通過過濾
LaunchTrace
關鍵字來查看日志說明其中coldTime is ***為冷啟動標志,hotTime is ***為熱啟動標志, 完整采集日志如上圖所示
網絡分析上報
在排查網絡分析上報日志時您可以先檢查一下網絡分析是否正確打開,您可以通過過濾
inner config
關鍵字來查看當inner config : net open.和inner config : net rate is 100 時網絡分析功能打開
過濾
NetTrace
關鍵字可以用于檢查網絡分析是否正確采樣狀態正確采樣時:
未采樣時:
卡頓采集上報
模擬卡頓時過濾
patrace
關鍵字查看日志,卡頓采集成功如下圖所示:內存分析上報
開啟內存分析后過濾
wf_heap_used_rate
關鍵字查看日志,默認間隔1s輸出一條日志,日志如下圖所示:原生頁面流暢度和幀率上報
幀率上報需集成自動化采集插件請根據配置插件教程正確集成,管理平臺開啟
慢加載閾值設置
加載時長請根據自己需求添加冷啟動2次過濾
PageManger-PageFPSImpl
關鍵字查看日志,日志如下圖所示: