- 背景
今天在更新 ButterKnife 到最新版本的时候出现了一个问题,我引入的是 10.1.0 最新版本:
implementation 'com.jakewharton:butterknife:10.1.0' annotationProcessor 'com.jakewharton:butterknife-compiler:10.1.0'
在我更新后它报了一个错误:
Manifest merger failed : Attribute application@appComponentFactory value=(android.support.v4.app.CoreComponentFactory) from [com.android.support:support-compat:28.0.0] AndroidManifest.xml:22:18-91 is also present at [androidx.core:core:1.0.0] AndroidManifest.xml:22:18-86 value=(androidx.core.app.CoreComponentFactory).Suggestion: add 'tools:replace="android:appComponentFactory"' to element at AndroidManifest.xml:5:5-19:19 to override.
解决错误
对于这个问题,它也给出了提示,建议你在 AndroidManifest.xml 文件中直接加入 tools:replace="android:appComponentFactory"
但是添加了上面代码之后呢,又给你报了一个错误:
Manifest merger failed with multiple errors, see logs
于是搜索了一下,光有这一行代码还不够,必须还要添加一行,代码如下:
android:appComponentFactory="jasfljapsjpasf" ,这里填入任意字符串即可。
然后又报了这个错误,提示你说 api 的等级必须要在24及以上
Error: Static interface methods are only supported starting with Android N (--min-api 24): void butterknife.Unbinder.lambda$static$0()
所以你将 api 更改到 24 即可,操作位置如下图:
![62dc3efc132f519483d842ddfc4af891.png](https://i-blog.csdnimg.cn/blog_migrate/8277133987387c4e4c4e77cf7ba75c7e.jpeg)
然后再 sync 一下、或者 rebuild 一下项目就不会报错了。
更大的坑
你以为这样就可以运行了吗?不可能!
比如你在 Activity 中绑定控件的时候,又会报错:
Error: Invoke-customs are only supported starting with Android O (--min-api 26)
这个简单,好吧,我就把 api 改到 26 吧,然后在 sync 一下,它又给来了一个错误:
More than one file was found with OS independent path 'META-INF/androidx.core_core.version'
这个错误说你的 META-INF 目录下没有 androidx.core_core.version 这个东西,这个是什么东西?没见过啊,在下文我会再介绍这个 androidx,现在要紧的是解决这个问题,搜索了一下,只需在 gradle.properties 文件中加入两行代码即可:
android.useAndroidX=trueandroid.enableJetifier=true
具体位置是在 gradle.properties ,如图:
![91a695f32b25af7d207dcf53610a0791.png](https://i-blog.csdnimg.cn/blog_migrate/b7f085287302eff56ac63a582c2cf716.jpeg)
然后在 sync 一下,这样没有任何错误了。然后在 activity 中会报 :
import android.support.v7.app.AppCompatActivity; 不存在的问题,这时候你需要将这个 v7 包给移除,它会重新加入一个新的包,是 androidx 的包,如下:
import androidx.appcompat.app.AppCompatActivity;
那我就测试一下能否绑定 button 点击事件吧,不幸的是这里报了一个更大的错误:
java.lang.BootstrapMethodError: Exception from call site #1 bootstrap methodat butterknife.internal.DebouncingOnClickListener.(DebouncingOnClickListener.java:12)at com.xww.myapplication2.MainActivity_ViewBinding.(MainActivity_ViewBinding.java:34)at java.lang.reflect.Constructor.newInstance0(Native Method)at java.lang.reflect.Constructor.newInstance(Constructor.java:343)at butterknife.ButterKnife.bind(ButterKnife.java:170)at butterknife.ButterKnife.bind(ButterKnife.java:99)at com.xww.myapplication2.MainActivity.onCreate(MainActivity.java:27)at android.app.Activity.performCreate(Activity.java:7136)at android.app.Activity.performCreate(Activity.java:7127)at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)at android.os.Handler.dispatchMessage(Handler.java:106)at android.os.Looper.loop(Looper.java:193)at android.app.ActivityThread.main(ActivityThread.java:6669)at java.lang.reflect.Method.invoke(Native Method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
原因是:Caused by: java.lang.ClassCastException: Bootstrap method returned null
看我们在 Activity 中绑定事件的代码:
@OnClick(R.id.btn) void onShow() { Toast.makeText(this, "ddd