欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AndroidX引发的“血案”

程序员文章站 2022-03-13 16:46:05
...

AndroidX引发的“血案”

苦难磨炼一些人,也毁灭另一些人。——富勒

AndroidX的诞生

Google为什么要定制AndroidX方案呢?这个方案的定制的主要目的和作用是对遗留版本的Android library support的版本进行规整。比方说,Android support v4版本和Android appcompat v7版本,这两个包我想大部分的开发者都是接触过的,这里的4对应的其实就是Android sdk 4,对应的API版本是1.6,意思说的是,这个Android library support v4包是向下兼容到API 1.6版本,而v7自然就是对应的API 2.1的版本了。

AndroidX存在的意思?

这两个包历史存在的意义是什么呢?Google让他们存在的原因主要是因为很多的API并不是在Android出现的时候就有的,随着Android不断地发展,出现了很多新的API,比方说,Android3.0版本,这个版本是针对平板出的版本,在这个版本里提出了一个新的组件-fragment。这个组件可以拆分activity的结构,让页面更加的有条理。正是因为这个功能的优势,使得很多低版本的API也想去使用它,比方说1.6版本,那怎么办呢?于是就出现了Android library support v4包,这个包的作用就是向下兼容低版本的API,使得低版本的API也能使用类似高版本才能拥有的功能,不只是组件。

那么,AndroidX的意义是什么呢?随着Android版本不断的更迭,许多的新的API要不断的兼容老版本,而很多的老版本其实已经在市面上不多见了,但是这些v4,v7包依然还是去兼容老版本1.6,2.1其实是不太合理的,而且,我们经常会遇到版本不匹配的问题,导致有些三方库里用的v4版本或v7版本跟我们项目的冲突,使得项目错误混乱。因此Google就推出了AndroidX这个策略来解决这个问题。AndroidX推出后版本号从1.0开始记,之前的旧的策略不再进行维护,Google也吸取了之前经验,不再跟API的版本号挂钩命名support library。

如何迁移到AndroidX?

迁移到AndroidX很简单,Android studio提供了傻瓜式的操作方法,只需要对着你的项目名右击 → Refactor → Migrate to AndroidX,就会弹出如下图所示的窗口。AndroidX引发的“血案”
这里点击Migrate,Android Studio就会自动检查你项目中所有使用Android Support Library的地方,并将它们全部改成AndroidX中对应的库。另外Android Studio还会将你原来的项目备份成一个zip文件,这样即使迁移之后的代码出现了问题你还可以随时还原回之前的代码。

“血案”的发生

这个问题的产生是因为我的项目里集成了一个Android三方的库,这个库实质是不支持AndroidX的,而我自己的项目其实也是不支持AndroidX的,但是我自己的项目很好迁移,而一开始我也并不知道这个三方的库不支持AndroidX,我就这样把我的项目打包给业务方使用了,结果,业务方报出了一个问题。

“Failed to transform ‘C:\Users\sunshaochi.gradle\caches\modules-2\files-2.1\com.cardinfolink.smart.pos\PosSDK\2.4.1\268dff92bdc1203156a76ce134d8c1c2b38f29a2\PosSDK-2.4.1.aar’ using Jetifier. Reason: null. (Run with --stacktrace for more details.)”

因为我的项目是托管在我的私有maven上的,他们直接拉取的是我的aar包。但是就是因为这个三方的库不支持AndroidX,导致业务方就是拉不下来我的aar,还报了这个莫名其妙的错误。这个还是小问题,紧接着各种报红,各种提示。我的天,我接到他们的求助的时候我自己也傻眼了,我没干啥啊,我的天这是怎么回事啊?

我通查了整个项目通过比对我发现了正常项目与非正常项目的差异,就是AndroidX的迁移。是的,这个是关键点!我通过修改项目下的gradlr.properties文件里的配置解决了问题。

android.useAndroidX=true
# Automatically convert third-party libraries to use AndroidX
android.enableJetifier=true

enableJetifier注释的解释是说,当这个字段设置为true的时候,自动会将三方的依赖库迁移到AndroidX,这个功能很imba,但是也会出现问题,就是当你的三方依赖库有不支持AndroidX的库的情况下,就会出问题。

AndroidX和Android Support Library中的库是非常不建议混合在一起使用的,因为它们可能会产生很多不兼容的问题。最好的做法是,要么全部使用AndroidX中的库,要么全部使用Android Support Library中的库。

那有人说了改成false就正常了不就可以了,不是很简单吗?是的,很简单,但是,如果单纯的改成false只是解决了表面的问题,实际上官方的建议是不要在项目里既使用AndroidX又包含非AndroidX的内容,会产生莫名其妙的问题。如果你不想找麻烦,还是老老实实地照着做吧,至少,我乖乖地这样做了,结果还是很好的。

相关标签: Android Androidx