版权声明:
本公众号发布的所有文章,未特殊署名,均属于原创,版权归本公众号所有。
转载请参阅公众号的:《转载授权》。
一、前言
在 Android 提供的 Api 中,很多 Api 都是有 Api Level 的限制的,这也限制了我们的 App 允许运行的设备的 Api Level ,通常这种限制,我们可以使用 minSdkVersion 来做限定。
关于 minSdkVersion 的相关内容,可以参考之前的文章:《XxxSdkVersion 傻傻分不清楚》
而当我们使用第三方库的时候,也会碰到因为对方库限定了 minSdkVersion 而导致无法被集成进来,这种情况会在编译期间抛出异常,导致打包失败。
遇见这样的问题,只能考虑提升主项目的 minSdkVersion ,放弃低版本用户,或者放弃使用该库。这两种方案二选一。
那么本片文章,教你如何突破它,允许忽略第三方库的 minSdkVersion 限制,成功打包。
二、复现和解决问题
2.1 复现错误
既然是解决问题,先来看看错误提示。
场景:集成了 Android TV 的库android.support.v17.leanback。可以看到,它限制了 minSdkVersion 为 Api Level 17 。如果我们在 build.gradle 中的 minSdkVersion 设置到 16,重新打包就会出现如下错误。
从提示上,可以很清楚的看出来是那个库引发的问题,也给出了解决办法,使用 uses-sdk 标签标记它。
2.2 解决问题
既然已经给出了提示,那么按照提示解决即可。
在 AndroidManifest.xml 中,Application 标签下,增加一个 uses-sdk 的标签,重新为 leanback 指定 minSdkVersion 为 16。
如此设置之后,就可以正常打包了。
三、思考
虽然这样可以解决引用高 minSdkVersion 库的打包问题,但是实际上并不推荐如此操作。
同时前面给出的例子并不是一个好例子,因为 Leanback 中,需要使用 Fragment.getChildFragmentManager()
这个 Api,但是它是在 Api 17 才添加的,这种问题,是明显无法绕过的问题,因为哪怕打包成功了,安装运行之后一样会崩溃报错。
但是具体情况具体分析。有一些情况,实际上我们是可以绕过的。最典型的就是一些 UI 效果,如果低版本不支持,直接使用 Build.VERSION.SDK_INT 判断一下当前运行的设备 SDK 版本,然后区分处理即可。这样实际上在低版本的设备上运行,那些高版本才添加的 Api,也不会被调用到,自然也不会出错。无非就是在低版本上,表现的形式不一样而已,例如少个动画,但是并不影响使用。
所以总结来说,这样 user-sdk 的使用场景:
能清楚知道是什么 Api 被版本限制了,又能清楚的知道如何规避它,让它在低版本上不会被调用到。
这样的情况下,我们是可以放心的使用 uses-sdk 来避免无法打包的问题的,毕竟低版本的设备,现在市场占用率,并不低。
iOS 专属打赏
推荐阅读:
点赞或者分享吧~