前言
最近在将项目适配到Android 15(API 35)的过程中,遇到了不少"坑",整个过程耗时近半年。本文将分享我在适配过程中遇到的三个典型问题及解决方案,希望能帮助正在或即将进行适配的开发者少走弯路。
同行有没有好的方案,分享一下,我之前是一个类一个类的改, 太耗时了。
环境升级
首先,我更新了开发环境:
- Gradle插件版本:8.7.2
- Gradle版本:8.9
- Kotlin版本:2.1.0
问题一:资源引用需要全限定名
现象: 添加namespace后,所有资源引用都需要使用全限定名(Fully Qualified Name),例如:
// 旧代码
titleBar.setRightBtn2Color(ResourceUtils.getColor(R.color.day_mode_text_color3_999999))
// 新代码
titleBar.setRightBtn2Color(ResourceUtils.getColor(com.wallstreetcn.baseui.R.color.day_mode_text_color3_999999))
原因: 这是Android Gradle Plugin 8.0+引入的变更,旨在提高模块化项目的资源隔离性。
解决方案:
- 批量替换所有资源引用为全限定名
- 使用Android Studio的"Find Usages"功能确保不遗漏任何引用
问题二:ButterKnife无法使用
现象: ButterKnife的R2文件无法生成,官方已明确推荐迁移到ViewBinding。
旧代码示例:
@BindView(R2.id.edit)
lateinit var edit: CustomTextView
// ...其他绑定
迁移方案:
- 使用ViewBinding重构:
private lateinit var binding: AuthorActivityMainBinding
override fun doGetContentView(): View {
if (binding == null) binding = AuthorActivityMainBinding.inflate(layoutInflater)
return binding.root
}
- 对于大型项目,建议:
- 分模块逐步迁移
- 编写脚本辅助批量替换
- 建立代码审查机制确保迁移质量
问题三:kotlin-android-extensions插件废弃
现象: 直接通过控件ID访问视图的方式不再可用,编译报错。
原因: Google已正式废弃kotlin-android-extensions插件,推荐使用ViewBinding替代。
迁移方案:
- 移除build.gradle中的kotlin-android-extensions插件
- 启用ViewBinding:
android {
buildFeatures {
viewBinding true
}
}
- 重构代码,使用生成的Binding类访问视图
适配建议
- 分阶段迁移:不要试图一次性完成所有适配,可按模块或功能逐步推进
- 自动化工具:利用IDE的批量替换和正则表达式搜索功能
- 测试覆盖:确保每个修改点都有对应的测试用例
- 团队协作:建立适配规范和代码审查流程
总结
Android 15适配确实是一项耗时的工作,特别是对于使用了ButterKnife和kotlin-android-extensions的老项目。但这也是一个优化代码结构、提升应用性能的好机会。ViewBinding不仅解决了当前的问题,还带来了类型安全和空安全等优势。
希望我的经验能对大家有所帮助。如果你在适配过程中遇到了其他问题或有更好的解决方案,欢迎在评论区分享讨论!