升级Gradle Plugin至3.1.0及Gradle至4.4后低API设备运行报错
先梳理下你的场景:
你完成了以下Gradle相关升级操作:
- 将项目根目录
build.gradle中的Android Gradle Plugin从3.0.1升级到3.1.0:classpath 'com.android.tools.build:gradle:3.1.0' - 将
gradle-wrapper.properties中的Gradle版本从4.1升级到4.4:distributionUrl=https://services.gradle.org/distributions/gradle-4.4-all.zip - 删除了app模块
build.gradle中的buildToolsVersion "26.0.2"配置
升级后在API级别低于23的虚拟设备运行时,触发了未找到android/view/View$OnScrollChangeListener的字节码错误。这个问题的核心原因是**View.OnScrollChangeListener是Android API 23才新增的接口**,低版本系统原生不支持,而升级AGP后构建逻辑的兼容性处理变化,加上Instant Run的参与,导致问题暴露。
下面是几个可行的解决方案,你可以按顺序尝试:
1. 启用Desugar兼容性处理
Android Gradle Plugin 3.0及以上支持Desugar工具,它能把高版本API的代码转换为兼容低版本的实现,完美解决这类API缺失问题。在app模块的build.gradle中添加以下配置:
android { compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5' }
添加后同步项目,重新构建运行,大部分情况下这个配置就能解决问题。
2. 检查并替换代码中的直接调用
如果你的代码里直接使用了View.OnScrollChangeListener,可以通过版本判断做兼容处理:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { view.setOnScrollChangeListener(new View.OnScrollChangeListener() { @Override public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) { // 你的滚动逻辑 } }); } else { // 针对API<23的设备,使用对应替代方案,比如ListView的OnScrollListener }
如果是第三方依赖库用到了这个接口,那Desugar方案会更合适,毕竟你没法修改依赖的代码。
3. 暂时关闭Instant Run
错误发生在transformClassesWithInstantRunForJiveDailyMIPackDebug任务中,说明Instant Run可能和兼容性处理存在冲突。你可以通过以下步骤关闭:
- 打开Android Studio的
File > Settings > Build, Execution, Deployment > Instant Run - 取消勾选
Enable Instant Run to hot swap code/resource changes on deploy - 重新构建并运行项目
4. 明确指定Build Tools版本
虽然AGP 3.0+可以自动匹配Build Tools版本,但有时候自动匹配的版本可能存在兼容性问题。你可以在app模块的build.gradle中重新指定和AGP 3.1.0兼容的版本,比如:
android { buildToolsVersion "27.0.3" // 其他配置... }
AGP 3.1.0推荐搭配27.x系列的Build Tools版本,选合适的版本后同步项目即可。
内容的提问来源于stack exchange,提问作者Michael Haas

