不知不觉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的更多相关文章

  1. Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView

    Android Oreo 8.0 新特性实战 Autosizing TextView --自动缩放TextView 8.0出来很久了,这个新特性已经用了很久了,但是一直没有亲自去试试.这几天新的需求来 ...

  2. Hi,WeTest限免开放Android Oreo云真机,Android 8.1可开测!

    2017年末,谷歌在印度正式发布 Android Oreo 8.1,向实现"为所有人打造由 AI 驱动的全覆盖移动平台"这一愿景迈进.Android 8.1在引入对 Android ...

  3. 兼容Android的水波纹效果

    Android的水波纹效果只有高版本才有,我们希望自己的应用在低版本用低版本的阴影,高版本用水波纹,这怎么做呢?其实,只要分drawable和drawablev21两个文件夹就好了. 普通情况下的se ...

  4. 兼容 Android 4.4 透明状态栏与导航栏

    http://www.apkbus.com/Android-163388-1-1.html?_dsign=73d41229 android 系统自4.2 开始 UI 上就没多大改变,4.4 也只是增加 ...

  5. 兼容Android 和 ios JavaScript copy paste

    <!DOCTYPE html> <html> <head> <title>关于我们Frame</title> <meta charse ...

  6. 转:display:flex不兼容Android、Safari低版本的解决方案 【flex布局】

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. display:flex不兼容Android、Safari低版本的解决方案 【flex布局】

    引自 http://www.cnblogs.com/shimily/articles/7943370.html <!DOCTYPE html> <html lang="en ...

  8. display Flex 盒子模型布局兼容Android UC

    <!DOCTYPE html><html><head><meta charset="utf-8"><meta content= ...

  9. iOS获取图片的Base64String,兼容Android,java,web,jpg(jpeg),png

    呃呃呃……需求的来源又是同学,对!又是! 废话不哆嗦,怎么把一张图在iOS上转一个Base64String出来,稍微了解的,或者随便搜一下,都能搞定一大堆,但是!!!! 自己(iOS)转自己用,完全没 ...

随机推荐

  1. 概念的理解 —— 奇点(singularity point)、第一性原理(first principle)

    奇点(singularity point)一词出现在不同的环境里,对应着不同的含义: wikipedia:Singularity 文艺作品: 未来学(Futurology):比如雷·库兹韦尔的< ...

  2. c++ try catch 问题(没有throw就会被删除,加上/EHa这样就不会被删除)

    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: 以前都是用try{} catch(… ...

  3. 与Boss大雷探讨JavaWeb开发、电商与网络安全

    最近几个月,与公司Boss大雷交流得比较多,也学习到了很多新的东西,了解到了一些没有接触和实践的业界做法. 简要介绍下Boss,姓雷,定居武汉好几年了,之前在一号店.UC.支付宝干过,有丰富的电商-支 ...

  4. bootstrap 模态框 video视频测试

    链接:https://files.cnblogs.com/files/tele-share/%E8%A7%86%E9%A2%91%E6%B5%8B%E8%AF%95.7z <!DOCTYPE h ...

  5. 卷积与反卷积、步长(stride)与重叠(overlap)

    1. 卷积与反卷积 如上图演示了卷积核反卷积的过程,定义输入矩阵为 I(4×4),卷积核为 K(3×3),输出矩阵为 O(2×2): 卷积的过程为:Conv(I,W)=O 反卷积的过称为:Deconv ...

  6. C++ Primer章课后编程问题

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3V1Z2xlMjAxMA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  7. Android 平台下Ftp 使用模拟器需要注意的问题

    以下代码在pc上测试通过,可是在android模拟器上就不工作,不过还可以链接到服务器但不能得到文件 纠结了半天,原来是模式的问题,具体请Google 模拟器中采用建议被动模式 public void ...

  8. PDW中的Split Querying Process

    最近看了关于 SQL Server 的分布式处理方面的论文,觉得它提出的 Polybase 跟之前看过的 HadoopDB 有些神似,这里做个小总结(抽空再把 HadoopDB 的总结贴出来). 不算 ...

  9. vue 使用ztree

    1 全局引入jquery , 不明白的看我上一个的随笔 , 特别简单 2 我没有封装组件 , 项目里面这个效果的只用了一次 , 没有必要 在你的<script>标签下面引入这俩东西 , 前 ...

  10. WPF中选择文件及文件夹

    最近从winform转WPF,遇到了各种各样的问题.然而网上的关于WPF的资料少之又少,甚至连基本的文件选择操作,百度搜索的首页都没有一个比较好的方法.所以,踩了几个坑之后,我把我得到的方法分享给大家 ...