将Android Kotlin项目targetSdkVersion从25迁移至27的自动修复咨询
自动修复targetSdkVersion 27升级的两大代码变更问题
嘿,刚好之前帮团队处理过类似的大规模targetSdk升级问题,完全不用手动挨个修改,Android Studio自带的工具和正则替换就能帮你快速搞定这两个问题:
1. 一键修复findViewById()的泛型签名变更
针对findViewById()需要添加泛型类型的问题,有两个省心的办法:
方案一:用IDE代码检查批量修复
这是最精准的方式,能自动匹配每个findViewById对应的视图类型:- 打开项目后,点击顶部菜单栏的
Analyze > Inspect Code - 检查范围选整个项目,点OK运行检查
- 检查完成后,在结果面板里找到
Kotlin > Casts > Unchecked cast(就是那些没有用泛型、直接强转findViewById结果的代码) - 右键点这个检查结果,选
Apply Fix > Replace with findViewById<Type>,IDE会自动给所有符合条件的代码加上正确的泛型
- 打开项目后,点击顶部菜单栏的
方案二:正则批量替换(适合快速统一处理)
如果你的代码里大多是findViewById(R.id.xxx) as TextView这种强转写法,直接用批量替换:- 按快捷键
Ctrl+Shift+R(Mac是Cmd+Shift+R)打开Replace in Path - 查找框输入正则:
findViewById\((.*?)\) as (\w+) - 替换框输入:
findViewById<$2>($1) - 勾选
Regex选项,先预览确认没问题,再点Replace All
- 按快捷键
2. 快速处理FragmentgetContext()的空安全问题
这里不仅有你需要的加!!的方法,还推荐更规范的替代方案:
方案一:批量给
getContext()加!!
同样用Replace in Path:- 打开替换面板后,查找框输入正则:
getContext\(\) - 替换框输入:
getContext()!! - 勾选
Regex,预览时注意避开那些本来就需要空判断的场景,确认后替换
- 打开替换面板后,查找框输入正则:
方案二:替换为更安全的
requireContext()(强烈推荐)
其实Kotlin官方更推荐用requireContext()代替getContext()!!——它在context为空时会抛出清晰的异常,比直接加!!更符合空安全规范。批量替换的话:- 查找框输入:
getContext\(\)!! - 替换框输入:
requireContext()
如果你确定所有调用getContext()的场景下context都不会为空,也可以直接把所有getContext()替换成requireContext()
- 查找框输入:
方案三:代码检查批量修复
运行Inspect Code后,找到Kotlin > Nullability > Nullable receiver is accessed as non-null,右键选择批量修复,IDE会自动给所有getContext()调用加上!!,或者提示你替换成requireContext()
最后提醒
- 批量操作前一定要先把代码提交到Git之类的版本控制工具,万一误替换能快速回滚
- 替换完记得跑一遍项目的单元测试和UI测试,确保没引入新问题
内容的提问来源于stack exchange,提问作者GuessWho
相关产品推荐
相关产品推荐

