Android 适配分为device 适配和app适配.device 适配是有Google的cts保证的,普通开发者不用关心.下来我们来看看app 适配.
app 适配分成下面3点:
device feature:Android 系统给每个硬件feature一个id,例如罗盘的id为FEATURE_SENSOR_COMPASS。假如你的app 要运行的话,一定要这个硬件feature,且是必须的例如指南针应用一定要罗盘。你可以在你的manifest文件中声明一定要这样的feature,例如 <uses-featureandroid:name="android.hardware.sensor.compass" android:required="true" /> 这样当用过没有这个feature的时候应用商店就会阻止用户安装这个应用。
但是如果这个硬件feature 对你的app不是必须的,例如图片应该不一定要罗盘,但是有的话,可以帮助用户记录每次使用时候的地理位置。就可以在manifest文件中android:required=false。而改在runtime是通过pms来检测,如
/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
if (!pm.hasSystemFeature(PackageManager.FEATURE_SENSOR_COMPASS)) {
// This device does not have a compass, turn off the compass feature
disableCompassFeature();
}
3149 @Override
3150 public boolean hasSystemFeature(String name) {
3151 synchronized (mPackages) {
3152 return mAvailableFeatures.containsKey(name);
3153 }
3154 }
final ArrayMap<String, FeatureInfo> mAvailableFeatures;
mAvailableFeatures = systemConfig.getAvailableFeatures();
/frameworks/base/services/core/java/com/android/server/SystemConfig.java
public ArrayMap<String, FeatureInfo> getAvailableFeatures() {
return mAvailableFeatures;
}
private void readPermissionsFromXml(File permFile, boolean onlyFeatures) {
...
else if ("feature".equals(name)) {
310 String fname = parser.getAttributeValue(null, "name");
311 boolean allowed;
312 if (!lowRam) {
313 allowed = true;
314 } else {
315 String notLowRam = parser.getAttributeValue(null, "notLowRam");
316 allowed = !"true".equals(notLowRam);
317 }
318 if (fname == null) {
319 Slog.w(TAG, "<feature> without name in " + permFile + " at "
320 + parser.getPositionDescription());
321 } else if (allowed) {
322 //Log.i(TAG, "Got feature " + fname);
323 FeatureInfo fi = new FeatureInfo();
324 fi.name = fname;
325 mAvailableFeatures.put(fname, fi);
326 }
327 XmlUtils.skipCurrentTag(parser);
328 continue;
}mAvailableFeatures
也就是说systemConfig.java 会调用readPermissionsFromXml 从每个apk的xml parse出feature,添加到mAvailableFeature 这个数组中。方便其他apk 通过在runtime是通过pm查询.
Platform version:
必须在manifest文件中添加最低支持的sdk版本和目标sdk版本如下所示。
<uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" />
需要注意的是如果用的API小于minSdkVersion,系统build的时候会报错,如果你使用的android:targetSdkVersion="19" 但是你可以使用19以后的API,系统并不会报错。
也可以在runtime是检测系统的版本,例如高于version 20的话,就可以使用version 20 的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
}
Screen configuration:
Android使用screen size 和 screen density 来分辨不同的device
screen size:small,normal,large,xlarge
screen density:mdpi,hdpi,xdpi,xxdpi,and other。