Android中的 targetsdkversioin

简介: 对于Android初学开发者来说,可能会好奇 targetsdkversioin这个配置是用来干嘛的。也有很多一两年开发经验的 Android码农会在面试中被问到这个问题。

对于Android初学开发者来说,

可能会好奇 targetsdkversioin这个配置是用来干嘛的。
也有很多一两年开发经验的 Android码农会在面试中被问到这个问题。

Api Level是个什么东西?

Android的api在版本间变化可能非常大,
有时候一个 api在低版本支持,到了高版本就被删除了。
可以在 develop网站上看到 api level对应的 Android版本,
xxx.jpg

举个例子,Activity.getActionBar()
xxxx.jpg

可以看到 api level 11,也就是说3.0之前是没有这个api的,
3.0之前的机器运行不了用了这个api的app。

targetsdkversioin

以上面 getActionBar()的例子来说,
我们的app现在可以指定 targetsdkversioin = 11,
这意味着安装时会通知系统,开发者已经在 3.0系统上测试过没问题,
如果安装的系统 api level高于11,则会开启兼容模式来运行app。

就像 Android 6.0引入的动态权限申请,
如果你把 targetsdkversioin定位比6.0低的 api level的话,
其实是不需要动态去申请权限,
在app安装时,系统会以兼容模式默认开启这些权限。

然而问题在于,
设定 targetsdkversioin = 21(比如5.0对应的 api level 21),
意味着向系统表明我们只在 5.0系统测试过,
如果是运行在6.0的机器而用户手动关掉所需要的权限的话,
我们的应用是会崩溃的,系统并不会帮我们处理掉兼容性的问题。

@TargetApi

和 targetsdkversioin相对应的还有 @TargetApi这个注解,
还是以上  getActionBar()为例子来说明

如果我们预期app可以运行在 api level < 11的机器上,
而因为UI设计或者其他原因,非要用 getActionBar()方法的时候,
@TargetApi就有作用了

对于这种情况,
通常会在代码中用 Build.VERSION.SDK_INIT 来判断,比如下面的代码,

if(Build.VERSION.SDK_INIT > 10) {
    ....
    goWithActionBar();
} else {
    ....
}

@TargetApi(11)
public void goWithActionBar(){
    ....
}

这意味着 goWithActionBar()这个方法是在 api level以上可以使用的,
不加这个注解的话,编译系统会提示兼容性错误而导致编译不过,
因此 @TargetApi主要是用来抑制编译时的兼容性问题的。

更多Android进阶技术,面试资料系统整理分享,职业生涯规划,产品,思维,行业观察,谈天说地。可以加Android架构师群;701740775。

相关文章
|
Android开发
android target unknown and state offline解决办法
没有错,将adb的版本升级一下就好了! 下载地址为:http://files.cnblogs.com/files/hujunzheng/adb1.0.32.zip
726 0
|
开发工具 Android开发
Unable to resolve target &#39;android-i&#39;
 导入旧版本的安卓开发程序时,会提示 Unable to resolve target 'android-i'  错误,而且有些文件会提示import java.* cannot resolved,这是旧版本的安卓sdk和现在的的不一致造成的。 方法是:修改工程project.properties中的target=17改为当前版本,如target=18即可 如何查看当前sdk版
933 0
|
XML API Android开发
out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
编译出错: out/target/common/obj/PACKAGING/public_api.txt:22549: error 17: Field android.
1149 0
|
8天前
|
消息中间件 网络协议 Java
Android 开发中实现数据传递:广播和Handler
Android 开发中实现数据传递:广播和Handler
13 1
|
10天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
32 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
11天前
|
Unix Linux Shell
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
在Linux环境下交叉编译Android所需的FFmpeg so库,首先下载`android-ndk-r21e`,然后解压。接着,上传FFmpeg及相关库(如x264、freetype、lame)源码,修改相关sh文件,将`SYSTEM=windows-x86_64`改为`SYSTEM=linux-x86_64`并删除回车符。对x264的configure文件进行修改,然后编译x264。同样编译其他第三方库。设置环境变量`PKG_CONFIG_PATH`,最后在FFmpeg源码目录执行配置、编译和安装命令,生成的so文件复制到App工程指定目录。
43 9
FFmpeg开发笔记(八)Linux交叉编译Android的FFmpeg库
|
1天前
|
前端开发 Android开发 iOS开发
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比
【4月更文挑战第30天】Flutter 框架实现跨平台移动应用,通过一致的 UI 渲染(Skia 引擎)、热重载功能和响应式框架提高开发效率和用户体验。然而,Android 和 iOS 的系统差异、渲染机制及编译过程影响性能。性能对比显示,iOS 可能因硬件优化提供更流畅体验,而 Android 更具灵活性和广泛硬件支持。开发者可采用代码、资源优化和特定平台优化策略,利用性能分析工具提升应用性能。
【Flutter前端技术开发专栏】Flutter在Android与iOS上的性能对比