腾讯云CLS Android SDK
您需要在Android Studio工程对应模块下的build.gradle文件中增加以下依赖。
implementation(group: 'com.tencentcloudapi.cls', name: 'tencentcloud-cls-sdk-android', version: '3.0.0')
secretId和secretKey为云API密钥,密钥信息获取请前往密钥获取。并请确保云API密钥关联的账号具有相应的SDK上传日志权限
| 参数名 | 类型 | 说明 |
|---|---|---|
endpoint |
String |
日志服务CLS endpoint接入域名,如:ap-guangzhou.cls.tencentcs.com |
host |
String |
主机地址 |
credential |
Credential |
认证信息 |
topicId |
String |
日志主题ID |
flushInterval |
int |
两次数据发送的最小时间间隔,单位毫秒,默认5秒 |
flushBulkSize |
int |
flush日志的最大条目数,默认50,最大4096 |
maxCacheSize |
long |
本地缓存上限值,单位byte,默认32MB |
mLogEnabled |
boolean |
是否开启打印日志 |
mNetworkTypePolicy |
int |
网络上传策略,支持2G/3G/4G/WIFI/5G |
appVersion |
String |
应用版本 |
appName |
String |
应用名称 |
tag |
Map<String, String> |
标签键值对 |
callback |
TrackLogEventCallBack |
回调函数 |
1、SDK 本地数据库默认缓存数据的上限值为 32 MB。支持通过 setMaxCacheSize() 方法来设定缓存数据的上限值。参数单位为 byte
2、默认的 flushBulkSize 为 100 条,默认的 flushInterval 为 15 秒。满足条件后,cls SDK 会将数据 lz4 压缩后,批量发送到cls。
3、当存储数量达到上限值,会依次丢弃老数据,保留最新的数据
数据flush条件:
1、用户主动触发
2、与上次发送的时间间隔是否大于 flushInterval
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
singletonInit(this);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
sendLog(this);
}
public void singletonInit(Context context) {
ClsConfigOptions clsConfigOptions = new ClsConfigOptions(
"ap-guangzhou-open.cls.tencentcs.com",
"1",
new Credential("", ""));
clsConfigOptions.enableLog(true);
ClsDataAPI.startWithConfigOptions(context, clsConfigOptions);
}
public void sendLog(Context context) {
LogItem logItem = new LogItem();
logItem.SetTime(System.currentTimeMillis());
logItem.PushBack("hello", "world");
try {
ClsDataAPI.sharedInstance(context).trackLog(logItem);
} catch (InvalidDataException e) {
CLSLog.printStackTrace(e);
}
}
}
您需要在Android Studio工程对应模块下的build.gradle文件中增加以下依赖。
implementation(group: 'com.tencentcloudapi.cls', name: 'cls-network-diagnosis-reporter-android', version: '3.0.0')
implementation(group: 'com.tencentcloudapi.cls', name: 'tencentcloud-cls-sdk-android', version: '3.0.0')
接入Android应用的网络数据所涉及的依赖包说明如下表所示。
- tencentcloud-log-android-sdk 核心SDK,用于采集Android应用的网络数据到日志服务。
- cls-android-network-diagnosis-reporter 网络探测插件。
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
W/System.err: java.io.IOException: Cleartext HTTP traffic to **** not permitted
- 在res文件夹下创建一个xml文件夹,然后创建一个network_security_config.xml文件,文件内容如下: (ap-guangzhou.cls.tencentcs.com 按需要制定)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--<base-config cleartextTrafficPermitted="true" />-->
<domain-config cleartextTrafficPermitted="true">
<domain includeSubdomains="true">ap-guangzhou.cls.tencentcs.com</domain>
</domain-config>
</network-security-config>
- 在AndroidManifest.xml文件下的application标签增加以下属性
<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
/>
lz4 压缩算法混淆异常,需要skip掉
-keep class net.jpountz.lz4.** { *; }
- 添加Application类,即在$PROJECT/app/src/main/AndroidManifest.xml文件中增加Application类。 例如添加MyApplication类,配置示例如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.tencentcloudapi.cls">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Tencentcloudclssdkandroid"
android:networkSecurityConfig="@xml/network_security_config"
>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
IDE将根据Android Studio提示,自动创建一个名为MyApplication的类添加到当前项目。
- 在MyApplication.onCreate方法中,增加如下初始化代码。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
singletonInit(this);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
clsNetDiagnosis();
}
public void singletonInit(Context context) {
ClsConfigOptions clsConfigOptions = new ClsConfigOptions(
"https://ap-guangzhou-open.cls.tencentcs.com",
"[日志主题id]",
new Credential("[secret_id]", "[secret_key]"));
clsConfigOptions.enableLog(true);
clsConfigOptions.addTag("cls_android", "3.0.0");
ClsDataAPI.startWithConfigOptions(context, clsConfigOptions);
// 添加插件,自定义插件上报CLS内容
INetworkDiagnosisPlugin clsNetDiagnosisPlugin = new NetworkDiagnosisPlugin();
clsNetDiagnosisPlugin.addCustomField("test", "tag");
clsNetDiagnosisPlugin.setAppCredentialToken("[可以从 cls 服务端获取移动端接入 token]");
ClsDataAPI.sharedInstance(context).
addPlugin(clsNetDiagnosisPlugin).
startPlugin(context);
}
}
CLSConfig类定义了关键的配置字段
CLSAdapter类是插件的管理类。
public void clsHttpPing(Context context) throws NoSuchAlgorithmException {
CLSNetworkDiagnosis.HttpRequest request = new CLSNetworkDiagnosis.HttpRequest();
request.headerOnly = true;
request.downloadBytesLimit = 1024;
//可选参数,证书检验回调。getSSLContext的配置参考下文。
request.credential = new INetworkDiagnosis.HttpCredential(getSSLContext(context), null);
//可选参数,设置当次网络探测的扩展业务参数。
request.extension = new HashMap<String, String>() {
{
put("custom_field", "httpPing");
}
};
request.domain = "https://ap-guangzhou.cls.tencentcs.com";
CLSNetworkDiagnosis.getInstance().http(request);
}
public void clsDNSPing() {
INetworkDiagnosis.DnsRequest request = new INetworkDiagnosis.DnsRequest();
request.extension = new HashMap<String, String>() {
{
put("custom_field", "dns");
}
};
request.domain = "ap-guangzhou-open.cls.tencentcs.com";
CLSNetworkDiagnosis.getInstance().dns(request);
}
public void clsPing() {
INetworkDiagnosis.PingRequest request = new INetworkDiagnosis.PingRequest();
request.extension = new HashMap<String, String>() {
{
put("custom_field", "ping");
}
};
request.domain = "ap-guangzhou-open.cls.tencentcs.com";
CLSNetworkDiagnosis.getInstance().ping(request);
}
public void clsMTR() {
Map<String, String> customFiled = new LinkedHashMap<>();
customFiled.put("cls", "custom field");
INetworkDiagnosis.MtrRequest request = new INetworkDiagnosis.MtrRequest();
request.protocol = INetworkDiagnosis.MtrRequest.Protocol.ICMP;
request.extension = new HashMap<String, String>() {
{
put("custom_field", "mtr");
}
};
request.domain = "ap-guangzhou-open.cls.tencentcs.com";
CLSNetworkDiagnosis.getInstance().mtr(request, new INetworkDiagnosis.Callback() {
@Override
public void onComplete(INetworkDiagnosis.Response response) {
CLSLog.i("onComplete",response.content);
}
});
}
public void clsTcpPing() {
INetworkDiagnosis.TcpPingRequest request = new INetworkDiagnosis.TcpPingRequest();
request.extension = new HashMap<String, String>() {
{
put("custom_field", "ping");
}
};
request.domain = "ap-guangzhou-open.cls.tencentcs.com";
request.port = 80;
request.payload = "hello";
CLSNetworkDiagnosis.getInstance().tcpPing(request);
}