APP_PLATFORM,android:minSdkVersion和android:targetSdkVersion之间有什么关系?

时间:2014-02-19 17:35:00

标签: android android-ndk

我正在开发一款使用NDK功能的Android应用。我的应用在android:minSdkVersion中定义了android:targetSdkVersionAndroidManifest.xml,在jni / Application.mk中定义了APP_PLATFORM

我目前的理解是android:minSdkVersion decalres支持的最低操作系统版本,android:targetSdkVersion声明要链接的Java库版本,APP_PLATFORM声明要链接的C ++库。

两个问题:

  1. 我的理解是否正确?

  2. APP_PLATFORM是否可以大于android:minSdkVersion?或者他们必须彼此平等?

  3. 我的问题的原因:我希望我的应用可用于 API> = 10 的设备,但我需要使用定义的NDK函数(如AMotionEvent_getAxisValue)在NDK的platforms\android-13文件夹中。所以我使用android:minSdkVersion=10APP_PLATFORM=13。项目编译成功,但是它可以在API 10-12设备上运行吗?

2 个答案:

答案 0 :(得分:23)

  1. android:minSdkVersion是您的应用所期望的最低操作系统版本。

  2. android:targetSdkVersion本质上是您为应用程序设计的最大操作系统版本。这是一个如何工作的例子。想象一下,您使用API​​ 19测试了您的应用程序,并使用android:targetSdkVersion = 19发布了您的应用程序。然后,Google决定通过更改某些API的行为来发布API 20,但他们不希望更改旧应用的行为(以防止破坏它们)。因此,当您的应用启动时,Android会发现您的应用已targetSdkVersion = 19,因此它会为您提供旧的API行为,但如果某个其他应用说targetSdkVersion = 20,Android会为其提供新的API行为。

  3. APP_PLATFORM是NDK将使用本机代码编译的本机头文件和库的版本。如果将APP_PLATFORM设置为特定值并使用仅在该平台版本中可用的API,则您的应用将无法在旧版平台上正常运行。所以APP_PLATFORM是最小值。解决方案是使用较低的值而不使用那些较新的API,或编写在运行时决定是否调用新API的代码(并且可能使用dlopen / dlsym)。

  4. 似乎一般来说使用比APP_PLATFORM更新的android:minSdkVersion值是没有意义的,除非你做了一些特别的事情(比如小心不要通过检查新的API来调用新的API)运行时的版本,另外确保不链接到新API,而是使用dlopen / dlsym)。

    因此,如果您使用APP_PLATFORM=13并且调用AMotionEvent_getAxisValue(不在早期平台标头中,暗示它在早期平台上不可用),您的应用将无法在设备上运行使用API​​< 13.一个警告是,如果AMotionEvent_getAxisValue实际上在旧版本上可用,但它不在头文件/库文件中,或者它没有记录。但我不知道这个特定API是否就是这种情况(基本上,这需要更多的研究和风险分析,以确定是否要依赖不受支持的东西)。

答案 1 :(得分:0)

你是对的最低限度。我不确定目标应该代表什么,我认为它提供了目标SDK的一些功能,但也确保应用程序将以最小的SDK运行。