使用Hilt框架的Android项目如何查找未使用类
Hilt项目精准查找未使用类的可行方案
Android Studio默认的Unused declaration检查会把Hilt编译期生成的XXX_GeneratedInjector、Hilt_XXX等类的引用判定为有效引用,确实会漏报大量真正未被使用的手写类,可以通过以下几个方案组合解决:
调整IDE检查规则,过滤Hilt生成代码干扰
打开IDE设置路径Settings/Preferences -> Editor -> Inspections -> Java -> Declaration redundancy -> Unused declaration做两处配置:- 修改检查的作用域,将
app/build/generated、各业务模块下的build/generated目录排除在引用分析范围之外,避免生成代码的假引用干扰结果 - 在检查配置的
Entry points标签页,将Hilt核心注解标记的元素手动添加为入口点,避免误判:包括@HiltAndroidApp标注的Application类、@AndroidEntryPoint标注的Android组件、@Module+@InstallIn标注的模块类、带@Inject构造器的公开类、@EntryPoint标注的接口,这些类本身不会被手写业务代码显式引用,是Hilt直接调用的入口。
- 修改检查的作用域,将
用R8代码收缩输出做高可信度校验
这是准确率最高的方案,R8在构建release包时会遍历完整的代码引用链(包括Hilt注解处理后的所有真实引用关系),不会被无效的生成类引用误导。配置方式很简单:- 在对应模块的
build.gradle中开启release构建的代码收缩:
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } }- 注意不要在ProGuard规则中添加
-keep class 你的包名.**这类全局keep规则,否则会导致代码收缩失效 - 执行一次全量release构建后,查看
build/outputs/mapping/release/usage.txt文件,文件中列出的所有类、方法、字段就是R8判定为完全无有效引用、最终会被移除的代码,可信度远高于IDE静态检查。
- 在对应模块的
交叉校验过滤误判
拿到IDE检查结果和R8输出的列表后,做两轮过滤排除特殊场景:- 过滤在
AndroidManifest.xml、导航图XML、布局XML中被引用的类(比如声明在Manifest里的四大组件、布局里引用的自定义View) - 过滤通过反射被调用的类(比如路由框架注册的页面类、序列化用的实体类)
- 过滤被Hilt模块真实提供依赖的类:如果一个类在
@Module标注的类中被@Provides/@Binds方法返回,且该依赖在依赖图中存在请求点,就算没有显式业务代码引用也是被使用的。
- 过滤在
删除前的最终验证
所有标记为待删除的类,先临时注释/删除类的全部代码,执行全量debug+release构建,再跑一遍核心业务路径的Monkey测试,确认没有编译错误、没有运行时类找不到的崩溃,再做最终移除。
不要依赖单一工具的检查结果,静态检查永远无法覆盖所有反射、资源引用的场景,交叉验证+构建运行验证是避免误删的最稳妥手段。
内容的提问来源于stack exchange,提问作者RedSIght
相关产品推荐
相关产品推荐

