Android Studio及JDK升级后ButterKnife编译异常的正规方案咨询
正规解决办法
1. 升级ButterKnife到最新兼容版本
ButterKnife后期版本(如10.2.3)已经修复了JDK模块化下的内部API访问问题。直接在app级build.gradle里更新依赖:
dependencies { implementation 'com.jakewharton:butterknife:10.2.3' annotationProcessor 'com.jakewharton:butterknife-compiler:10.2.3' }
同步项目后重新编译,只要版本适配就能解决这个错误。
2. 换成官方ViewBinding(推荐长期方案)
毕竟ButterKnife早已停止维护,官方现在推荐用ViewBinding替代,这是Android Jetpack自带的原生视图绑定方案,无需依赖第三方库,还能完美适配新版JDK和Android Studio:
开启ViewBinding
在app级build.gradle的android块中添加配置:
android { ... buildFeatures { viewBinding true } }
替换ButterKnife代码
原ButterKnife写法:
public class MainActivity extends AppCompatActivity { @BindView(R.id.text_view) TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); textView.setText("Hello"); } }
改成ViewBinding写法:
public class MainActivity extends AppCompatActivity { private ActivityMainBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); setContentView(binding.getRoot()); binding.textView.setText("Hello"); } }
ViewBinding会自动为每个布局文件生成对应的绑定类(比如activity_main.xml对应ActivityMainBinding),类型安全且无需手动编写注解,彻底避开第三方库的兼容性坑。
3. 适配JDK模块化规则(不推荐,仅临时过渡)
要是暂时没法升级或替换,也能通过JVM参数开放内部API访问——就是你之前找到的临时办法,本质是绕开模块化检查,并非长期正规方案:
android { ... tasks.withType(JavaCompile) { options.compilerArgs += [ '--add-exports', 'jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED', '--add-exports', 'jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED' ] } }
内容的提问来源于stack exchange,提问作者C0D3M0N
相关产品推荐
相关产品推荐

