本文介绍如何通过Android SDK接入Android应用数据到日志服务移动运维监控。移动运维监控用于实时监控App崩溃、ANR等问题,并且支持智能分析,帮助您低成本、高效率地发现App应用中的各类隐患。

前提条件

已创建移动监控应用。具体操作,请参见添加应用

步骤一:集成SDK

您可以通过自动或手动方式集成SDK。

(推荐)自动集成

说明 目前,只支持Maven中央仓库
  1. 在Project级别的build.gradle文件中添加以下配置。
    buildscript {
        repositories {
            google()
            jcenter()
            mavenCentral()
        }
    }
    
    allprojects {
        repositories {
            google()
            jcenter()
            mavenCentral()
        }
    }
  2. 在app级别的build.gradle文件中添加如下配置。
    android {
       defaultConfig {
           ndk {
               // 设置支持的so库架构,不设置时默认支持全部架构。
               abiFilters 'armeabi' //, 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
           }
       }
    }
    
    dependencies {
        // Gradle 3.0以上版本请使用implementation。
        // 其中latest.release指的是最新的SDK版本号,建议您指定明确的版本号。
        implementation 'com.aliyun.openservices:aliyun-log-android-sdk:latest.release'
        implementation 'com.aliyun.openservices:sls-android-core:latest.release'
        implementation 'com.aliyun.openservices:sls-android-ot:latest.release'
        implementation 'com.aliyun.openservices:sls-android-crashreporter:latest.release'
    }

手动集成

从Maven中央仓库下载如下SDK的最新版本。

步骤二:配置权限

AndroidManifest.xml文件中加上如下权限申明:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

步骤三:混淆配置

如果您的项目代码进行了打包混淆,则您需要进行混淆配置。在打包混淆规则中,需要保留com.uc.crashsdk包名下所有的类名和方法名。例如在progaurd.cfg文件中添加如下配置:

-keep class com.uc.crashsdk.** { *; }
-keep interface com.uc.crashsdk.** { *; }
-keep class com.aliyun.sls.android.producer.* { *; }
-keep interface com.aliyun.sls.android.producer.* { *; }
-keep class com.aliyun.sls.android.** { *; }

步骤四:配置接入服务

  1. 添加Application类,即在$PROJECT/app/src/main/AndroidManifest.xml文件中增加Application类。

    例如添加MyApplication类,配置示例如下:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.aliyun.sls.android.demo">
        ...
    
        <application
            android:icon="@mipmap/ic_launcher"
            ...
            android:name="com.aliyun.sls.android.demo.SLSDemoApplication"
            ...
            android:theme="@style/AppTheme">
                ...
        </application>
    </manifest>
    IDE将根据Android Studio提示,自动创建一个名为MyApplication的类添加到当前项目中。
  2. 在MyApplication.onCreate方法中,增加如下初始化代码。
    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            Credentials credentials = new Credentials();
            credentials.instanceId = "your instance id";
            credentials.endpoint = "your endpoint";
            credentials.project = "your project";
            credentials.accessKeyId = "your access key id";
            credentials.accessKeySecret = "your access key secret";
    
            SLSAndroid.initialize(
                this,
                credentials,
                configuration -> {
                    // 开启崩溃捕获功能。
                    configuration.enableCrashReporter = true;
                    // 开启卡顿监控功能。
                    configuration.enableBlockDetection = true;
                }
            );
        }
    
    }
    • Credentials
      Credentials类定义了关键的配置字段。
      类型 字段 示例值 说明
      配置参数 instanceId sls-****d60f 您在日志服务移动运维监控平台上所添加的应用ID。更多信息,请参见获取应用ID
      endpoint https://cn-hangzhou.log.aliyuncs.com 日志服务Project的访问域名,此处必须添加https://前缀。如何获取,请参见公网服务入口
      重要 只支持公网服务入口。
      project sls-ayasls-demo 您在日志服务移动运维监控平台上添加应用时所绑定的日志服务Project。更多信息,请参见添加应用
      鉴权参数 accessKeyId LTAI****eYDw 日志服务Project的AccessKey ID。如何获取,请参见访问密钥
      accessKeySecret lrRq****GOVM 日志服务Project的AccessKey Secret。如何获取,请参见访问密钥
      securityToken 124f****a369 日志服务Project的访问密钥Token。使用STS方式接入时,需要配置。如何获取,请参见AssumeRole
    • SLSAndroid

      SLSAndroid类提供了SDK初始化相关的全部参数配置、用户信息配置等接口。

      类型 字段或方法 说明
      调试方法 setLogLevel 配置SDK的日志等级。可选值为Log.VERBOSE、Log.DEBUG、Log.INFO、Log.WARN和Log.ERROR。
      凭证更新 setCredentials 更新Credentials凭证信息,支持热更新。
      配置方法 setUserInfo 更新用户信息。
    • Configuration
      Configuration类提供了SDK初始化额外参数配置的接口。
      类型 字段/方法 说明
      配置方法 enableCrashReporter 是否启用崩溃捕获功能。
      enableBlockDetection 是否开启卡顿监控功能。
      spanProvider 自定义Span的Resource和Attribute信息。
      环境配置 env App的环境信息,默认为default。

      一般开发环境配置为dev;线上环境配置为prod。

  3. 通过STS方式配置credentials.accessKeyIdcredentials.accessKeySecretcredentials.securityToken
    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            Credentials credentials = new Credentials();
            // instanceId为必填参数。
            credentials.instanceId = "your instance id";
            // 以下参数可不填。
            credentials.endpoint = "your endpoint";
            credentials.project = "your project";
            credentials.accessKeyId = "your access key id";
            credentials.accessKeySecret = "your access key secret";
    
            SLSAndroid.initialize(
                this,
                credentials,
                configuration -> {
                    // 开启崩溃捕获功能。
                    configuration.enableCrashReporter = true;
                    // 开启卡顿监控功能。
                    configuration.enableBlockDetection = true;
                }
            );
        }
    
        // 获取请求相关信息后,可调用如下接口。
        private void onUpdateSLS() {
            Credentials credentials = new Credentials();
    
            // (可选)更新AccessKey。
            credentials.accessKeyId = "your access key id";
            credentials.accessKeySecret = "your access key secret";
            credentials.securityToken = "your access security token";
    
            // (可选)更新Project等信息。
            credentials.endpoint = "your endpoint";
            credentials.project = "your project";
    
            SLSAndroid.setCredentials(credentials);
        }
    
    }

步骤五:接入验证

  1. 在MyApplication.onCreate方法中,配置SLSAndroid.setLogLevel(Log.DEBUG);,打开插件的日志开关。
    更多信息,请参见步骤四:配置接入服务
  2. 编写测试代码,模拟或触发移动端崩溃。
    常见的崩溃模式方式如下:
    • 空指针
      private void crashInJavaNull() {
          String nullStr = "1";
          if (nullStr.equals("1")) {
              nullStr = null;
          }
          nullStr.equals("");
      }
    • 类型转换异常
      private void crashInJavaClassCast() {
          View view = new View(this);
          TextView text = (TextView)view;
      }
    • 越界异常
      private void crashInJavaOutOfBounds() {
          new ArrayList<>(10).get(11);
      }
    • native crash
      JNIBridge.nativeCrash(0, 0);
    • native abort
      JNIBridge.nativeCrash(2, 0);
    • ANR
      while (true) {
          try {
              Thread.sleep(1);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
      }
  3. 重启移动端,然后等待大概2分钟后,您可以在日志服务控制台的目标Logstore中查看崩溃信息。
    在目标移动运维监控实例的自定义查询页面,单击查询/分析。如果显示有日志,则表示接入数据成功。查看日志

后续步骤