您的位置:首页 > 移动开发 > Android开发

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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: