每次看见谷歌发布新的android系统时,心里总有有一些小激动。对你没听错,小激动;想想看我们对应用究竟会不会崩溃呢?那些功能失效了?会有多少用户投诉? 惊不惊喜,意不意外?不过都是玩笑话了,只有谷歌不断对升级,android才能更加进步,作为一个android程序员,我是支持他的!
首先整体看一下8.0 : 官网的英文描述是smarter、faster;Android8.0是全新版本,它优化了电源及性能,并提供了多种全新的方式来扩展您的应用,针对 Android 8.0 开发应用,并在您的应用中利用最新的平台功能。规划对新的后台限制模型的支持,并尝试诸如自动填充、XML 中的字体资源、自动调整 TextView 的大小、WebView 增强功能等一些全新 API。
想尝尝鲜?没问题。打开您的AndroidStudio更新构建配置将 compileSdkVersion、buildToolsVersion、targetSdkVersion 和 Support Library 版本更新为下列版本:
android { compileSdkVersion 'android-O' buildToolsVersion '26.0.0-rc2' defaultConfig { targetSdkVersion 'O' } ...}dependencies { compile 'com.android.support:appcompat-v7:26.0.0-beta1'}// REQUIRED:Google's new Maven repois required for the latest// support library that is compatible with Android 8.0repositories { maven { url 'https://maven.google.com' }}
注意啦,注意啦,这是谷歌大大的原话——您不能在此配置下发布应用。“O”版本是一个临时 API 级别,只能用于 Android 8.0 期间的开发和测试。您必须等到最终 API 级别发布时再发布 Android 8.0 变更,届时再次更新配置。
于是我就想说,市场上涌现出来的那些8.0系统,你们是想闹哪样?先挖点坑给大家尝尝鲜?
来来来,我们先一起愉快的填填坑吧!
坑1——后台执行限制:
如果针对 Android 8.0 的应用尝试在不允许其创建后台服务的情况下使用 startService() 函数,则该函数将引发一个 IllegalStateException。
坑2——后台位置限制:
Fused Location Provider (FLP)
Geofencing
GNSS Measurements
Location Manager
Wi-Fi Manager
为确保您的应用按预期方式运行,请完成以下步骤:
查看您的应用的逻辑,并确保您使用的是最新的位置 API。
测试您的应用是否在每个用例中都表现出预期行为。
考虑使用Fused Location Provider (FLP)或地理围栏来处理依赖于用户当前位置的用例。
说多了都是泪呀,每次升级都要整一些幺蛾子出来,测试您使用的用例是否表现出预期行为。。。。心中某些动物一直在奔腾。。。
坑3——记录未捕获的异常
如果某个应用安装的 Thread.UncaughtExceptionHandler 未移交给默认的 Thread.UncaughtExceptionHandler,则当出现未捕获的异常时,系统不会终止应用。从 Android 8.0 开始,在此情况下系统将记录异常堆栈跟踪情况;在之前的平台版本中,系统不会记录异常堆栈跟踪情况。我们建议,自定义 Thread.UncaughtExceptionHandler 实现始终移交给默认处理程序处理;遵循此建议的应用不受 Android 8.0 此项变更的影响。
这个就牛逼了,谷歌大大发话了,你捕捉了老子的异常,老子就不干活了!应用不会挂了,系不系很牛逼,你会让用户玩一个僵尸应用吧。
坑4——提醒窗口
如果应用使用SYSTEM_ALERT_WINDOW权限并且尝试使用以下窗口类型之一来在其他应用和系统窗口上方显示提醒窗口:
TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
...那么,这些窗口将始终显示在使用TYPE_APPLICATION_OVERLAY窗口类型的窗口下方。如果应用针对的是 Android 8.0,则应用会使用TYPE_APPLICATION_OVERLAY窗口类型来显示提醒窗口。
如需了解详细信息,请参阅针对 Android 8.0 的应用的行为变更内的提醒窗口的常用窗口类型部分。
坑5——硬件序列号
Build.SERIAL 已弃用。需要知道硬件序列号的应用应改为使用新的Build.getSerial()函数,该函数要求具有READ_PHONE_STATE权限。
坑6——隐私升级
LauncherAppsAPI 不再允许工作资料应用获取有关主个人资料的信息。当某个用户在托管配置文件中时,LauncherAppsAPI 的行为就像同一配置文件组的其他配置文件中未安装任何应用一样。和之前一样,尝试访问无关联的个人资料会引发 SecurityExceptions。
对于这个坑,我只想说谷歌大大干得漂亮!
采完坑的感觉有没有很爽?来点其他的刺激一下?不得不说安全和隐私,每个版本谷歌都在下功夫去做(对,没错,如果你被面试问到android的最近几个版本的区别,你就大声喊出来安全和隐私都在逐步提升)。
简单的看一下吧,毕竟是好东西:
1、如果您的应用的网络安全性配置选择退出对明文流量的支持,那么您的应用的WebView对象无法通过 HTTP 访问网站。每个WebView对象必须转而使用 HTTPS。
2、除非身份验证器拥有用户帐号或用户授予访问权限,否则,应用将无法再访问用户帐号。仅拥有GET_ACCOUNTS权限尚不足以访问用户帐号。要获得帐号访问权限,应用应使用AccountManager.newChooseAccountIntent()或特定于身份验证器的函数。获得帐号访问权限后,应用可以调用AccountManager.getAccounts()来访问帐号。Android 8.0 已弃用LOGIN_ACCOUNTS_CHANGED_ACTION。相反,应用在运行时应使用addOnAccountsUpdatedListener()获取帐号更新信息
3、系统属性 net.dns1、net.dns2、net.dns3 和 net.dns4 不再可用,此项变更可加强平台的隐私性。
4、修正的权限授予的bug
5、此平台不再支持 SSLv3。
6、在与未正确实现 TLS 协议版本协商的服务器建立 HTTPS 连接时,HttpsURLConnection不再尝试回退到之前的 TLS 协议版本并重试的权宜方法。
7、Android 8.0 将使用安全计算 (SECCOMP) 过滤器来过滤所有应用。允许的系统调用列表仅限于通过 bionic 公开的系统调用。此外,还提供了其他几个后向兼容的系统调用,但我们不建议使用这些系统调用。
8、现在,您的应用的WebView对象将在多进程模式下运行。网页内容在独立的进程中处理,此进程与包含应用的进程相隔离,以提高安全性。
9、您无法再假定 APK 驻留在名称以 -1 或 -2 结尾的目录中。应用应使用sourceDir获取此目录,而不能直接使用目录格式。
10、对于ota升级方面优化了ANDROID_ID
我家娃要醒了,就这样吧,还有很多精彩大家自己去探索吧!