我正在开发一款使用NDK功能的Android应用。我的应用在android:minSdkVersion
中定义了android:targetSdkVersion
和AndroidManifest.xml
,在jni / Application.mk中定义了APP_PLATFORM
。
我目前的理解是android:minSdkVersion
decalres支持的最低操作系统版本,android:targetSdkVersion
声明要链接的Java库版本,APP_PLATFORM
声明要链接的C ++库。
两个问题:
我的理解是否正确?
APP_PLATFORM
是否可以大于android:minSdkVersion
?或者他们必须彼此平等?
我的问题的原因:我希望我的应用可用于 API> = 10 的设备,但我需要使用定义的NDK函数(如AMotionEvent_getAxisValue
)在NDK的platforms\android-13
文件夹中。所以我使用android:minSdkVersion=10
和APP_PLATFORM=13
。项目编译成功,但是它可以在API 10-12设备上运行吗?
答案 0 :(得分:23)
android:minSdkVersion
是您的应用所期望的最低操作系统版本。
android:targetSdkVersion
本质上是您为应用程序设计的最大操作系统版本。这是一个如何工作的例子。想象一下,您使用API 19测试了您的应用程序,并使用android:targetSdkVersion
= 19发布了您的应用程序。然后,Google决定通过更改某些API的行为来发布API 20,但他们不希望更改旧应用的行为(以防止破坏它们)。因此,当您的应用启动时,Android会发现您的应用已targetSdkVersion
= 19,因此它会为您提供旧的API行为,但如果某个其他应用说targetSdkVersion
= 20,Android会为其提供新的API行为。
APP_PLATFORM
是NDK将使用本机代码编译的本机头文件和库的版本。如果将APP_PLATFORM
设置为特定值并使用仅在该平台版本中可用的API,则您的应用将无法在旧版平台上正常运行。所以APP_PLATFORM
是最小值。解决方案是使用较低的值而不使用那些较新的API,或编写在运行时决定是否调用新API的代码(并且可能使用dlopen
/ dlsym
)。
似乎一般来说使用比APP_PLATFORM
更新的android:minSdkVersion
值是没有意义的,除非你做了一些特别的事情(比如小心不要通过检查新的API来调用新的API)运行时的版本,另外确保不链接到新API,而是使用dlopen
/ dlsym
)。
因此,如果您使用APP_PLATFORM=13
并且调用AMotionEvent_getAxisValue
(不在早期平台标头中,暗示它在早期平台上不可用),您的应用将无法在设备上运行使用API< 13.一个警告是,如果AMotionEvent_getAxisValue
实际上在旧版本上可用,但它不在头文件/库文件中,或者它没有记录。但我不知道这个特定API是否就是这种情况(基本上,这需要更多的研究和风险分析,以确定是否要依赖不受支持的东西)。
答案 1 :(得分:0)
你是对的最低限度。我不确定目标应该代表什么,我认为它提供了目标SDK的一些功能,但也确保应用程序将以最小的SDK运行。