• 背景

今天在更新 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.] AndroidManifest.xml::- is also present at [androidx.core:core:1.0.] AndroidManifest.xml::- value=(androidx.core.app.CoreComponentFactory).

Suggestion: add 'tools:replace="android:appComponentFactory"' to <application> element at AndroidManifest.xml::-: 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 即可,操作位置如下图:

然后再 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=true
android.enableJetifier=true

具体位置是在 gradle.properties ,如图:

然后在 sync 一下,这样没有任何错误了。然后在 activity 中会报 :

那我就测试一下能否绑定 button 点击事件吧,不幸的是这里报了一个更大的错误:

java.lang.BootstrapMethodError: Exception from call site #1 bootstrap method

at butterknife.internal.DebouncingOnClickListener.<clinit>(DebouncingOnClickListener.java:12)

at com.xww.myapplication2.MainActivity_ViewBinding.<init>(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", Toast.LENGTH_SHORT).show();
}

问题是出在 @OnClick() 这个注解上,将这个注解删除或者替换成如下代码:

 btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "ddd", Toast.LENGTH_SHORT).show();
}
});

目前还没有找到解决方法,但是用这种非注解的方式去设置监听事件也失去了 butterknife 的意义了。所以呢,我们只能回退到 9.0 之前的版本了。搜索了半天,没有一个可以解决的办法,但是这个产生这个问题的原因倒是已经明了,想必你也想知道为什么会出现这么多错误,下面我们来看看原因。

AndroidX库

android.useAndroidX=true
android.enableJetifier=true

第一行,表示我们在项目中启用 androidx 这个库依赖,这就表示我们可以使用 androidx 库里的所有 api 了,那么到底什么是 androidx 呢?我们就得了解一下。

androidx 是 google 最新推出一种新的软件包结构,我们都知道 android.support 包,在 api28 之后的项目中,会将 android.support 全部替换为 androidx 包,也就是说我们之后开发都会使用或者慢慢的将项目过渡到这个版本上,而 google 也做出说明,会继续提供 api27 之前的 android support 包的支持和更新。

但是,google 还会将一些新的特性加入到 androidx 包中,但不会对 android support 包进行添加新特性,可见 google 只是给了我们一些过渡时间,在未来的日子里开发者都会陆续的更新到 androidx 包,那样 google 也没有必要对 support 进行维护了。

google 表示 support 包越来越臃肿,而且随着 api 版本的更新迭代,support 包也越发的令人难以通读。所以这才推出了 androidx 包,androidx 包将从 1.0 版本开始。

第二行,表示我们当前项目中如果有用到 androidx 包的话,就必须设置为 ture ,否者第三方库(比如:butterknife)就引入失败。之所以最新版本的 butterknife 需要 androidx 的支持,是因为 butterknife 的作者在其中添加了 androidx 包的支持,那种种错误的原因是因为:amdroidx 与 support 包两者无法共存,只能使用其中一种。

所以,以上我遭受的种种错误的原因就是这个 androidx 包导致的。当然了,软件更新是一件好事,我们可以体验最新的技术支持,蛋疼的是在项目中的第三方库都要随着版本的更新或需求的增加去更换新版本。更痛苦的是你会发现一些 support 包的支持都要替换为 androidx 包的支持。

以上就是对 androidx 包的一个基本了解,更多详细的内容请自己读官方说明文档。当然了,google 为了方便开发者升级到 androidx 包,在 Refactor(重构)按钮下设置了一键替换 androidx 包的方法,比如这样操作:

上面我只是做一个测试功能,我就不勾选备份了,在你的项目中,我建议你勾选备份,否则换版本时报错是非常痛苦的一件事。好了,我们可以看到在依赖中都被替换为 androidx 开头的库文件了,本篇文章就带你了解一下 androidx 以及在一些最新第三方库(butterknife、glide等)引入为什么会失败的原因,更多的惊喜就等待 google 官方提供给我们吧。

没有关注小编都没有动力更新文章了

各位看官给个关注呗

体验一下:AndroidX的更多相关文章

  1. Androidx初尝及其新旧包对照表

    x的最低实验条件 AndroidStudio 3.2.0+ gradle:gradle-4.6以上 本次实验条件: AndroidStudio 3.3 (强制要求最低gradle版本为gradle-4 ...

  2. Android UI体验之全屏沉浸式透明状态栏效果

    前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...

  3. 移动端之Android开发的几种方式的初步体验

    目前越来越多的移动端混合开发方式,下面列举的大多数我都略微的尝试过,就初步的认识写个简单的心得: 开发方式 开发环境 是否需要AndroidSDK 支持跨平台 开发语言&技能 MUI Win+ ...

  4. TODO:小程序开发过程之体验者

    TODO:小程序开发过程之体验者 1. 小程序开发过程,先下载开发者并安装开发者工具,现在腾讯开放测试了,普通用户也可以登录开发者工具,如图普通用户登录为调试类型,但是只能建立无AppID的项目 如果 ...

  5. 微信小程序体验(2):驴妈妈景区门票即买即游

    驴妈妈因为出色的运营能力,被腾讯选为首批小程序内测单位.驴妈妈的技术开发团队在很短的时间内完成了开发任务,并积极参与到张小龙团队的内测问题反馈.驴妈妈认为,移动互联网时代,微信是巨大的流量入口,也是旅 ...

  6. 一起学微软Power BI系列-使用技巧(3)Power BI安卓手机版安装与体验

    Power BI有手机版,目前支持安卓,苹果和WP,不过没有WP手机,苹果在国内还不能用,要FQ和用就不测试了.安卓的我也也是费了九牛二虎之力才把app下载下来,把方法分享给大家. FQ太麻烦,所以建 ...

  7. .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验

    不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...

  8. Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验

    Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...

  9. Xamarin+Prism开发详解三:Visual studio 2017 RC初体验

    Visual studio 2017 RC出来一段时间了,最近有时间就想安装试试,随带分享一下安装使用体验. 1,卸载visual studio 2015 虽然可以同时安装visual studio ...

随机推荐

  1. pycharm的补充

    pycharm 快捷键 tab自动补全 首行缩进 ctrl+?是全行加#进行注释 ctrl+d 复制上一行 ctrl +z 撤销 ctrl+shift+z 撤销的撤销 更改字体大小

  2. UI 组件 | Toggle

    Toggle(复选框)组件 Toggle 是一个 CheckBox,当它和 ToggleGroup 一起使用的时候,可以变成 RadioButton. 创建 Toggle 组件 层级管理器右击-> ...

  3. windows+appium自动化,Desired Capabilities参数填写,查看界面信息

    前言: 安装JDK并配置环境变量. 安装sdk并配置对应环境变量. 安装appium客户端. 手机打开开发者模式,并启用调试模式. 1.打开Appium客户端,点击Start Server V1.9. ...

  4. Vue+springboot管理系统

    About 此项目是vue+element-ui 快速开发的物资管理系统,后台用的java springBoot 所有数据都是从服务器实时获取的数据,具有登陆,注册,对数据进行管理,打印数据等功能 说 ...

  5. zookeeper的leader选举机制个人总结

    第一步:每个服务器都首先投自己,格式为<sid,zxid>: 第二步:然后将自己的投票以<sid,zxid>形式发送给其他服务器,这样每个服务器除了自己的投票,还有集群中除了自 ...

  6. 阿里分布式事务seata入门(采坑)

    1. 阿里分布式事务seata入门(采坑) 1.1. 前言 seata是feascar改名而来,这是阿里在19年年初开源出来的分布式事务框架,当初刚出来的时候就想研究下了,一直拖到了现在,目前是0.8 ...

  7. 如何比较装X地回答问题 | 面试系列.1

    公众号后台比较多同学让我写面试相关的文章,在<从面试官的角度谈谈大数据面试>也聊了很多,但是有同学吐槽说我没有把答案写上去,当时我的心里是拒绝写的,这有啥好写的,又不难,Google一大堆 ...

  8. Java异常机制及异常处理建议

    1.Java异常机制 异常指不期而至的各种状况,如:文件找不到.网络连接失败.非法参数等.异常是一个事件,它发生在程序运行期间,干扰了正常的指令流程.Java通过API中Throwable类的众多子类 ...

  9. JDBC之批量处理

    JDBC之批量处理 一.批量处理JDBC语句提高处理速度 当需要成批插入或者更新记录时.可以采用Java的批量更新机制,这一机制允许多条语句一次性提交给数据库批量处理.通常情况下比单独提交处理更有效率 ...

  10. MSIL实用指南-返回结果

    一个方法体执行完指令后,必须要完成调用并返回,这是要使用Ret指令.Ret指令的详细解释是从当前方法返回,并将返回值(如果存在)从被调用方的计算堆栈推送到调用方的计算堆栈上.就是说如果计算堆栈上没有变 ...