使用Gradle 3.1.1时部分compileOnly依赖报错:提示不支持该配置
这个问题我之前踩过坑,核心原因其实很明确:Android Gradle Plugin(AGP)3.x版本对compileOnly的支持有严格局限——compileOnly(也就是旧版的provided)仅适用于纯Java依赖,完全不支持Android Library类型的依赖(比如Stetho这类第三方Android库)。这类依赖包含Android特有的资源、Manifest清单、R类生成等内容,compileOnly模式下AGP不会处理这些环节,直接就触发了编译错误。
至于com.android.support:support-v4:27.1.1能正常工作,大概率是AGP对官方支持库做了特殊兼容处理,或者你的项目里已经有其他依赖通过implementation等方式引入了它的编译时必要资源,所以没触发报错。
给你几个可行的解决方案,按需选就行:
方案1:改用implementation依赖(最简单直接)
如果你的项目需要在运行时用Stetho(比如调试阶段需要它的调试功能),直接把compileOnly替换成implementation:
implementation "com.facebook.stetho:stetho:1.5.0"
这样AGP会正常处理Stetho的资源和Manifest,编译不会报错,同时Stetho会被打包进APK。要是你只想在调试环境用它,还可以限定变体:
debugImplementation "com.facebook.stetho:stetho:1.5.0"
这样release包不会包含Stetho,也不会有编译错误。
方案2:手动引入纯Jar包(适合仅需Java类的场景)
如果你确实不需要Stetho的Android资源和Manifest,只是编译时用到它的Java类,可以手动下载Stetho的纯Jar包(不带Android资源的版本),放到项目的libs目录,然后用compileOnly引入:
compileOnly files('libs/stetho-1.5.0.jar')
注意:这种方式会丢失Stetho的Android相关功能(比如调试界面、Manifest注册的组件),如果你的场景不需要这些可以用。
方案3:升级Android Gradle Plugin版本(长期解决方案)
AGP在后续版本(比如3.2+)中对compileOnly支持Android库的逻辑做了优化,虽然不是完全放开限制,但部分场景下可以正常使用。如果你的项目允许升级AGP,可以尝试把com.android.tools.build:gradle升级到3.2.0或更高版本,再测试compileOnly引入Stetho是否正常。
补充说明
别混淆compileOnly的适用场景:它的设计初衷是用于纯Java工具类、注解处理器这类不需要打包进APK,且编译时仅需代码的依赖。对于包含Android资源、组件的依赖,AGP 3.x版本不建议用compileOnly,优先用implementation或变体限定的依赖方式。
内容的提问来源于stack exchange,提问作者Emanuel Moecklin

