bugly怎么读_高级功能
Bugly Android SDK 高級配置
更多的Bugly行為控制
我們提供了UserStrategy類作為Bugly的初始化擴展,在這里您可以修改本次初始化Bugly數(shù)據(jù)的版本、渠道及部分初始化行為。通過以下方式傳入:
UserStrategy strategy = new UserStrategy(appContext);
//...在這里設(shè)置strategy的屬性,在bugly初始化時傳入
//...
CrashReport.initCrashReport(appContext, APPID, true, strategy);
如果通過UserStrategy設(shè)置了版本號和渠道號,則會覆蓋“AndroidManifest.xml”里面配置的版本號和渠道。
用戶策略(UserStrategy)
設(shè)置App版本、渠道、包名
Bugly默認(rèn)讀取AndroidManifest.xml文件中VersionName、Package信息。若您有自己的版本或渠道設(shè)定需求,可通過該接口修改。
strategy.setAppChannel("myChannel"); //設(shè)置渠道
strategy.setAppVersion("1.0.1"); //App的版本
strategy.setAppPackageName("com.tencent.xx"); //App的包名
設(shè)置Bugly初始化延遲
Bugly會在啟動10s后聯(lián)網(wǎng)同步數(shù)據(jù)。若您有特別需求,可以修改這個時間。
strategy.setAppReportDelay(20000); //改為20s
設(shè)置標(biāo)簽
自定義標(biāo)簽,用于標(biāo)明App的某個“場景”。在發(fā)生Crash時會顯示該Crash所在的“場景”,以最后設(shè)置的標(biāo)簽為準(zhǔn),標(biāo)簽id需大于0。例:當(dāng)用戶進(jìn)入界面A時,打上9527的標(biāo)簽:
CrashReport.setUserSceneTag(context, 9527); // 上報后的Crash會顯示該標(biāo)簽
打標(biāo)簽之前,需要在Bugly產(chǎn)品頁配置中添加標(biāo)簽,取得標(biāo)簽ID后在代碼中上報。
設(shè)置自定義Map參數(shù)
自定義Map參數(shù)可以保存發(fā)生Crash時的一些自定義的環(huán)境信息。在發(fā)生Crash時會隨著異常信息一起上報并在頁面展示。
CrashReport.putUserData(context, "userkey", "uservalue");
最多可以有9對自定義的key-value(超過則添加失敗);
key限長50字節(jié),value限長200字節(jié),過長截斷;
key必須匹配正則:[a-zA-Z[0-9]]+。
設(shè)置開發(fā)設(shè)備
在開發(fā)測試階段,可以在初始化Bugly之前通過以下接口把調(diào)試設(shè)備設(shè)置成“開發(fā)設(shè)備”。
CrashReport.setIsDevelopmentDevice(context, true);
ADT 17增加了BuildConfig特性,可以通過獲取BuildConfig類的DEBUG變量來設(shè)置:
CrashReport.setIsDevelopmentDevice(context, BuildConfig.DEBUG);
設(shè)置Crash回調(diào)
Crash回調(diào)類(CrashReport的子類)的定義如下:
public abstract static class CrashHandleCallback {
public static final int CRASHTYPE_JAVA_CRASH = 0; // Java crash
public static final int CRASHTYPE_JAVA_CATCH = 1; // Java caught exception
public static final int CRASHTYPE_NATIVE = 2; // Native crash
public static final int CRASHTYPE_U3D = 3; // Unity error
public static final int CRASHTYPE_ANR = 4; // ANR
public static final int CRASHTYPE_COCOS2DX_JS = 5; // Cocos JS error
public static final int CRASHTYPE_COCOS2DX_LUA = 6; // Cocos Lua error
/**
* Crash處理.
*
* @param crashType 錯誤類型:CRASHTYPE_JAVA,CRASHTYPE_NATIVE,CRASHTYPE_U3D ,CRASHTYPE_ANR
* @param errorType 錯誤的類型名
* @param errorMessage 錯誤的消息
* @param errorStack 錯誤的堆棧
* @return 返回額外的自定義信息上報
*/
public abstract Map onCrashHandleStart(int crashType, String errorType,
String errorMessage, String errorStack);
/**
* Crash處理.
*
* @param crashType 錯誤類型:CRASHTYPE_JAVA,CRASHTYPE_NATIVE,CRASHTYPE_U3D ,CRASHTYPE_ANR
* @param errorType 錯誤的類型名
* @param errorMessage 錯誤的消息
* @param errorStack 錯誤的堆棧
* @return byte[] 額外的2進(jìn)制內(nèi)容進(jìn)行上報
*/
public abstract byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType,
String errorMessage, String errorStack);
}
設(shè)置方法如下:
UserStrategy strategy = new UserStrategy(appContext);
strategy.setCrashHandleCallback(new CrashReport.CrashHandleCallback() {
public Map onCrashHandleStart(int crashType, String errorType,
String errorMessage, String errorStack) {
LinkedHashMap map = new LinkedHashMap();
map.put("Key", "Value");
return map;
}
@Override
public byte[] onCrashHandleStart2GetExtraDatas(int crashType, String errorType,
String errorMessage, String errorStack) {
try {
return "Extra data.".getBytes("UTF-8");
} catch (Exception e) {
return null;
}
}
});
CrashReport.initCrashReport(appContext, APPID, true, strategy);
兩個回調(diào)返回的數(shù)據(jù)將伴隨Crash一起上報到Bugly平臺,并展示在附件中:
注意,需要盡量保證回調(diào)的邏輯簡單和穩(wěn)定,絕對不能在回調(diào)中Kill掉進(jìn)程,否則會影響Crash的上報。如果需要執(zhí)行類似于Crash之后Kill掉進(jìn)程并重新拉起的動作,建議自定義一個Crash handler,并在初始化Bugly之前注冊。
Javascript的異常捕獲功能
Bugly Android SDK 1.2.8及以上版本提供了Javascript的異常捕獲和上報能力,以便開發(fā)者可以感知到 WebView中發(fā)生的Javascript異常。
/**
* 設(shè)置Javascript的異常監(jiān)控
*
* @param webView 指定被監(jiān)控的webView
* @param autoInject 是否自動注入Bugly.js文件
* @return true 設(shè)置成功;false 設(shè)置失敗
*/
CrashReport.setJavascriptMonitor(WebView webView, boolean autoInject)
“Bugly.js”文件在Bugly SDK包中,可以在HTML手動嵌入;
如果使用自動集成SDK方式,可以使用自動注入和手動注入兩種方式。如果使用自動集成+手動注入的方式 需要下載“Bugly.js”文件;
由于Android 4.4以下版本存在反射漏洞,接口默認(rèn)只對Android 4.4及以上版本有效;
接口不會設(shè)置webView的WebViewClient和Listener;
接口默認(rèn)會開啟webView的JS執(zhí)行能力;
如果使用了非Android官方的WebView(例如使用X5內(nèi)核),需要下載2.5.0或以上版本Bugly Android SDK并按照以下方法使用:
CrashReport.WebViewInterface webView = new CrashReport.WebViewInterface() {
/**
* 獲取WebView URL.
*
* @return WebView URL
*/
@Override
public String getUrl() {
// 下面僅為例子,請用真正邏輯代替
return .getUrl();
}
/**
* 開啟JavaScript.
*
* @param flag true表示開啟,false表示關(guān)閉
*/
@Override
public void setJavaScriptEnabled(boolean flag) {
// 下面僅為例子,請用真正邏輯代替
WebSettings webSettings = .getSettings();
webSettings.setJavaScriptEnabled(flag);
}
/**
* 加載URL.
*
* @param url 要加載的URL
*/
@Override
public void loadUrl(String url) {
// 下面僅為例子,請用真正邏輯代替
.loadUrl();
}
/**
* 添加JavaScript接口對象.
*
* @param jsInterface JavaScript接口對象
* @param name JavaScript接口對象名稱
*/
@Override
public void addJavascriptInterface(H5JavaScriptInterface jsInterface, String name) {
// 下面僅為例子,請用真正邏輯代替
.addJavascriptInterface(jsInterface, name);
}
/**
* 獲取WebView的內(nèi)容描述.
*
* @return WebView的內(nèi)容描述.
*/
@Override
public CharSequence getContentDescription() {
// 下面僅為例子,請用真正邏輯代替
return .getContentDescription();
}
};
// 調(diào)用Bugly設(shè)置JS異常捕獲接口時傳入創(chuàng)建的WebView接口對象即可
自動注入
建議在WebChromeClient的onProgressChanged函數(shù)中調(diào)用接口:
CrashReport.setJavascriptMonitor(webView, true);
例子如下:
WebView webView = new WebView(this);
// 設(shè)置WebChromeClient
webView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView webView, int progress) {
// 增加Javascript異常監(jiān)控
CrashReport.setJavascriptMonitor(webView, true);
super.onProgressChanged(webView, progress);
}
});
// 加載HTML
webView.loadUrl(url);
手動注入
下載Bugly.js文件并添加到需要監(jiān)控Javascript異常的HTML中:
...
在WebView加載完該HTML后設(shè)置Javascript的異常捕獲功能:
WebView webView = new WebView(this);
// 加載HTML
webView.loadUrl(url);
// 增加Javascript異常監(jiān)控
CrashReport.setJavascriptMonitor(webView, false);
在Bugly Android SDK捕獲到Javascript異常后,默認(rèn)會上報以下信息:
Android設(shè)備的相關(guān)信息;
Javascript異常堆棧和其他信息;
Java堆棧;
WebView的信息,目前只包括ContentDescription。
更多的Bugly日志附加信息
我們提供了一些信息記錄API供您補充額外的內(nèi)容。這些信息會隨著異常一起上報。例如App環(huán)境、用戶屬性等等。主要包含以下接口:
1、設(shè)置用戶ID
您可能會希望能精確定位到某個用戶的異常,我們提供了用戶ID記錄接口。
例:網(wǎng)游用戶登錄后,通過該接口記錄用戶ID,在頁面上可以精確定位到每個用戶發(fā)生Crash的情況。
CrashReport.setUserId("9527"); //該用戶本次啟動后的異常日志用戶ID都將是9527
2、主動上報開發(fā)者Catch的異常
您可能會關(guān)注某些重要異常的Catch情況。我們提供了上報這類異常的接口。
例:統(tǒng)計某個重要的數(shù)據(jù)庫讀寫問題比例。
try {
//...
} catch (Throwable thr) {
CrashReport.postCatchedException(thr); // bugly會將這個throwable上報
}
3、自定義日志功能
我們提供了自定義Log的接口,用于記錄一些開發(fā)者關(guān)心的調(diào)試日志,可以更全面地反應(yīng)App異常時的前后文環(huán)境。使用方式與android.util.Log一致。用戶傳入TAG和日志內(nèi)容。該日志將在Logcat輸出,并在發(fā)生異常時上報。有如下
BuglyLog.v(tag, log)
BuglyLog.d(tag, log)
BuglyLog.i(tag, log)
BuglyLog.w(tag, log)
BuglyLog.e(tag, log)
注意:
使用BuglyLog接口時,為了減少磁盤IO次數(shù),我們會先將日志緩存在內(nèi)存中。當(dāng)緩存大于一定閾值(默認(rèn)10K),會將它持久化至文件。您可以通過setCache(int byteSize)接口設(shè)置緩存大小,范圍為0-30K。例:BuglyLog.setCache(12 * 1024) //將Cache設(shè)置為12K
如果您沒有使用BuglyLog接口,且初始化Bugly時isDebug參數(shù)設(shè)置為false,該Log功能將不會有新的資源占用;
為了方便開發(fā)者調(diào)試,當(dāng)初始化Bugly的isDebug參數(shù)為true時,異常日志同時還會記錄Bugly本身的日志。請在App發(fā)布時將其設(shè)置為false;
上報Log最大30K。
添加額外的SO文件信息
為了更好得區(qū)分不同構(gòu)建或者版本的SO文件以方便地管理Native代碼,建議給SO文件加上獨立的版本號或者UUID。
SO文件的版本號
在任意一個源碼文件(建議是專門控制版本相關(guān)信息的源碼文件)中加入一行:
extern "C" const char SO_FILE_VERSION[] __attribute__ ((section (".bugly_version"))) = ""
此后,NDK編譯的SO文件將帶有一個具有版本信息的段(.bugly_version)。之所以把段名 定義為“.bugly_version”,是為了Bugly的NDK解析的統(tǒng)一性。查看SO文件的版本號的一個方法如下(需要readelf或類似工具):
readelf -p .bugly_version libxxx.so
其中“readelf”是GNU Binary Utilities一個工具,用于解析ELF格式文件(SO文件屬于ELF格式文件)。Linux下默認(rèn)安裝了;Windows下可使用NDK提供的readelf(\toolchains\xxx\prebuit\windowsxxx\bin\xxxreadelf.exe)或者安裝MinGW或者Cygwin;Mac下如果沒有該工具,可從GNU Binary Utilities官網(wǎng)下載安裝或者使用NDK提供的readelf。
添加SO文件的UUID
在“Android.mk”文件中加上一行:
LOCAL_LDFLAGS += -Xlinker --build-id
此后,NDK構(gòu)建的SO文件將帶有一個段(.note.gnu.buildid)專門存放構(gòu)建的UUID。查看SO文件的UUID的一個方法如下(需要readelf或類似工具):
readelf -x .note.gnu.build-id libxxx.so
Native堆棧例子如下圖(UUID不在堆棧中顯示):
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的bugly怎么读_高级功能的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 南航里程每年清空吗_航空里程被盗用,多位
- 下一篇: cpuz北桥频率和内存频率_内存频率不是