见https://developer.android.com/guide/practices/compatibility.html#filtering
Divice Compatibility(2017年3月12日) 兼容性分为设备兼容和应用兼容 作为一个app开发者,你不需要担心是否一个设备是Android兼容的,因为只有当设备是Android兼容时,才包含google play商店。因此,你大可放心,从google play商店安装你的app的使用者正在使用一个Android兼容的设备。 然而,你确实需要考虑你的app是否和每一个潜在的设备配置是兼容的。因为Android运行在一个广泛的设备配置上,一些特征不是在所有的设置上是可用的。例如,一些设备可能不包含罗盘传感器,如果你的app的核心功能要求使用罗盘传感器,则你的app只能用在包含罗盘传感器的设备上 Android支持一系列特征,这些特征是关联平台API的。一些特征是基于硬件的(如罗盘传感器),一些是基于软件的,一些是依赖平台版本的。不是所有的设备都支持每一个特征,因此你可能需要控制你的app对设备的有效性,那些设备应该具备你的app要求的特征 Android为那些在所有设备上可能不可用的硬件或者是软件特征定义了ID,例如,罗盘传感器是FEATURE_SENSOR_COMPASS,app小部件是FEATURE_APP_WIDGETS 如果必要,你可以阻止用户安装你的app,当他们的设备不能提供一个给出的特征,这个特征声明在你的app的manifest文件的<uses-feature>元素中 例如,如果你的app不能在一个缺少罗盘传感器的设备上工作,你可以声明这个罗盘传感器作为一个必要的,在manifest中,如下: <manifest ... > <uses-feature android:name = "android.hardware.sensor.compass" android:required = "true" /> ... </manifest> google play商店会比较你的app中要求的特征在每个用户设备上的合理性,去决定是否你的app与每个设备是可兼容的。如果这个设备不能提供你的app上的所有特征,这个用户就不能安装你的app 然而,如果你的app的主要功能不要求这个设备的特征,你应该设置相应的required为false,然后在运行时核查这个特征。如果这个app的特征在当前的设备上不可用,适当的降低相应的app特征(即关闭该特征)。例如,你可以查询一个特征是否是可用的,通过调用hasSystemFeature(),向下面这样 PackageManager pm = getPackageManager (); if (! pm . hasSystemFeature ( PackageManager . FEATURE_SENSOR_COMPASS )) { // This device does not have a compass, turn off the compass feature disableCompassFeature (); } 平台版本 不同的设备可能运行在不同的Android平台版本下,例如Android4.0,Android4.4。 每一个连续的平台版本经常增加一些新的API,这些API并不适合在先前的版本。为了表名哪些API组是可用的,每个平台版本指定一个API等级。例如,Android1.0 的API等级是1,Android 4.4 的API等级是19 API等级允许你去声明你的app兼容的最低版本,通过在manifest中使用<uses-sdk>和minSdkVersion属性 例如,日历API被增加到Android4.0(API等级为14).如果你的app没有这些API就不能工作,你应该声明API等级为14,作为你的app的最低支持版本,如下: <manifest ... > <uses-sdk android:minSdkVersion = "14" android:targetSdkVersion = "19" /> ... </manifest> minSdkVersion属性声明了你的app可兼容下的最低版本,targetSdkVersion属性声明了在你的app已经优化下的最高的版本 每一个Android的连续版本都为app提供可兼容性,这些app使用以前平台版本进行构建。因此你的app中使用的API应该总是和未来的Android版本相对应的API是可兼容的(即你的app以前调用的是低版本的API,现在系统升级了,也可以调用高版本对应的API,只是高版本增加的API不能够调用) note:targetSdkVersion属性不会阻止你的应用安装在一个比该值更高的平台版本上,但是它的重要性在于,指示系统是否应该在一个新的版本下继承行为改变。如果你不更新targetSDKVersion到最近的版本,当运行在最近的版本,系统会假定你的应用要求一些后向兼容行为。例如,在Android4.4的行为改变中,使用AlarmManager API创建的报警默认情况是不正确的,因此系统可以批处理应用报警并保留系统电源,但是如果你的targetSdkVersion低于19,系统将会为你的应用保留先前API的行为 但是,如果你的app使用的是一个最近平台版本中的,但又不要求它们作为主要的功能,你应该在运行时核查API等级,并在API等级太低时降低相应的功能。在这种情况下,设置minSdkVersion尽可能到达到你的app主要功能的最低值,然后将当前系统的版本SDK_INT与Build.VERSION_CODES中对应的要检查的API等级的代码常量进行比较,例如: if ( Build . VERSION . SDK_INT < Build . VERSION_CODES . HONEYCOMB ) { // Running on something older than API level 11, so disable // the drag/drop features that use ClipboardManager APIs disableDragAndDrop (); } 【这里顺便说一下:API等价minSdkVersion,是app上调用的API最低的要求,也就是说如果你要将app安装在一个系统上,那么这个系统的platform Version对应的API必须要大于等于它的值,才能运行app上的功能,而如果这个系统的platform Version对应的API的值小于minSdkVersion,说明该app不能正常运行在该系统,这是不允许的】