Android 适配

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。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值