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

前提条件

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

步骤一:引入库文件

您需要添加如下依赖。
dependencies {
    // Gradle 3.0之后版本,请使用implementation。
    // 指定最新的SDK版本号。
    compile 'com.aliyun.openservices:aliyun-log-android-sdk:bricks_1.0.1' 
    compile 'com.aliyun.openservices:alysls-android-crashreporter:1.1.1' 
}
接入Android应用数据所涉及的依赖包说明如下表所示。
库文件 说明
aliyun-log-android-sdk 核心SDK,用于采集Android应用的数据到日志服务。
alysls-android-crashreporter 稳定性数据采集SDK,支持采集Java、native、ANR异常信息。CrashReporter支持Maven中央仓库

步骤二:配置权限

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.* { *; }

步骤四:配置接入服务

  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();
            
            SLSConfig config = new SLSConfig(this);
            config.debuggable = true;
            config.endpoint = endpoint;
            config.accessKeyId = accesskeyid;
            config.accessKeySecret = accesskeysecret;
            config.pluginAppId = pluginAppId;
            config.pluginLogproject = pluginLogproject;
            // 根据集成情况,自主开启日志开关。
            // config.debuggable = true;
            
            final SLSAdapter slsAdapter = SLSAdapter.getInstance();
            slsAdapter.addPlugin(new SLSCrashReporterPlugin());
            slsAdapter.init(config);
        }
    
    }
    • SLSConfig
      SLSConfig类定义了关键的配置字段。
      类型 字段 示例值 说明
      调试参数 debuggable true 是否调试日志信息。
      说明 发布时,建议关闭,即配置为config.debuggable = false。
      配置参数 appVersion App版本号。建议保持默认配置。
      appName App名称。建议保持默认配置。
      配置参数 endpoint cn-hangzhou.log.aliyuncs.com 日志服务Project所属的Endpoint。如何获取,请参见公网服务入口
      注意 只支持公网服务入口。
      accessKeyId LTAI****eYDw 日志服务Project的AccessKey ID。如何获取,请参见访问密钥
      accessKeySecret lrRq****GOVM 日志服务Project的AccessKey Secret。如何获取,请参见访问密钥
      securityToken 124f****a369 日志服务Project的访问密钥Token。使用STS方式接入时,需要配置。如何获取,请参见AssumeRole
      pluginAppId sls-****d60f 您在日志服务移动运维监控平台上所添加的应用ID。更多信息,请参见获取应用ID
      pluginLogproject sls-ayasls-demo 您在日志服务移动运维监控平台上添加应用时所绑定的日志服务Project。更多信息,请参见添加应用
      自定义参数 channel Google 自定义参数,App渠道号。
      channelName Google 自定义参数,App渠道名称。
      userNick Tom 自定义参数,用户昵称。
      longLoginNick Tom 自定义参数,用户昵称,最后一次登录的用户昵称。
      userId 423423 自定义参数,用户ID。
      longLoginUserId 423423 自定义参数,用户ID,最后一次登录的用户ID。
      loginType pswd 自定义参数,用户登录类型。
      业务参数 slsConfig.addCustom("customKey", "customValue"); slsConfig.addCustom("action_name", "click");slsConfig.addCustom("action_args", "detail_id:243434"); 用于添加业务参数,键值对形式。
      • customKey:参数名。
      • customValue:参数值。
    • SLSAdapter
      SLSAdapter类是插件的管理类。
      方法 说明
      getInstance() 返回SLSAdapter单例。
      addPlugin(plugin) 增加一个插件。
      init(slsConfig) 初始化所有插件。
      注意 init()方法会初始化所有的插件,请勿单独调用插件的init()方法。调用init()方法前,需先调用addPlugin()方法。
      resetSecurityToken(accessKeyId, accessKeySecret, securityToken) 更新STS token。
      注意 resetSecurityToken()或updateConfig()需要在调用initWithSLSConfig方法后再调用。
      updateConfig(slsConfig) 更新SLSConfig配置信息,仅限自定义参数。
  3. 通过STS方式配置config.accessKeyIdconfig.accessKeySecretconfig.accessKeySecret
    public class MyApplication extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
            
            SLSConfig config = new SLSConfig(this);
            config.endpoint = endpoint;
            
            // 初始化时,传入STS AccessKey信息。
            config.accessKeyId = accesskeyid;
            config.accessKeySecret = accesskeysecret;
            config.accessKeySecret = securityToken;
            
            config.pluginAppId = pluginAppId;
            config.pluginLogproject = pluginLogproject;
            
            final SLSAdapter slsAdapter = SLSAdapter.getInstance();
            slsAdapter.addPlugin(new SLSCrashReporterPlugin());
            slsAdapter.init(config);
            
            // token过期后,请及时更新SLSAdapter的token。
            slsAdapter.resetSecurityToken(accesskeyid, accesskeysecret, securityToken);1
        }
    
    }

步骤五:接入验证

  1. 在MyApplication.onCreate方法中,配置config.debuggable = true,打开插件的日志开关。
    更多信息,请参见步骤四:配置接入服务
  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分钟后,您可以在控制台查看是否显示崩溃信息。
    如果显示崩溃数据,则表示SDK接入成功。

后续步骤