Android端接入NewRelic第三方性能监测框架

newRelic简介

newRelic是一款国外产品,类似于国内的监控平台: OneAPM 和 听云 ,在Android平台上提供crash监控,网络请求监控,app启动次数等,如果你对国内的监控平台了解的话,功能基本类似,所以接入方式也几乎一样。但是商业版很贵~~,所以我们后续又换了国内的听云,这里仅做一下记录。

AndroidStudio Gradle方式接入

账号注册申请就不多言了。

在账号申请完毕后,我们点击网站的Mobile选项卡,点击右下角的 Add a new app,可以创建我们自己app,如图
创建完我们的app后,我们会获得一个appToken,有了这个appToken后,就可以进行newRelic的接入了
在这里插入图片描述
在项目及的build.gradle中添加以下代码

buildscript {
  repositories {
    mavenCentral()
  }

  dependencies {
    classpath "com.newrelic.agent.android:agent-gradle-plugin:5.+"
  }
}

在app下的build.gradle中

repositories {
  mavenCentral()
}

apply plugin: 'android'
apply plugin: 'newrelic'

dependencies {
  implementation "com.newrelic.agent.android:android-agent:5.+"
}

在manifest中添加权限



在你的默认启动Activity中

NewRelic.withApplicationToken("你的appToken").start(this.getApplication());

注:官方推荐在defaultActivity中嵌入监测代码,官方说并不支持在其他class中嵌入监测代码,说可能会引起其他一些问题或者不稳定,
在这里插入图片描述
但是国内的很多都是在Application中,所以我就索性写在了application中,并没有遇到问题,所以目前先这样
到这里差不多就结束了,但是我们可能还需要防混淆,所以
在app目录下新建newrelic.properties文件,添加如下代码

com.newrelic.application_token=你的appToken

在proguard.cfg, proguard-android.txt, proguard-rules.pro 等文件下添加

-keep class com.newrelic.** { *; }
-dontwarn com.newrelic.**
-keepattributes Exceptions, Signature, InnerClasses, LineNumberTable

到这里,就基本结束了,gradle编译一下等几分钟就可以在后台看到监测数据了
Android端接入NewRelic第三方性能监测框架_第1张图片

配置多properties方案

我们的app版本可能有多个版本,比如debug版本,release版本或者preRelease版本,如果用同一个appToken的话会不容易区分,所以我们需要在生成properties的时候动态的更改其中token的值,并在绑定appToken时候根据版本来绑定,所以这时候就需要一些gradle知识,在app的build.gradle 目录下

File newRelicProperties = new File("${project.projectDir.absolutePath}/newrelic.properties")
    newRelicProperties.createNewFile()

    //gradle build package name
    android.applicationVariants.all { variant ->
        def channelName
        variant.productFlavors.each { product ->
            channelName = product.name
        }
        variant.productFlavors.each { flavor ->
            def variantSuffix = variant.name.capitalize()
            def generateResourcesTask = project.tasks.getByName("compile${variantSuffix}Sources")
            def generatePropertiesTask = task("newRelicGenerateProperties${variantSuffix}") << {
                Properties properties = new Properties()
                properties.load(newRelicProperties.newDataInputStream())
                properties.setProperty("com.newrelic.application_token", flavor.manifestPlaceholders.newRelicAppToken)
                properties.store(newRelicProperties.newWriter(), null)
            }
            generateResourcesTask.dependsOn generatePropertiesTask
        }
    }

在此之前我们要在 app 的build.gradle中的productFlavors下配置一下不同版本的的appToken,如下

 productFlavors {
        Debug {
            applicationId "xxx"
            manifestPlaceholders = [package_name : applicationId,
                                    JPUSH_PKGNAME: applicationId,
                                    JPUSH_APPKEY : "",
                                    JPUSH_CHANNEL: "staging",
                                    app_icon     : "@mipmap/icon_logo",
                                    extScheme    : "",
                                    app_icon     : "@mipmap/icon_logo",
                                    newRelicAppToken:"你的appToken"]
        }
release {
            applicationId "xxx"
            manifestPlaceholders = [package_name : applicationId,
                                    JPUSH_PKGNAME: applicationId,
                                    JPUSH_APPKEY : "",
                                    JPUSH_CHANNEL: "staging",
                                    app_icon     : "@mipmap/icon_logo",
                                    extScheme    : "",
                                    app_icon     : "@mipmap/icon_logo",
                                    newRelicAppToken:"你的appToken"]
        }
        }

主要是newRelicAppToken:"你的appToken" 这段代码

然后在manifest文件中配置一下meta-data文件

 

然后在application的onCreate方法中根据app版本,取不同的token,

private void initNewRelic(){
        //new Relic
        String appToken = "";//default release
        try {
            ApplicationInfo applicationInfo  = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
            if (applicationInfo != null) {
                appToken = applicationInfo.metaData.getString("newRelic_AppToken");
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        NewRelic.withApplicationToken(appToken).start(this);
    }

至此,就接入完毕了。

你可能感兴趣的:(安卓日常开发问题总结)