兼容Android 6.0,您需要做的几件事儿!

目前谷歌已经放出了Android O(8.0)的预览版,但很多app并没有使用6.0以来的新特性。下面就结合官方文档和自己工作中需要的一些问题,简单总结了下,在对您的应用进行针对target23以其以上重构时,需要注意和兼容的问题。


一,低耗电模式。

Android 6.0(API 级别 23)引入了低电耗模式,当用户设备未插接电源、处于静止状态且屏幕关闭时,该模式会推迟 CPU 和网络活动,从而延长电池寿命。而 Android 7.0 则通过在设备未插接电源且屏幕关闭状态下、但不一定要处于静止状态(例如用户外出时把手持式设备装在口袋里)时应用部分 CPU 和网络限制,进一步增强了低电耗模式。

A.网络访问的限制

在涉及到网络访问,特别时后台访问网络的,需要测试下,在低耗电模式下,应用是否执行正常,会不会anr或者崩溃

B.后台唤醒机制

即对齐唤醒,主要涉及到的是WakeLockAlarm,后台的一些定时服务,可能会不准

二,后台优化

Android 7.0移除了三项隐式广播,以帮助优化内存使用和电量消耗。此项变更很有必要,因为隐式广播会在后台频繁启动已注册侦听这些广播的应用。删除这些广播可以显著提升设备性能和用户体验。

A. CONNECTIVITY_ACTION

面向 Android 7.0 开发的应用不会收到CONNECTIVITY_ACTION广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用如果使用BroadcastReceiver请求接收通知,则仍可以在主线程中侦听CONNECTIVITY_CHANGE。

B. ACTION_NEW_PICTURE

C. ACTION_NEW_VIDEO

应用无法发送或接收ACTION_NEW_PICTUREACTION_NEW_VIDEO广播。此项优化会影响所有应用,而不仅仅是面向 Android 7.0 的应用。

三,权限更改

A.私有文件的文件权限不应再由所有者放宽,为使用MODE_WORLD_READABLE和/或MODE_WORLD_WRITEABLE而进行的此类尝试将触发SecurityException。

B.当你跨package域传递file://的URI时,接收者得到的将是一个无权访问的路径,将会触发FileUriExposedException。官方推荐的方式是使用FileProvider,也可以使用ContentProvider

Eg:调用系统相机拍照并存入指定路径中

Api24之前,可以这样

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); Uri uri = Uri.fromFile(sdcardTempFile);

intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);

Target=24时,会报crash FileUriExposedException

Target24上的正确方法是:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); ContentValues contentValues = new ContentValues(1); contentValues.put(MediaStore.Images.Media.DATA, sdcardTempFile.getAbsolutePath());

Uri uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,contentValues);

或者使用FileProvider方式

这块儿,分享模块或者其他有 调起三方应用并给其传递我们应用理解的图片等文件资源的话,会存在这个问题。这块儿有个帖子写到了他们的解决办法

http://www.jianshu.com/p/68a4e8132fcd

四,屏幕缩放

Android 7.0 支持用户设置显示尺寸,以放大或缩小屏幕上的所有元素,从而提升设备对视力不佳用户的可访问性。用户无法将屏幕缩放至低于最小屏幕宽度


在android N上,Setting多了一个Display size设置,更改这个属性,系统会以如下方式通知正在运行的应用:

A.如果是面向API级别23或更低版本系统的应用,系统会自动终止其所有后台进程。这意味着如果用户切换离开此类应用,转而打开Settings屏幕并更改Display size设置,则系统会像处理内存不足的情况一样终止该应用。如果应用具有任何前台进程,则系统会如处理运行时更改中所述将配置变更通知给这些进程,就像对待设备屏幕方向变更一样。

B.如果是面向Android 7.0的应用,则其所有进程(前台和后台)都会收到有关配置变更的通知

在这里,需要测试这几个方面的问题:

a.界面显示问题,既在用户更改了这个属性时,整个界面元素的大小都会变化,需要测试此时我们的界面是否ok

b.当设备配置发生变更时,更新任何与密度相关的缓存信息

五,NDK应用链接至平台库

从 Android 7.0 开始,系统将阻止应用动态链接非公开 NDK 库,这种库可能会导致您的应用崩溃。

即使您的代码可能不会链接私有库,但您的应用中的第三方静态库可能会这么做。因此,所有开发者都应进行相应检查,确保他们的应用不会在运行 Android 7.0 的设备上崩溃。

Logcat会给我们一些提示。

应用面向 API 级别 24 或更高级别,logcat 会生成以下运行时错误,您的应用可能会崩溃:

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"

("/system/lib/libcutils.so") needed or dlopened by

"/system/lib/libnativeloader.so" is not accessible for the namespace

"classloader-namespace"

at java.lang.Runtime.loadLibrary0(Runtime.java:977)

at java.lang.System.loadLibrary(System.java:1602)

利用 Android 7.0DK 中的 readelf 工具,您可以通过运行以下命令生成给定.so文件的所有动态链接的共享库列表:

aarch64-linux-android-readelf -dW libMyLibrary.so

六,Android for Work

可以使用DevicePolicyManagewr.getWifiMacAddress()访问设备的 WLAN MAC 地址。如果设备上从未启用 WLAN,则此方法将返回一个null值。

七,权限,重要的权限需要授权。



网上很多开源的授权工具类,例如这个

https://github.com/opengit/MonkeyAndroid/blob/master/app/src/main/java/com/sunjiajia/monkeyandroid/utils/PermissionsUtil.java

八,其他

悬浮窗授权。 很多时候程序里面有在当前界面弹出一个授权窗口,引导用户去授权或者开启辅助选项等。在api24上,需要对在当前页面弹窗这一动作授权

Note:If the app targets API level 23 or higher, the app user must explicitly grant this permission to the app through a permission management screen. The app requests the user's approval by sending an intent with actionACTION_MANAGE_OVERLAY_PERMISSION. The app can check whether it has this authorization by callingSettings.canDrawOverlays().

Constant Value: "Android.permission.SYSTEM_ALERT_WINDOW"

代码如下:

if (Build.VERSION.SDK_INT >= 23) {

if(!Settings.canDrawOverlays(getApplicationContext())) {

//启动Activity让用户授权

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);

startActivity(intent);

return;

} else {

//执行6.0以上绘制代码

}

} else {

//执行6.0以下绘制代码

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,377评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,880评论 25 707
  • 2017年5月17日 Kylin_Wu 标注(★☆)为考纲明确给出考点(必考) 常见手机系统(★☆) And...
    Azur_wxj阅读 1,803评论 0 10
  • 我想对 这个世界 说一声 平安 我想对 所有的人们 道一声 平安 我知道 你们忙碌着 疲惫着 过完今天 我也知道 ...
    彼得王子阅读 96评论 0 0
  • 西安之行,旅途开始。火车千里,欢声笑语。课上游戏,其乐融融。竞答知识, 答题抢包。兴庆公园,大雨滂沱,沉香避雨,别...
    佩妍阅读 151评论 1 0