Android Studio中标记第三方库函数为废弃/禁用的简易方法
无需自定义静态检查规则的第三方方法禁用方案
完全适配Java/Kotlin混编的AndroidX项目,不需要修改第三方库源码,可实现IDE实时标记违规调用、触发构建中断,全程不需要编写自定义lint、detekt、ktlint规则。
方案1:AGP内置Lint拦截(最推荐,零代码)
AGP 7.0及以上版本内置的Lint检查自带API拦截能力,只需要修改配置文件即可生效,IDE提示、构建拦截体验和原生Lint检查完全一致:
- 在项目根目录或对应业务模块的根目录下创建/修改
lint.xml配置文件 - 开启内置的
BlockedApi检查项,指定要拦截的方法全限定名,将严重级别设为error,同时开启错误中断构建配置
示例配置:
<?xml version="1.0" encoding="UTF-8"?> <lint> <!-- 将内置API拦截规则级别设为error,触发构建中断 --> <issue id="BlockedApi" severity="error"> <!-- 配置要拦截的方法列表,多个方法用分号分隔 格式:全限定类名#方法名(参数全限定类名) 无参方法直接写空括号,要拦截类下所有同名重载方法可省略括号和参数 --> <option name="blockedApis" value="com.example.thirdlib.ThirdPartyClass#foo();"/> </issue> <!-- 配置Lint检测到error级问题直接终止构建,release构建默认已开启该配置 --> <option name="abortOnError" value="true"/> </lint>
配置完成后同步项目,Android Studio会直接在所有调用被禁方法的位置标红,执行assemble、lint等Gradle任务时,只要检测到违规调用就会直接抛错终止构建。该方案仅做静态检查,不会拦截反射调用。
方案2:字节码编译期扫描兜底(防反射绕过)
如果需要100%拦截包括反射在内的所有调用场景,不需要写自定义规则,直接引入现成的字节码扫描类Gradle插件,在模块级build.gradle中配置要拦截的方法全限定名列表即可:
- 插件会在编译期扫描所有class字节码(包括第三方依赖传入的调用逻辑),匹配到目标方法调用(包括反射调用的字符串特征)就直接抛错终止编译
- 这类插件原生支持Java/Kotlin混编,配置量仅需几行,不需要额外开发规则。
方案3:同路径类覆盖(适合小型项目快速配置)
如果需要拦截的方法数量很少,可以直接在项目源码中创建和第三方类完全同包名、同类名的类,仅编写需要禁用的方法签名,将方法标记为编译期错误即可:
- 比如要拦截
com.example.thirdlib.ThirdPartyClass的无参方法foo(),就在项目的java/kotlin源码目录下新建对应包路径的ThirdPartyClass文件 - 在类中编写
foo()方法的空实现,Kotlin场景给方法加@Deprecated(message = "禁止调用该方法", level = DeprecationLevel.ERROR)注解;Java场景给方法加@Deprecated注解,同时配置编译器参数-Werror将废弃警告升级为编译错误
注意:该方案不要覆盖第三方类的其他非禁用方法,否则会影响第三方库正常逻辑;如果第三方库开启了混淆类名,该方案不生效,优先选择方案1。
内容的提问来源于stack exchange,提问作者msung
相关产品推荐
相关产品推荐

