Android CameraX版本大坑

2,247 阅读3分钟

前言

事情是这样的,我两周前闲时写了个用cameraX实现摄像头录制视频然后进行编码的功能,但是因为某些事写到一半鸽了,但是当时是能保证功能正常的。结果两周后的今天,稍微了那么一点时间,我想上去把进度补了,结果一运行直接报错。直接给我整不会了,我第一反应是我没改东西啊,结果仔细去找问题,发现这其中,确实坑很大。

原版本的依赖

implementation "androidx.camera:camera-core:1.2.0-beta01"
implementation "androidx.camera:camera-camera2:1.2.0-alpha04"
implementation "androidx.camera:camera-lifecycle:1.2.0-alpha04"
implementation "androidx.camera:camera-video:1.2.0-beta01"
implementation "androidx.camera:camera-view:1.2.0-alpha04"

原版本的依赖是这样的,这个是当时按照官方最新的版本进行的操作。相信很多人看到alpha和beta已经开始觉得这玩意不太对劲了。

结果运行后发现报错: java.lang.NoSuchFieldError: No static field ANALYSIS of type Landroidx/camera/core/impl/SurfaceConfigConfigSize;inclassLandroidx/camera/core/impl/SurfaceConfigConfigSize; in class Landroidx/camera/core/impl/SurfaceConfigConfigSize; or its superclasses (declaration of 'androidx.camera.core.impl.SurfaceConfig$ConfigSize' appears in /data/app/~~VnqBDbq3S5fyh5YCiSIKAQ==/com.kylin.videoproject-AKGt8exD8YYNkrxyT5tReg==/base.apk)

279cf22443d44c2887346af913826b7.png

能明确的看出报错的原因是ExtraSupportedSurfaceCombinationsQuirk这个类中没有找道SurfaceConfig$ConfigSize的ANALYSIS这个属性。

然后我们跟着源码去看

28ade396142363dbf48beeeaaa62d1f.png

发现确实没有这个参数。这是为什么呢?为什么我两周前又能正常run,现在又说缺少这个属性。

androidx.camera:camera-core

细节就在这个地方,我找了ExtraSupportedSurfaceCombinationsQuirk和SurfaceConfig的ConfigSize属于哪个包,发现ExtraSupportedSurfaceCombinationsQuirk是属于androidx.camera:camera-camera,而SurfaceConfig的ConfigSize属于androidx.camera:camera-core,它们并不属于同一个模块

再进一步去看,就能从细节中发现问题的所在

3f79359b52fbbbdc42ba2195829ae2e.png

可以看出我明明依赖的是core1.2.0-beta01,但是我的依赖目录中却发现还有一个core1.2.0-beta02,我想只要一个可能,那就是'androidx.appcompat:appcompat:1.2.0'的杰作。

对比两个版本的源码后发现确实是这个地方的问题。

a994887abd568f4c36fd4e8dd6f1cf5.png

6d39feb857b62169e27b398174c903f.png

结论和问题的修复

所以结论就是appcompat中已经有camera-core了,我们没必要再去单独依赖camera-core。我没有详细看下去,不知道它为什么只内部依赖camera-core,没有依赖camera-camera的

那是不是把implementation "androidx.camera:camera-core:1.2.0-beta01"去掉就行,当然不是,想什么呢?它都依赖core:1.2.0-beta02了,去不去掉这个依赖没有任何影响。

那怎么办呢?问题就是camera-camera2:1.2.0-alpha04和camera-core:1.2.0-beta02不匹配。那做法就很简单了,更新camera-camera2:1.2.0-alpha04到和camera-core:1.2.0-beta02版本匹配就行,所以我们直接去官方看最新版本。

cbc3e2b7d1fc25134255d35df5b1d45.png

我NM,官方显示的最新版本是1.2.0-beta01,结果改之后发现没用,还是错的,也就是说这个官方显示的最新版本还是不匹配。而且按理来说,如果依赖有新版本的话,你的Gradle里面会给这个依赖套一层黄色,结果camera-camera改成1.2.0-beta01之后,并没有提示有新版本。

那怎么办,appcompat里面的肯定是不好改了,但是也可以,我也有个思路,依赖appcompat的时候把camera-core给exclude掉(没试过啊,不知道会不会出问题)

当然还有一种办法,没错就是赌,我直接把camera-camera的版本改成1.2.0-beta02赌一把

那有的人可能会问,赌失败了怎么办,那赌失败了再考虑其它方案嘛,可惜很幸运的是赌成功了,最终的依赖是这样:

implementation "androidx.camera:camera-camera2:1.2.0-beta02"
implementation "androidx.camera:camera-lifecycle:1.2.0-beta02"
implementation "androidx.camera:camera-video:1.2.0-beta02"
implementation "androidx.camera:camera-view:1.2.0-beta02"

总结

这倒不是一个很难的问题,说不定过几天官方就显示最新的版本变成camera-camera2:1.2.0-beta02,那就不会再有这个问题。

但我相信这类问题肯定还是会有类似的,特别是这种alpha和beta的版本,一看就觉得可能会有坑。关键的思路是两个不同的模块之前的版本不同步的情况下,要以怎样的一个思路去解决问题。比如降版本,这里把appcompat的版本从1.2.0往下降行不行,我觉得应该可行。或者以其它的方式去解决这样的一个问题,我认为都是可以的,办法总比困难多。