Android CameraX版本大坑

Android CameraX版本大坑

前言

事情是這樣的,我兩週前閒時寫了個用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; in class Landroidx/camera/core/impl/SurfaceConfigConfigSize;inclassLandroidx/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)

Android CameraX版本大坑

能明確的看出報錯的原因是ExtraSupportedSurfaceCombinationsQuirk這個類中沒有找道SurfaceConfig$ConfigSize的ANALYSIS這個屬性。

然後我們跟著原始碼去看

Android CameraX版本大坑

發現確實沒有這個引數。

這是為什麼呢?為什麼我兩週前又能正常run,現在又說缺少這個屬性。

androidx。camera:camera-core

細節就在這個地方,我找了ExtraSupportedSurfaceCombinationsQuirk和SurfaceConfig的ConfigSize屬於哪個包,

發現ExtraSupportedSurfaceCombinationsQuirk是屬於androidx.camera:camera-camera,而SurfaceConfig的ConfigSize屬於androidx.camera:camera-core,它們並不屬於同一個模組

再進一步去看,就能從細節中發現問題的所在

Android CameraX版本大坑

可以看出我明明依賴的是core1。2。0-beta01,但是我的依賴目錄中卻發現還有一個core1。2。0-beta02,我想只要一個可能,那就是‘androidx。appcompat:appcompat:1。2。0’的傑作。

對比兩個版本的原始碼後發現確實是這個地方的問題。

Android CameraX版本大坑

Android CameraX版本大坑

結論和問題的修復

所以結論就是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版本匹配就行,所以我們直接去官方看最新版本。

Android CameraX版本大坑

我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往下降行不行,我覺得應該可行。或者以其它的方式去解決這樣的一個問題,我認為都是可以的,辦法總比困難多。