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
标签:理解,29,API,版本,Android,targetSdkVersion,SDK From: https://www.cnblogs.com/terrorists/p/18082009