compileSdkVersion和targetSdkVersion有什么区别?

时间:2014-11-01 22:54:27

标签: android sdk android-gradle android-build

我查看了使用Gradle构建的documentation,但我仍然不确定compileSdkVersiontargetSdkVersion之间的区别是什么。

所有这一切都是:

  

compileSdkVersion属性指定编译目标。

那么"汇编目标"是什么?

我看到两种可能的解释方法:

  1. compileSdkVersion是构建应用时使用的编译器版本,而targetSdkVersion"API level that the application targets"。 (如果是这种情况,我认为compileSdkVersion必须大于或等于targetSdkVersion
  2. 他们的意思是一样的。 "汇编目标" =="应用程序所针对的API级别"
  3. 别的什么?
  4. 我之前已经问过this question,但是一个答案只引用了文档,这对我来说是不清楚的。

11 个答案:

答案 0 :(得分:492)

compileSdkVersion

compileSdkVersion是针对该应用编译的API的版本。这意味着您可以使用该API版本中包含的Android API功能(以及所有以前的版本)。如果您尝试使用API​​ 16功能但将compileSdkVersion设置为15,则会出现编译错误。如果将compileSdkVersion设置为16,只要应用程序的执行路径不尝试调用API 16特定的API,您仍然可以在API 15设备上运行该应用程序。

targetSdkVersion

targetSdkVersion与您的应用编译方式或可以使用的API无关。 targetSdkVersion应该表明您已经测试了您的应用程序(可能是包括您指定的版本)。这更像是一个认证或签名,你给Android操作系统作为一个提示,它应该如何处理你的应用程序的操作系统功能。

例如,正如the documentation所述:

  

例如,将此值设置为“11”或更高版本允许系统在Android 3.0或更高版本上运行时将新默认主题(Holo)应用于您的应用...

Android操作系统在运行时可能会根据此值更改应用程序在操作系统上下文中的样式化或执行方式。还有一些其他已知的示例受此值影响,该列表可能只会随着时间的推移而增加。

出于所有实际目的,大多数应用都希望将targetSdkVersion设置为最新发布的API版本。这将确保您的应用在最新的Android设备上看起来尽可能好。如果您未指定targetSdkVersion,则默认为minSdkVersion

答案 1 :(得分:132)

作为oneliner指南:

minSdkVersion <= targetSdkVersion <= compileSdkVersion

理想情况:

minSdkVersion (lowest possible) <= targetSdkVersion == compileSdkVersion (latest SDK)

Read more from this great post by Ian Lake

答案 2 :(得分:29)

[ 23%] Built target pch_Generate_opencv_videoio Scanning dependencies of target opencv_videoio [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap.cpp.o [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_images.cpp.o [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_mjpeg_encoder.cpp.o [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_mjpeg_decoder.cpp.o [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_gstreamer.cpp.o [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_v4l.cpp.o [ 23%] Building CXX object modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_gphoto2.cpp.o usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp: In member function âvoid cv::gphoto2::DigitalCameraCapture::initContext()â: /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:325:66: error: invalid conversion from âvoid (*)(GPContext*, const char*, void*) {aka void (*)(_GPContext*, const char*, void*)}â to âGPContextErrorFunc {aka void (*)(_GPContext*, const char*, __va_list_tag*, void*)}â [-fpermissive] gp_context_set_error_func(context, ctxErrorFunc, (void*) this); ^ In file included from /usr/include/gphoto2/gphoto2-abilities-list.h:28:0, from /usr/include/gphoto2/gphoto2-library.h:28, from /usr/include/gphoto2/gphoto2.h:49, from /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:32: /usr/include/gphoto2/gphoto2-context.h:113:6: error: initializing argument 2 of âvoid gp_context_set_error_func(GPContext*, GPContextErrorFunc, void*)â [-fpermissive] void gp_context_set_error_func (GPContext *context, ^ /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:326:68: error: invalid conversion from âvoid (*)(GPContext*, const char*, void*) {aka void (*)(_GPContext*, const char*, void*)}â to âGPContextStatusFunc {aka void (*)(_GPContext*, const char*, __va_list_tag*, void*)}â [-fpermissive] gp_context_set_status_func(context, ctxStatusFunc, (void*) this); ^ In file included from /usr/include/gphoto2/gphoto2-abilities-list.h:28:0, from /usr/include/gphoto2/gphoto2-library.h:28, from /usr/include/gphoto2/gphoto2.h:49, from /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:32: /usr/include/gphoto2/gphoto2-context.h:115:6: error: initializing argument 2 of âvoid gp_context_set_status_func(GPContext*, GPContextStatusFunc, void*)â [-fpermissive] void gp_context_set_status_func (GPContext *context, ^ /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:327:70: error: invalid conversion from âvoid (*)(GPContext*, const char*, void*) {aka void (*)(_GPContext*, const char*, void*)}â to âGPContextMessageFunc {aka void (*)(_GPContext*, const char*, __va_list_tag*, void*)}â [-fpermissive] gp_context_set_message_func(context, ctxMessageFunc, (void*) this); ^ In file included from /usr/include/gphoto2/gphoto2-abilities-list.h:28:0, from /usr/include/gphoto2/gphoto2-library.h:28, from /usr/include/gphoto2/gphoto2.h:49, from /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:32: /usr/include/gphoto2/gphoto2-context.h:121:6: error: initializing argument 2 of âvoid gp_context_set_message_func(GPContext*, GPContextMessageFunc, void*)â [-fpermissive] void gp_context_set_message_func (GPContext *context, ^ /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:341:52: error: âgp_camera_autodetectâ was not declared in this scope CR(gp_camera_autodetect(allDevices, context)); ^ /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:250:27: note: in definition of macro âCRâ if ((r_0629c47b758 = (GPHOTO2_FUN)) < GP_OK) {\ ^ /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp: In member function âint cv::gphoto2::DigitalCameraCapture::widgetDescription(std::ostream&, CameraWidget*) constâ: /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:1036:48: error: âgp_widget_get_readonlyâ was not declared in this scope CR(gp_widget_get_readonly(widget, &readonly)); ^ /usr/local/src/opencv/opencv-3.0.0/modules/videoio/src/cap_gphoto2.cpp:250:27: note: in definition of macro âCRâ if ((r_0629c47b758 = (GPHOTO2_FUN)) < GP_OK) {\ ^ make[2]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/src/cap_gphoto2.cpp.o] Error 1 make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2 make: *** [all] Error 2 应该是最新的稳定版本。 compileSdkVersion应经过全面测试,且小于或等于targetSdkVersion

答案 3 :(得分:24)

游戏的后期..并且上面有几个很好的答案 - 基本上,compileSdkVersion是应用程序编译的API的版本,而targetSdkVersion表示版本该应用程序已经过测试。

我想用以下注释补充这些答案:

  1. targetSdkVersion impacts the way in which permissions are requested

    • 如果设备运行的是Android 6.0(API级别23)或更高级别,应用程序的targetSdkVersion为23或更高,则应用程序会在运行时请求用户的权限。
    • 如果设备运行的是Android 5.1(API级别22)更低,或者应用的targetSdkVersion为22或更低,系统会要求用户在用户授予权限安装应用程序。
  2. 如果compileSdkVersion高于应用targetSdkVersion声明的版本,系统可能会启用兼容性行为,以确保您的应用继续以您期望的方式工作。 (ref

  3. 随着每个新的Android版本......

    • targetSdkVersion应增加以匹配最新的API级别,然后在相应的平台版本上彻底测试您的应用程序
    • 另一方面,
    • compileSdkVersion除非您添加新平台版本独有的功能,否则无需更改
    • 因此,虽然targetSdkVersion通常(最初)小于compileSdkVersion,但看到维护良好/已建立的应用targetSdkVersion > compileSdkVersion
    • 并不罕见

答案 4 :(得分:18)

The CompileSdkVersion是您的应用程序用于编译等的SDK平台的版本。在开发过程中(您应该始终使用最新版本)这是随您使用的API版本一起提供的

enter image description here

您将在build.gradle文件中看到此内容:

enter image description here

targetSdkVersion:包含您的应用在应用商店开发过程后附带的信息,允许其TARGET the SPECIFIED version of the Android platform。根据应用程序的功能,它可以定位低于当前版本的API版本。例如,即使当前版本为23,您也可以定位API 18。

好好看看这个官方Google page

答案 5 :(得分:7)

我在之前的答案中看到了很多关于 compiledSdkVersion 的不同之处,所以我会在Android网页上尝试澄清一下。

A - Android所说的

根据https://developer.android.com/guide/topics/manifest/uses-sdk-element.html

  

选择平台版本和API级别开发时   在您的应用程序中,您需要选择平台版本   您将编译该应用程序。 一般来说,你应该编译   您的应用程序针对最低版本的平台   您的应用程序可以支持。

所以,根据Android,这将是正确的顺序:

<强> compiledSdkVersion = minSdkVersion <= targetSdkVersion

B - 其他人也说

有些人更喜欢始终使用可用的最高编译的SWdVersion。这是因为他们将依赖代码提示来检查他们是否使用比minSdkVersion更新的API功能,因此要么更改代码以不使用它们,要么在运行时检查用户API版本以有条件地将它们与旧API版本的回退一起使用。 / p>

有关弃用用途的提示也会出现在代码中,让您知道某些内容在较新的API级别中已弃用,因此您可以根据需要做出相应的反应。

所以,根据其他人的说法,这是正确的顺序:

<强> minSdkVersion <= targetSdkVersion <= compiledSdkVersion (highest possible)

怎么做?

这取决于您和您的应用。

如果您计划在运行时根据用户的API级别提供不同的API功能,请使用选项B.您将获得有关编码时使用的功能的提示。只需确保在运行时没有检查用户API级别就不会使用比minSdkVersion更新的API功能,否则您的应用程序将崩溃。这种方法还有助于在编码时学习新的东西和旧的东西。

如果你已经知道什么是新的或旧的,并且你正在开发一个肯定永远不会更新的一次性应用程序,或者你确定你不会有条件地提供新的API功能,那么使用选项A.你赢了不赞成使用已弃用的提示,即使您很想使用它,也永远无法使用更新的API功能。

答案 6 :(得分:2)

我的2美分:针对任何版本的SDK进行编译,但请注意不要调用任何“最低SDK版本”不支持的API。这意味着您“可以”针对最新版本的SDK进行编译。

至于“目标版本”,它只是指你计划首先定位的目标并且可能已经过测试。如果您还没有完成尽职调查,那么这是告知Android它需要执行一些额外检查的方法,然后才能在“Oreo”上部署您的“Lollipop”目标应用程序。

所以“目标版本”显然不低于“最低SDK版本”,但不能高于“编译版本”。

答案 7 :(得分:1)

没有回答您的直接问题,因为已经有很多详细的答案,但值得一提的是,与Android文档相反,Android Studio建议使用相同版本的compileSDKVersion和{ {1}}。

enter image description here

答案 8 :(得分:0)

Visual Studio 2017(15.8.5)中Android项目的属性的“应用程序”设置似乎将它们组合在一起或类似:

enter image description here

答案 9 :(得分:0)

compiledSdkVersion ==>哪个版本的SDK应将您的代码编译为字节码(在开发中使用环境)要点:最好使用最新版本的SDK。

minSdkVersion ==>这些项目用于安装APK(在生产环境中使用)。例如:

if(client-sdk-version   <   min-sdk-versoin )
    client-can-not-install-apk;
else
    client-can-install-apk;

答案 10 :(得分:0)

快速摘要:

对于minSDKversion,请参阅Twitter句柄中的最新条目:https://twitter.com/minSdkVersion

TargetSDKversion:在Twitter句柄中查看最新条目:https://twitter.com/targtSdkVersion 或使用开发https://developer.android.com/guide/topics/manifest/uses-sdk-element.html

中指示的最新API级别

编译版本: 与TargetSDKversion相同

maxSdkVersion: Android的建议是不要设置此设置,因为您不希望限制您的应用在以后的Android版本上不执行