Android 适配
2016-07-27 13:14
453 查看
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。
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。
相关文章推荐
- Android Studio
- Android TextView 不同主题下两边对齐
- Android动态加载so
- Android基础总结(8)——服务
- 浅析android事件分发机制
- Android开发之Intent.Action
- Android Studio编译FBReaderJ
- 从头学android_alertDialog的使用
- 从零开始的Android新项目9 - 前端用后台接口设计
- 从零开始的Android新项目8 - Data Binding高级篇
- 从零开始的Android新项目7 - Data Binding入门篇
- 从零开始的Android新项目6 - Repository层(下) Realm、缓存、异常处理
- Handler消息机制的原理及应用场景
- AndroidManifest配置之uses-sdk
- 为Android程序设置全局的捕获异常,提升用户体验(UncaughtExceptionHandler捕获全局异常)
- android 小知识点
- Android之Jsoup解析数据
- 为什么要对ListView控件进行优化,以及如何优化。
- Android中有几种数据存储方式,每种方式有哪些特点?
- 从零开始的Android新项目5 - Repository层(上)