本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发。

Android适配系列:

  • Android 6.0 的动态权限管理

  • Android 7.0脱坑指南

  • Android 8.0适配指北

  • Android 9.0 适配指南

这篇文章所写的前三个问题是自己现实遇到的,后三个是收集来的没有验证,作为记录以备不时之需。

1.安装时解析错误

我们的App通常会有检查更新的功能。用户在收到提示更新并且下载完后,会自动打开安装页面让用户来去安装。这时就会出现安装错误的问题,这类的问题的可能性比较多。比如较低版本的App想要覆盖已有的较高版本App会提示安装未完成,或是签名不一致导致的。不过7.0上常见的有以下两种情况。

1.应用间共享文件

targetSdkVersion大于等于的24的App中,但是我们没有去适配7.0。那么在调用安装页面,或修改用户头像操作时,就会失败。那么就需要你去适配7.0或是将targetSdkVersion改为24以下(不推荐)。适配的方法这里就不细讲,大家可以看鸿洋大神的 Android 7.0 行为变更 通过FileProvider在应用间共享文件吧 这篇文章。

2.APK signature scheme v2

Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。详细看安卓官方说明。

简单地说就是任何方式的篡改APK 文件,在利用了V2签名的apk上会失效。

我所用的Android Studio目前是2.3.3 在 Gradle 2.2.3时。打包页面是这样

可以看到默认是V1 和V2选中的。

1)只勾选v1签名就是传统方案签署,但是在7.0上不会使用V2安全的验证方式。
2)只勾选V2签名7.0以下会显示未安装,7.0上则会使用了V2安全的验证方式。
3)同时勾选V1和V2则所有版本都没问题。

这里问题就来了,默认全部勾选,按道理所有版本是没有问题的。那么我们为什么还是安装错误?其实是因为我们项目采用了美团的快速生成渠道包方案。这种方案不适用于V2的签名方案。(因为实现思路就是给已有的apk文件中添加空的渠道文件)

解决办法:

1.如果你的渠道较少,可以用gradle方式的多渠道打包。渠道多的话就不适用了。

2.毕竟V2不是强制的,那么我们要用传统方案签署,可以打开模块级build.gradle 文件,然后将行v2SigningEnabled false 添加到您的版本签名配置中:

android {...defaultConfig { ... }signingConfigs {release {storeFile file("myreleasekey.keystore")storePassword "password"keyAlias "MyReleaseKey"keyPassword "password"v2SigningEnabled false  //<--这里}}}

或者将Gradle 升级为2.3以上。那么打包页面是这样

我们可以不勾选V2选项。

3.前两种方法是比较快速的可以解决问题,但是一旦这种安全措施被强制(毕竟我们可以感受到安卓在安全方面的努力,比如权限控制、应用间共享文件),我们怎么办。其实美团早早发现了这个问题,具体看这篇 新一代开源Android渠道包生成工具Walle。里面有深度的原理讲解,满满的干货。

2.PopupWindow位置不正确

7.0系统的手机上,PopupWindow弹出位置不正确。有两种可能:

1.我们使用了update方法,同时设置了GravityGravity.NO_GRAVITY没事)。因为在update方法中有调用computeGravity方法去获取Gravity。(7.0以下没有获取Gravity进行更新判断)

 public void update() {// 省略部分代码final int newGravity = computeGravity();if (newGravity != p.gravity) {p.gravity = newGravity;update = true;}if (update) {setLayoutDirectionFromAnchor();mWindowManager.updateViewLayout(mDecorView, p);}}

Android 7.0computeGravity方法源码

private int computeGravity() {int gravity = Gravity.START | Gravity.TOP;if (mClipToScreen || mClippingEnabled) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity;
}

Android 7.1computeGravity方法

private int computeGravity() {int gravity = mGravity == Gravity.NO_GRAVITY ?  Gravity.START | Gravity.TOP : mGravity;if (mIsDropdown && (mClipToScreen || mClippingEnabled)) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity;
}

很显然在7.0上我们设置的Gravity被覆盖了。解决就很简单了,不使用update方法。如果你真的要使用可以参考这篇文章的方法。

2.PopupWindow高度为MATCH_PARENT,在显示的时候调用showAsLocation方法时,PopupWindow并没有在指定控件的下方显示。如果使用showAsDropDown,会全屏显示。

解决方法:

1.最简单的解决方法就是指定 PopupWindow 的高度为 WRAP_CONTENT, 调用 showAsDropDown方法。

2.或者弹出时做一下判断处理(代码来自PopupWindowCompat)

if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度为match_parent时,会出现兼容性问题,需要处理兼容性int[] location = new int[2]; // 记录anchor在屏幕中的位置anchor.getLocationOnScreen(location);int offsetY = location[1] + anchor.getHeight();if (Build.VERSION.SDK_INT >= 25) { // Android 7.1 ,8.0中,PopupWindow高度为 match_parent 时,会占据整个屏幕// 故而需要在 Android 7.1上再做特殊处理int screenHeight = ScreenUtils.getScreenHeight(context); // 获取屏幕高度popupWindow.setHeight(screenHeight - offsetY); // 重新设置 PopupWindow 的高度}popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);
} else {popupWindow.showAsDropDown(anchor);
}

3.后台优化

小伙伴们都知道在Android中有一些隐式广播,使用这些隐式广播可以做一些特定的功能,如,当手机网络变成WiFi时自动下载更新包等。 但,这些隐式广播会在后台频繁启动已注册侦听这些广播的应用,从而带来很大的电量消耗,为缓解这一问题来提升设备性能和用户体验,在Android 7.0中删除了三项隐式广播,以帮助优化内存使用和电量消耗。

Android 7.0 应用了以下优化措施:

  • 在 Android 7.0上 应用不会收到 CONNECTIVITY_ACTION 广播,即使你在manifest清单文件中设置了请求接受这些事件的通知。 但,在前台运行的应用如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。
  • 在 Android 7.0上应用无法发送或接收 ACTION_NEW_PICTUREACTION_NEW_VIDEO 类型的广播。

应对策略:Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 例如,JobScheduler API
提供了一个稳健可靠的机制来安排满足指定条件(例如连入无线流量网络)时所执行的网络操作。 您甚至可以使用 JobScheduler API 来适应内容提供程序变化。

另外,大家如果想了解更多关于后台的优化可查阅后台优化。

移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。 目前,可以通过在应用清单中注册一个接收器来侦听隐式 CONNECTIVITY_ACTION 广播,
让应用能够监控这些变更。 由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。

以上内容来自这里

4.多语言特性

首先是官方的API指南:语言和语言区域

变化对比: Android 7.0多语言支持开发浅析

实现功能: Android 实现应用内置语言切换

5.通知栏适配

这里有一篇非常详细的通知栏介绍与适配,分享给大家:Android通知栏介绍与适配总结

6.WebView问题

  • Android 7.0 WebView 部分机型打不开

  • Android 7.0 WebView 二级跳转后界面空白


2019.04.23补充

7.Toast导致的BadTokenException

  • 同学,你的系统Toast可能需要修复一下

最后觉得不错,点个赞吧!

Android 7.0脱坑指南相关推荐

  1. 开发工具总结(4)之Android Studio3.0填坑指南

    序言 Android Studio 3.0 上篇讲了: 全面总结Android Studio2.X的填坑指南 这篇讲一下AS3.0的坑.. 作为这个世界上走在最前沿的生物"猿",怎 ...

  2. 技术人综合症脱坑指南

    We_Can_Do_It.jpg 上周遇到一设计师,改了几次设计稿,在电话中尥蹶子不干了.boss在边低声问:"设计师都这样?" 其实心高气傲的岂止是设计师?程序员,工程师,大部分 ...

  3. [专栏精选]Unity中编码Encoding脱坑指南

    本文节选自洪流学堂公众号技术专栏<大话Unity2018>,未经允许不可转载. 洪流学堂公众号回复专栏,查看更多专栏文章. 洪流学堂,让你快人几步.你好,我是郑洪智. 大智:"昨 ...

  4. android 字体文件压缩,Android 字体使用踩坑指南

    Android 字体使用踩坑指南 最近项目改版,根据ui的设计,需要使用到三字体.在使用过程中遇到一些坑,于是有了这个避坑指南! 字体压缩 第一个坑!字体库的体积太大. 字体压缩的前提是要使用的内容是 ...

  5. Redis 脱坑指南

    原文地址:Redis 脱坑指南 博客地址:http://www.extlight.com 一.前言 Redis 是一款 key-value 内存数据库.由于其上手快,执行效率高,拥有多种数据结构,支持 ...

  6. STM8S系列单片机脱坑指南

    STM8S脱坑指南 你好!这是你第一次使用 STM8S003K3 .如果你想学习如何使用STM8S003K3, 可以速速滚蛋,因为这一点也不好玩.理由如下: 1.参考资料少 2.官方资源少且混乱 3. ...

  7. 关于Android studio3.0的坑之butterknife 7.0.1(低版本)

    关于Android studio3.0的坑之butterknife 7.0.1(低版本) 我们在AS3.0里面是无法直接使用butterknife 内库插件的,会报错,如下图: 接下来看看怎么设置呢? ...

  8. 关于Android studio3.0的坑之butterknife 8.4.0

    关于Android studio3.0的坑之butterknife 8.4.0 大家都知道新版本问题很多,butterknife 8.4.0版本无法直接使用要配置很多东西: 首先得安装butterkn ...

  9. mac下编译android源码避坑指南(新)

    截至目前mac环境下android源码编译最新避坑指南 避坑方法 配置(不说配置的都是耍流氓) 下载 编译 烧录 注意事项 避坑方法 源码.SDK.机型版本一定要清楚,有些特殊的版本需要特殊的方法,官 ...

最新文章

  1. mysql 排序取前4_MySQL时间段分组排序后取前10的问题?
  2. 一级计算机基础第四套,《计算机应用基础》第四套考试与答案.doc
  3. POJ 1185 炮兵阵地 【状压DP】
  4. 从浏览器中下载文件如何修改默认保存位置
  5. mysql怎么获得权限_mysql怎么给用户加权限
  6. oracle ola_Ola HallengrenSQL Server维护解决方案–索引和统计信息维护
  7. 计算机被格式化怎么找回资料,电脑文档被格式化,怎么恢复格式化文档
  8. 做一个简易jsp项目的详细开发流程及步骤
  9. 九款个人知识管理工具介绍
  10. Django order by 高级用法
  11. 英语 语义分割_语义分割该如何走下去?
  12. C# 进行 Starlink 仿真03:72轨道面 * 22颗卫星 F相位因子==11 的Walker星座,创建3168条星间链路,并与 icarus 论文的Python结果相对比。
  13. hadoop-HFDS
  14. 小记——linux定时器之alarm
  15. 山东畜牧兽医职业学院计算机考试,山东畜牧兽医职业学院计算机自编word15套试题11Word模拟试题(1-15)...
  16. 台式电脑显示屏显示html,台式机电脑屏幕突然出现彩色条纹原因及解决方法
  17. Robbins-Monro 随机逼近算法和序列学习(Sequential Learning)
  18. #9733;一名“标题党”自我修炼的10…
  19. body软件 human_人体系统女性3D软件破下载|人体系统女性3d专业中文版下载v1.0(Human body female)-乐游网安卓下载...
  20. ElasticSearch十四--ES-index template 和 aggregation聚合分析

热门文章

  1. 《增长黑客》- 读书笔记(三)北极星指标拆解
  2. 今年就业形势真的这么差吗????我们公司今天是好拾漏捡宝了
  3. 【CV】医学图像|乳腺癌组织病理图像分类研究
  4. 王立铭紧急发声:为什么基因编辑婴儿在今天不可原谅?
  5. kubernetes下的Nginx加Tomcat三部曲之三:实战扩容和升级
  6. 中国软件杯 公共地点人流量计算的云监管平台 业务部分思路分享
  7. 【2018ccpc网络赛1008】【hdu6445】Search for Answer 题解
  8. 基于 RT-Thread 的智能家居 DIY 教程连载(3)——文件系统灵活用
  9. Android歌词秀设计思路(8)后记
  10. js的最好写法(转)