3.6.2 环境配置
每个应用都会有它所依赖的软硬件环境。有的应用实现会依赖特定版本的SDK,而有的应用则需要一些特定硬件的支持。应用所依赖的软硬件环境信息,都需要在配置文件的环境配置部分声明。
使用配置项<uses-sdk>,可以声明应用所依赖的SDK版本信息。而<user-feature>配置项,则用于声明应用所依赖的外设或Android的特色功能。比如,一款主打拍照功能的应用需要声明所安装设备要有相机[1]:
<uses-feature android:name="android.hardware.camera"/>
此外,<users-configuration>配置项,用于描述应用所需的输入设备配置;<supports-screens>配置项,用于声明应用所依赖的屏幕设置。对输入或显示有特殊需求的应用,都需要声明这些配置项。
安装应用时,Android会校验当前设备的配置是否满足应用配置文件中声明的环境信息,如果设备配置无法满足应用的需求,就会终止安装。这样的机制将一些运行时可能会出现的错误提前到安装阶段暴露,保证应用能将其最完美的一面展示给使用者。
当然,为这种“美丽”付出的代价就是应用会在很多设备上无法安装。因此,如果应用只有小部分非核心的功能会依赖特殊的接口或设备,就不需要在配置文件中声明而是在运行时动态判定了。
小贴士 为了保证应用能够运行在更多的Android设备上,并且在版本越高的SDK中会有越好的表现,就需要在应用运行时兼容不同版本的SDK。
<uses-sdk>中可以声明目标SDK版本targetSdkVersion,这是开发者开发应用时所依赖的SDK版本,所有应用中用到的接口都不会高于这个版本的SDK。此外,在<uses-sdk>配置项中,还可以设置最低的SDK版本minSdkVersion,用于声明应用能够兼容的最低SDK版本。当目标版本和最低版本有所不同时,开发者就需要处理两个版本间的接口变更问题。比如,如果目标版本的SDK中有A.method,而最低版本中缺少该接口(或接口参数、名称有所调整),就需要动态判定SDK版本,决定具体调用哪个接口。
Java虽有运行时二次编译的机制,但并非是解释型的语言,它的运行时加载单元是类。因此,在编写SDK版本相关代码时,要用类而不是函数为隔离单位。比如SDK版本的实现,可以按照如下格式进行划分:
class MethodInLowSdk{
public static void aMethod();
};
class MethodInHighSdk{
public static void aMethod();
};
在使用时通过android.os.Build.VERSION.SDK_INT判断SDK版本,从而决定使用哪个类中的方法,比如:
void CallAMethodByVersion(){
if(android.os.Build.VERSION.SDK_INT>low_sdk){
MethodInHighSdk.aMethod();
}else{
MethodInLowSdk.aMethod();
}
}
[1]关于<user-featrue>配置项具体的参数,可以参见SDK:http://androidappdocs.appspot.com/guide/topics/manifest/uses-feature-element.html。