minSdkVersion, compileSdkVersion

2022-03-30  本文已影响0人  xiongmao_123
问题引出:

为什么下面这段代码不起作用,明明在AndroidManifest.xml中添加了权限声明,也动态请求了,为什么还提示权限不足呢?

final TelecomManager telecomManager = (TelecomManager) getSystemService(TELECOM_SERVICE);
if (telecomManager != null) {
    telecomManager.endCall();
} 

这个方法是明明是API28中新引入的,为什么会提示报权限不足呢,而不同手机报的权限却又不一样呢?

minSdkVersion

这个属性是三个当中相对最好理解的,先引用文档中的描述:


1648607720(1).png

根据实验及说明,这个属性有以下几个作用:

  1. 声明最小版本,比如如果属性值为21,则不能安装在Build.VERSION.SDK_INT小于21的手机中(Android 5.0),安装apk时会有错误提示。

    1648608184(1).png
    Android Studio的设备选择器中也会有相应的标红提示。
    1648608255(1).png
  2. 在写代码时,如果没有做API兼容处理的写法(if-else,或添加注解),会标红提示。但可以编译生成APK。


    1648608435(1).png

如果忽略提示,比如 minSdkVersion 22 的属性设置,然后依旧调用API level 23才引入的方法 android.app.Activity#requestPermissions,然后安装在API 22(Android 5.1)的手机上运行,则会crash掉,提示没有找到方法。

1648608811(1).png
compileSdkVersion

这个属性是指采用哪个sdk版本来编译,这个属性只对编译时期产生影响。比如说如果你要调用API level 23才引入的方法或特性,就需要把compileSdkVersion设置为>=23。比如android.app.Activity#requestPermissions这个方法是API 23才引入的,如果把compileSdkVersion这个属性值设置为22, 则Android Studio会提示找不到方法,也会编译失败。

1648609318(1).png
当然,这个compileSdkVersion还影响好多东西,比如资源找不到,findViewById方法体冲突, 1648609365(1).png
targetSdkVersion

这个方法对apk的运行有影响,如果设置为23,指的是apk兼容测试到Api level 23了(Android 6.0),告诉手机系统可以用Api level 23的特性来运行(言外之意是不用兼容运行)。
直接引用官网的说法:

1648609822(1).png

比如说,动态权限请求是Api level 23(Android 6.0)引入的新特性,那么,如果设置targetSdkVersion 23或者23以上,apk的运行表现就是会弹出权限请求框,让用户进行权限的授权。如果,属性值设置为22,或者以下,则不会弹出权限请求框,因为手机系统进行了兼容的处理。

同理,上面官网文档中说的样式,主题之类的,也是这个道理,会根据targetSdkVersion来进行不同的兼容处理。

问题解决:

那么回到一开始提出的问题,因为android.telecom.TelecomManager#endCall这个方法是Api level 28(Android 9.0/ Android P)中引入的新特性,新方法,所以除了要把 compileSdkVersion 28设置为28或者28以上外,还要把表现特性的属性值设置为28,或以上,targetSdkVersion 28。如果不设置为28或以上,apk运行在手机上时会采用兼容处理的方式,不同手机报出的警告信息(错误信息)略有不同。但不会保证调用执行成功。

简单小结

minSdkVersion提示要兼容的最低版本的手机,在代码写法上有针对不同版本的if-else处理。
compileSdkVersion针对应用采用的版本特性,如果要使用新特性,则需要使用更高的版本,只对编译期影响,并且影响很大。
targetSdkVersion针对应用运行期有不同的影响,如果要使手机能够使用新版本的新特性新功能,则需要把该属性值提高到相应的版本。

参考资料:

  1. Android 开发者 | Android Developers
  2. android - What is the difference between compileSdkVersion and targetSdkVersion? - Stack Overflow
  3. Picking your compileSdkVersion, minSdkVersion, and targetSdkVersion | by Ian Lake | Android Developers | Medium
上一篇 下一篇

猜你喜欢

热点阅读