让您的应用兼容 Android Oreo
不知不觉Android Oreo已经发布几个月时间了,你的应用开始使用最新平台了吗?在应用迁移过程中是否遇到了一些棘手问题?你的Android应用兼容Oreo如何呢?
我们应该都知道,每一次重大升级,在兼容性这一块总会出现或多或少的问题,今天就来一起探讨应用的兼容性。
不知道大家是否还记得,从Android 7.0更新后兼容性测试数据结果得知,Top1000主流应用中不兼容应用数量达到166个,导致总体兼容率仅为83%,相比之前Android 6.0 的更新所导致的应用不兼容问题更加突出。
对于本次Android 8.0升级之后的兼容性,各大应用厂商也非常关注。从本次Google 开发者大会上也能看出谷歌的用心,专门做了一个《让您的应用兼容 Android Oreo》的主题分享,这里也简单整理出来分享给大家,希望对大家将应用迁移到Android 8.0 时有一些帮助。
作为开发者,我们的应用应该保持与最新的Android版本兼容性,主要从两个方面来分享:Android 应用兼容的一些最佳实践经验和Android Oreo 中的一些改变地方。
在3月中旬发布第一个Android Oreo 预览版本的时候,发现中国的应用只有60%兼容,后来投入了很大的资源,也做了很多工作。
在8月25日正式发布后,中国Top1000主流应用中有993个兼容,目前在中国应用兼容比率达到96%。
1.非公开的API
有一些经验就是不要在开发中使用一些非公开的API,因为那些非公开的API在后期更新中可能随时会去改变函数签名或函数列表,甚至可能会被删除掉或改变它的行为。
如果有强烈愿望想要使用可以告知谷歌,会尽量搜集并提供一些公开的API提供给开发者,比如在Android Oreo 中开放了InMemoryDexClassLoader直接从内存里面加载dex,不要直接调用DexClassLoader,否则会对产生的文件造成一定影响。
2.dex / so文件
不要直接操作或篡改dex / so文件,最好使用Android Studio 或其他编译工具直接生成的dex / so文件。在apk方面也添加了更多的检查,动态连接器再向用户申请权限的时候,如可写权限和可执行权限,如果修改了so文件就可能会出错。
3.升级第三方SDK
在很多应用中有一些比较常见的第三方SDK,其中一些加固和热修复框架用了很多dex操作和私有API,这会导致当新的Android版本出现的时候,使用了这些SDK的应用会崩溃。
所以需要经常去看这些SDK是否更新,基本都会和这些SDK提供商有紧密的合作,当升级后就会尽量更新到最新版本。
4.Janus漏洞
从Android 5.0版本以后,如果应用仅仅采用SDK安卓的jarsigner签名机制,就会有一个Janus漏洞,该漏洞会利用ART来执行一个附加在APK之前的一个恶意dex文件。
目前已在12月发布的版本中修复,用户可以更新补丁,建议开发者使用V1+V2签名机制。
5.隐私
为了用户的安全性和隐私性,Settings.secure.ANDROID_ID将根据签名密钥和用户个人资料,每次为每个应用返回不同的值,也就是说一个应用不可能会知道其他应用的ANDROID_ID,对一些广告应用查询ID后可以被用户重置。
查询net.hostname系统属性会返回空值,如果需要访问用户账号的话,GET_ACCOUNTS权限不再充分,需要使用AccountChooserActivity来弹出一个选择框来让用户进行选择。
6.警报
对于警报方面,设计了一个新的浮动层,在所有应用之上,但是会在系统和关键窗口之下。如果在Android Oreo 中继续使用SYSTEM_OVERLAY,会自动替换为APPLICATION_OVERLAY。在Android Oreo 中设置使用TYPE_APPLICATION_OVERLAY更加直观,用户也可以更加方便来进行管理行为和设置。
7.通知
在Android Oreo 中对于所有通知都必须使用通知渠道。
8.多应用窗口显示
多窗口显示也是Android Oreo 中的一个新特性,可以用一个FLAG_ACTIVITY_LAUNCH_ADJACENT来告诉系统需要使用多窗口。当然需要注意的是,只有在活跃的屏幕里面的Activity才会认为是Activity Task,而不要假设暂停的Activity。多窗口模式的切换与转屏事件是相同的,标准UI模块在这方面应该没什么问题,如果不能支持多窗口可以通过android:resizeableActivity="fasle" 来设置。
9.特长屏幕支持
Android Oreo 也支持特长屏幕,目前很多厂商都在发布特长屏幕的手机,对于很多应用来说对屏幕纵横比有一个错误的假设,否则会有上下黑色边框,或UI模块和触摸点没有对齐,或一些角落UI会被遮挡等。
如果场景不适合特长屏幕,需要应用通过以下方式设置最大纵横比:API 25或以下使用android:max_aspect meta data,API 26或以上使用android:MaxAspectRatio。
接下来着重介绍一下后台检查和位置限制,首先并不是为了给开发者添麻烦,而是为了安卓用户获得更好的系统健康和电池性能的体验,并且开发者可以开发出用户需要的功能。总而言之,一共有三个方面:
1.后台没办法再启动服务了,前台启动服务仍然是没有问题的;
2.不支持在manifest中注册的隐式广播;
对于这两个主要是Target SDK为Android Oreo 才会受影响,但是不幸的是用户现在就可以对应用启用此限制。
3.后台应用会得到更严格的限制来获取位置。是所有运行在Android Oreo 上的应用都会受到影响,需要立刻解决这方面的问题。
1.服务
最重要的原则就是用户可见。如果应用正在进行耗费资源的工作时,用户是应该知晓的,从后台启动服务会失败,会抛出一个IllegalStateException给启动该Service的调用者。
开发者在调用startService时需要判定是否位于前台,注意IntentService也是一种后台服务,可以使用新加的一个类JobIntentService,可以在很多个地方使用来替换IntentService。大多数服务没有长时间的交互,可以使用JobScheduler或者Firebase Cloud来工作,使得系统更有效的来调度工作。
2.广播
不能通过在manifest中声明接收器来接收更多的隐式广播,隐式广播是指没有明确的目标组件。如不能通过ACTION_PACKAGE_REPLACED来监视广播,但是可以使用ACTION_MY_PACKAGE_REPLACED来监视显示广播。在很多使用广播的情况下,可以使用JobScheduler来代替。
3.位置信息限制
定位非常消耗电池,当有很多应用来定位的时候,电池会消耗的很快,会导致用户体验变差,甚至有些功能会失效,因此加入了一些后台定位的限制。如果应用在前台,其位置收集策略是不变的,如果用在后台就会受到一些限制。
具体说来就是每小时只能接收到几次位置信息,而且位置信息是基于整个设备的,只要在Android Oreo 上运行都会受到限制。使用批处理会造成一定时间的延迟,但是可以获得更多的数据位置信息点,也是一个不错的选择。
Android Oreo 里面做了一些优化,GPS很精确但是非常耗电,WIFI会好一点儿但还是比较耗电,优化的是当设备保持连接在相同的静态WIFI接入点就表示用户没有从原来的位置移动太多,系统就不会进行新的位置计算。
另外还可以更好的检测在不同的WIFI之间切换,如在家和工作的时候使用安卓设备,只有在切换WIFI的时候才会更新位置,平时待在家和待在工作地方的时间段里就不会更新位置信息。
同样的策略对地理围栏也做了类似的修改,目前关于地理围栏的信息会从几十秒增加到2分钟左右,其功耗只有十分之一。
在Android Oreo 里面不可以使用PengdingIntent.getService()来获取后台更新,虽然可以继续使用,但其只在前台工作。而应该使用PengdingIntent.getBroadcast(),同时在manifest中定义一个接收器,定义为显示广播。
4.位置信息策略
如果需要在后台密集的收集位置信息应该怎么办?这里有一些办法,可以定义一些地理围栏功能,在地理围栏发生变化时可以获得确切位置,可以通过这些位置信息来知道将来如何使用Firebase Cloud来进行更新。然后使用批处理来收集更多的数据点一起返回,虽然每小时只会接收几次信息,但是可以获取更多的数据,对于很多程序来说足够了,只是不能提供实时性的位置数据。可以使用setInterval来设置更新时间,使用setMaxWaitTime来设置批处理的最大时间间隔,使用setFastestInterval来设置被动获取位置信息。
以上就是本次主题分享的大致内容,除了以上这些在开发和迁移中,还会遇见一些其他兼容性问题,会在下一篇分享中整理出来。如果你在迁移应用到Android Oreo 中也遇见了一些问题,也欢迎留言一起来探讨。
此文章版权为微信公众号分享达人秀(ShareExpert)——鑫鱻所有,若需转载请联系作者授权,特此声明!
让您的应用兼容 Android Oreo的更多相关文章
- Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView
Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView 8.0出来很久了,这个新特性已经用了很久了,但是一直没有亲自去试试.这几天新的需求来 ...
- Hi,WeTest限免开放Android Oreo云真机,Android 8.1可开测!
2017年末,谷歌在印度正式发布 Android Oreo 8.1,向实现"为所有人打造由 AI 驱动的全覆盖移动平台"这一愿景迈进.Android 8.1在引入对 Android ...
- 兼容Android的水波纹效果
Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...
- 兼容 Android 4.4 透明状态栏与导航栏
http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...
- 兼容Android 和 ios JavaScript copy paste
<!DOCTYPE html> <html> <head> <title>关于我们Frame</title> <meta charse ...
- 转:display:flex不兼容Android、Safari低版本的解决方案 【flex布局】
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- display:flex不兼容Android、Safari低版本的解决方案 【flex布局】
引自 http://www.cnblogs.com/shimily/articles/7943370.html <!DOCTYPE html> <html lang="en ...
- display Flex 盒子模型布局兼容Android UC
<!DOCTYPE html><html><head><meta charset="utf-8"><meta content= ...
- iOS获取图片的Base64String,兼容Android,java,web,jpg(jpeg),png
呃呃呃……需求的来源又是同学,对!又是! 废话不哆嗦,怎么把一张图在iOS上转一个Base64String出来,稍微了解的,或者随便搜一下,都能搞定一大堆,但是!!!! 自己(iOS)转自己用,完全没 ...
随机推荐
- 概念的理解 —— 奇点(singularity point)、第一性原理(first principle)
奇点(singularity point)一词出现在不同的环境里,对应着不同的含义: wikipedia:Singularity 文艺作品: 未来学(Futurology):比如雷·库兹韦尔的< ...
- c++ try catch 问题(没有throw就会被删除,加上/EHa这样就不会被删除)
以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: 以前都是用try{} catch(… ...
- 与Boss大雷探讨JavaWeb开发、电商与网络安全
最近几个月,与公司Boss大雷交流得比较多,也学习到了很多新的东西,了解到了一些没有接触和实践的业界做法. 简要介绍下Boss,姓雷,定居武汉好几年了,之前在一号店.UC.支付宝干过,有丰富的电商-支 ...
- bootstrap 模态框 video视频测试
链接:https://files.cnblogs.com/files/tele-share/%E8%A7%86%E9%A2%91%E6%B5%8B%E8%AF%95.7z <!DOCTYPE h ...
- 卷积与反卷积、步长(stride)与重叠(overlap)
1. 卷积与反卷积 如上图演示了卷积核反卷积的过程,定义输入矩阵为 I(4×4),卷积核为 K(3×3),输出矩阵为 O(2×2): 卷积的过程为:Conv(I,W)=O 反卷积的过称为:Deconv ...
- C++ Primer章课后编程问题
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- Android 平台下Ftp 使用模拟器需要注意的问题
以下代码在pc上测试通过,可是在android模拟器上就不工作,不过还可以链接到服务器但不能得到文件 纠结了半天,原来是模式的问题,具体请Google 模拟器中采用建议被动模式 public void ...
- PDW中的Split Querying Process
最近看了关于 SQL Server 的分布式处理方面的论文,觉得它提出的 Polybase 跟之前看过的 HadoopDB 有些神似,这里做个小总结(抽空再把 HadoopDB 的总结贴出来). 不算 ...
- vue 使用ztree
1 全局引入jquery , 不明白的看我上一个的随笔 , 特别简单 2 我没有封装组件 , 项目里面这个效果的只用了一次 , 没有必要 在你的<script>标签下面引入这俩东西 , 前 ...
- WPF中选择文件及文件夹
最近从winform转WPF,遇到了各种各样的问题.然而网上的关于WPF的资料少之又少,甚至连基本的文件选择操作,百度搜索的首页都没有一个比较好的方法.所以,踩了几个坑之后,我把我得到的方法分享给大家 ...