不知不觉Android Oreo已经发布几个月时间了,你的应用开始使用最新平台了吗?在应用迁移过程当中是否遇到了一些棘手问题?你的Android应用兼容Oreo如何呢?android
咱们应该都知道,每一次重大升级,在兼容性这一块总会出现或多或少的问题,今天就来一块儿探讨应用的兼容性。安全
不知道你们是否还记得,从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)——鑫鱻全部,若需转载请联系做者受权,特此声明!