Apm plugin依赖字节基础库ByteX,ByteX当前还不兼容AGP7.2以上的版本。
如果业务使用AGP不兼容版本,可以尝试降低成兼容版本:
AGP插件版本 | 所需的Gradle版本 | 测试兼容性 |
---|---|---|
3.0.0+ | 4.1+ | yes |
3.1.0+ | 4.4+ | yes |
3.2.0 - 3.2.1 | 4.6+ | yes |
3.3.0 - 3.3.3 | 4.10.1+ | yes |
3.4.0 - 3.4.3 | 5.1.1+ | yes |
3.5.0 - 3.5.4 | 5.4.1+ | yes |
3.6.0 - 3.6.4 | 5.6.4+ | yes |
4.0.0+ | 6.1.1+ | yes |
4.1.0+ | 6.5+ | yes |
4.2.0+ | 6.7.1+ | yes |
7.0.2 | 7.1.1 | yes |
您也可以直接使用非插桩方式接入,具体请参见如何根据非插桩方案接入监控能力?。
升级到最新版本(最低1.3.2版本),在gradle.properties配置如下:
bytex.forbidUseLenientMutationDuringGetArtifact=true
java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: Failed to resolve class module-info.class
升级到最新版本(最低1.3.2版本),在gradle.properties
配置如下:
bytex.enableDuplicateClassCheck=false
在gradle.properties
中添加:
bytex.ASM_API=ASM7
在gradle.properties
配置如下:
bytex.forbidUseLenientMutationDuringGetArtifact=true
以腾讯云为例:
腾讯云有强类型判断,插桩后上传视频有异常日志。可以配置腾讯包名的插桩黑名单:
ApmPlugin { // 只对白名单下的包进行插桩 whiteList = [ "com" ] //黑名单包下类不进行插桩,可以配置不插桩的包名和类名 blackList = [ "com.tencent" ] }
Caused by: java.lang.RuntimeException: Failed to resolve class a/a/a/a/a.class[ transform input: /E:\a_e\bbb\libs\read.jar!a/a/a/a/a.class project input: /E:\a_e\bbb\libs\ read.jar!a/a/a/a/a.class aar input:not found] at com.ss.android.ugc.bytex.common.processor.ClassFileAnalyzer.handle(ClassFileAnalyzer.java:113) at com.ss.android.ugc.bytex.transformer.processor.ClassFileProcessor.process(ClassFileProcessor.java:27) Caused by: java.lang.ArrayIndexOutOfBoundsException
对于这种crash,主要是由于ASM在处理某些class文件时抛了异常。由于ByteX是强制抛出所有构建异常的,所以要过滤这些异常,需要额外地配置白名单,不做修改原始输出。
app/build/ByteX
目录里。bytex_whitelist.txt
的文件,文件内容是多条正则表达式(多条表达式之间用回车换行符来分隔),用来过滤ASM处理报错的class文件。a/a/a/a/a.class
可以配置为a/a/a/a/+
。gradle.properties
文件里,添加属性:bytex.globalIgnoreClassList=bytex_whitelist.txt
。属性内容就是白名单文件相对于项目根目录的相对路径。如果apm plugin异常,可以把apm plugin放在第一个行首先编译处理:
apply plugin: 'com.android.application' apply plugin: 'apm-plugin'//放到application后面第一个 apply plugin: 'xxxx'
如果第三方插件异常,可以把apm plugin放在最后一行:
apply plugin: 'com.android.application' apply plugin: 'xxxx' apply plugin: 'apm-plugin'//放到最后一个处理字节码
插桩是为了方便业务接入网络、启动功能。如果依然无法解决,可以通过非插桩的方案接入监控能力。具体请参见如何根据非插桩方案接入监控能力?。