再次理解Android targetSdkVersion

瓜的呱發表於2024-04-12

1.問題發生

第一問題發生:

兩個APP訪問同一個系統類android.net.IpConfiguration,均正常編譯生成apk安裝到同一臺裝置上(排除了外部因素)。

一個app能正常訪問IpConfiguration的屬性IpAssignment ipAssignment,另一個卻報錯沒有這個屬性。

出問題的那個app,我透過反射獲取獲取並列印了IpConfiguration的內部所有屬性值,發現真沒有該屬性,

同時另一個正常app也反射列印卻真實能獲取到ipAssignment。

後來同事說改了下targetSdkVersion,跟正常app的targetSdkVersion改到一致就可以了。

第二次問題發生:

這裡我寫了一個應用裡面有對mqtt元件的引用如下

implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.4'
implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'

在Android9上是正常執行的,但是當我把這個app安裝到另一款裝置Android12上面時,卻出現上面的報錯資訊

沒想明白,索性再搜尋學習一番並總結如下

2.理解學習

2.1 minSdkVersion15

跟手機系統版本有關

這表示安裝應用程式的手機系統的版本必須要>=15。比如我的應用設定minSdkVersion 29, 然後我在android系統8.1.0版本的手機上安裝,8.0 Build.VERSION.SDK_INT==27,這時我的應用安裝不上。

簡而言之,這是決定你安裝裝置的最低安卓版本,低於設定的minSdkVersion系統就不讓你安裝。

2.2 compileSdkVersion 29

跟編譯SDK版本有關

當前使用29版本的SDK編譯應用程式。程式碼中我們可以使用SDK 29版本API和方法。一般設定到最大,可以檢測最新SDK的特性。

這是程式在編譯時使用的android版本,一般和targetSdkVersion 設定一致(非強制要一致)。

2.3 targetSdkVersion 20

系統相容

高版本手機相容:當執行在系統10.0,SDK_INT=29的裝置上時,呼叫SDK 20的版本API,即使當前10.0手機的特性已經改變,但是還是執行SDK20的API。

(這就解釋了第一節中問題一的原因,由於我們targetSdkVersion不一致導致類的定義不一致,低版本的IpConfiguration沒有ipAssignment這個屬性)

(同樣對於問題二,由於targetSdkVersion設定的31,導致會啟用高版本的一些Flag的check,問題上面也說了大於31需要增加flag,由於我們是遠端依賴無法新增flag,所以我們把targetSdkVersion修改到30,程式正常執行)

低版本手機相容:比如targetSdkVersion 29,當執行在系統8.0,SDK_INT=27的裝置上時,呼叫SDK 29的版本API,用到新API要做好相容。如if( Build.VERSION.SDK_INT<29){.....}else{......}

總結:targetSdkVersion 不能隨便調整。如果targetSdkVersion==29,那就要做好29以前所有版本的相容。

TargetSdkVersion 是 Android 系統提供前向相容的主要手段。這是什麼意思呢?假如使用者安裝了APP,但是使用者的 Android 系統會不斷升級,對應同一個 API(方法),內部的實現邏輯已經發生了改變,新邏輯可能會影響之前呼叫此 API 的 APP,為了相容此問題,引入 targetSdkVersion。當 targetSdkVersion >= API LEVEL(某個系統版本)時再生效新的邏輯,否則還是沿用之前的邏輯。所以從這個角度來說,如果你修改通常是調高 targetSdkVersion 的數值,就一定要做充分的測試後才能釋出,因為呼叫的 API 雖然沒變,但是內部邏輯已經傳送了改變

3.API級別對照表

這裡再附上API級別對照表,省得每次都在查

Android 14 (Developer Preview)
Android 13.0(T) 33
Android 12.0(S) 31,32
Android 11.0(R) 30
Android 10.0(Q) 29
Android 9.0(Pie) 28
Android 8.1(Oreo) 27
Android 8.0(Oreo) 26
Android 7.1(Nougat) 25
Android 7.0(Nougat) 24
Android 6.0(Marshmallow) 23
Android 5.1(Lollipop) 22
Android 5.0(Lollipop) 21
Android 4.4W(KitKat Wear) 20
Android 4.4(KitKat) 19
Android 4.3(Jelly Bean) 18
Android 4.2(Jelly Bean) 17
Android 4.1(Jelly Bean) 16
Android 4.0.3(IceCreamSandwich) 15
Android 4.0(IceCreamSandwich) 14
Android 3.2(Honeycomb) 13
Android 3.1(Honeycomb) 12
Android 3.0(Honeycomb) 11
Android 2.3.3(Gingerbread) 10
Android 2.3(Gingerbread) 9
Android 2.2(Froyo) 8
Android 2.1(Eclair) 7
Android 2.0.1(Eclair) 6
Android 2.0(Eclair) 5
Android 1.6(Dout) 4
Android 1.5(Cupcake) 3
Android 1.1(Base) 2
Android 1.0(Base) 1


參考:https://www.jianshu.com/p/d833f8888a58
https://blog.csdn.net/crazestone0614/article/details/127979666

相關文章