newRelic是一款国外产品,类似于国内的监控平台: OneAPM 和 听云 ,在Android平台上提供crash监控,网络请求监控,app启动次数等,如果你对国内的监控平台了解的话,功能基本类似,所以接入方式也几乎一样。但是商业版很贵~~,所以我们后续又换了国内的听云,这里仅做一下记录。
账号注册申请就不多言了。
在账号申请完毕后,我们点击网站的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编译一下等几分钟就可以在后台看到监测数据了
我们的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);
}
至此,就接入完毕了。