Android 早知道(201908)

万物都是变化的,不变的只有变化 — Android 技术迭代更新很快,各种新出的技术和名词也是层出不穷。

一、AndroidX

不知从什么时候开始,总是会时不时听到 AndroidX 这个名词,到底什么是 AndroidX ?

1.1 AndroidX 的前世今生

Android 系统在刚刚面世的时候,可能连它的设计者也没有想到它会如此成功,因此也不可能在一开始的时候就将它的 API 考虑的非常周全。随着 Android 系统版本不断地迭代更新,每个版本中都会加入很多新的 API 进去,但是新增的 API 在老版系统中并不存在,因此这就出现了一个向下兼容的问题。

现在Android官方支持的最低系统版本已经是 4.0.1,对应的 API 版本号是 15。support-v4、appcompat-v7 库也不再支持那么久远的系统了,但是它们的名字却一直保留了下来,虽然它们现在的实际作用已经对不上当初命名的原因了。

那么很明显,Android 团队也意识到这种命名已经非常不合适了,于是对这些 API 的架构进行了一次重新的划分,推出了 AndroidX。因此,AndroidX 本质上其实就是对Android Support Library 进行的一次升级,升级内容主要在于以下两个方面。

  • 包名。之前 Android Support Library 中的 API,它们的包名都是在 android.support.* 下面的,而 AndroidX 库中所有 API 的包名都变成了在 androidx.* 下面。这是一个很大的变化,意味着以后凡是 android.* 包下面的 API 都是随着 Android 操作系统发布的,而 androidx.* 包下面的 API 都是随着扩展库发布的,这些 API 基本不会依赖于操作系统的具体版本。

  • 命名规则。吸取了之前命名规则的弊端,AndroidX 所有库的命名规则里都不会再包含具体操作系统 API 的版本号了。比如,像 appcompat-v7 库,在 AndroidX 中就变成了 appcompat 库。

1.2 AndroidX 的应用

一个 AndroidX 完整的依赖库格式如下所示:

implementation 'androidx.appcompat:appcompat:1.0.2'

了解了 AndroidX 是什么之后,就知道它其实并不是什么全新的东西,而是对 Android Support Library 的一次升级。因此,AndroidX 上手起来也没有任何困难的地方,比如之前你经常使用的 RecyclerView、ViewPager 等等库,在 AndroidX 中都会有一个对应的版本,只要改一下包名就可以完全无缝使用,用法方面基本上都没有任何的变化。

但是有一点需要注意,AndroidX 和 Android Support Library 中的库是非常不建议混合在一起使用的,因为它们可能会产生很多不兼容的问题。最好的做法是,要么全部使用AndroidX 中的库,要么全部使用 Android Support Library 中的库。

而现在 Android 团队官方的态度也很明确,未来都会为 AndroidX 为主,Android Support Library 已经不再建议使用,并会慢慢停止维护。另外,从 Android Studio 3.4.2 开始,我发现新建的项目已经强制勾选使用 AndroidX 架构了。

1.3 旧项目的 AndroidX 支持

那么对于老项目的迁移应该怎么办呢?由于涉及到了包名的改动,如果从 Android Support Library 升级到 AndroidX 需要手动去改每一个文件的包名,那可真得要改死了。为此,Android Studio 提供了一个一键迁移的功能,只需要对着你的 项目名右击 -> Refactor -> Migrate to AndroidX,就会弹出如下图所示的窗口。

这里点击 Migrate,Android Studio 就会自动检查你项目中所有使用 Android Support Library 的地方,并将它们全部改成 AndroidX 中对应的库。另外 Android Studio 还会将你原来的项目备份成一个 zip 文件,这样即使迁移之后的代码出现了问题你还可以随时还原回之前的代码。

二、Android 10 (Android Q)

近日,Google 官方宣布,将结束以“甜点”命名 Android 系统的方式,即将推出的 Android Q 将被命名为 Android 10。

此外,谷歌还推出了全新的 Android Logo。新款 Logo 将文字颜色从绿色改为黑色,但保留了以往安卓小机器人的标识。Google 更新了新的 Android 系统的 Logo。对原来的绿色进行了调整,其中文字部分的绿色直接变为了黑色。Google 发现,绿色难以识别,特别是对于有视力障碍的人。

Google 认为以甜点命名操作系统的做法虽然有趣,但 Android 作为一款全球性质的操作系统,这样的命名无法让使用者对名称的理解达成一致,也可能有无法区分新版本和老版本的区别。例如,在某些语言中,L 和 R 是不可区分的,因此可能 Android Lollipop 的命名会使人有困扰。这也有可能使使用 Android 系统的人,无法确认自己使用的是不是最新的操作系统。

新特性:

  • 设备位置:让用户能够控制应用程序何时可以获得位置信息,包括应用程序何时不使用位置信息。用户可以设置应用程序无法使用位置信息,可以选择只有应用程序在运行或者在后台运行时才能使用其位置信息。

  • 存储:Android Q 开发者预览版提供对共享文件访问的更多控制。用户将能够通过权限控制应用程序对照片、视频和音频集的访问。应用程序必须使用系统文件选择器进行数据下载,这能够让用户决定应用程序可以访问哪些下载文件。开发人员还必须改变应用程序在外部存储上使用共享区域的方式。

  • 后台运行:减少应用程序意外跳出并占据屏幕等干扰。应用程序将被禁止在后台启动 Activity 组件。应用程序开发人员可以通过高优先级通知或全屏图快速吸引用户的注意力,比如来电或警报应用。

  • 用户数据ID:Android Q 开发者预览版限制对不可重置设备标识符的访问,其中包括设备 IMEI、序列号和类似标识符。默认情况下,当连接到不同的 Wi-Fi 网络时,Android Q 也会随机分配设备的 MAC 地址。

  • 对可折叠屏幕的支持:应用程序将能够更好地适配可折叠屏幕和其他大屏幕设备。

  • 共享快捷方式:在全新操作系统下,应用程序能够与其他应用更快共享快捷方式,用户直接跳转到另一个应用共享内容的速度会变得更快。

  • 设置面板:能够在应用程序上下方直接显示关键系统设置。新的设置面板 API 使用 Android 9 Pie 中引入的 slice 功能,为用户提供一个带有相关系统设置(如 Wi-Fi、飞机模式、移动数据、NFC和音频音量)的浮动 UI。用户无需离开应用程序进行系统设置。

  • Sharing Shortcuts:允许用户直接跳转至另一个应用进行分享。开发者首先需要发布一个分享目标,该目标随后会在应用中启动一个包含内容附件的特定 Activity,并通过 share UI 显示给用户。因为分享目标已提前发布,所以 share UI 可在 Activity 启动后立即加载分享内容。

  • 连接权限、隐私和安全性:对于蓝牙、蜂窝网络和 Wi-Fi 连接,需要 FINE 位置权限,从而提高设备连接家庭、工作网络以及开放网络的安全性。

  • 改进的点对点(peer-to-peer)和互联网连接:对 Wi-Fi 堆栈进行了重构,以改善隐私、性能以及管理物联网设备和建议互联网连接等常见用例。Android Q 将自行处理 Wi-Fi 扫描,在 Wi-Fi 选择列表中显示匹配网络,并在这些网络的范围内根据历史记录进行连接。

  • Wi-Fi 性能模式:高性能和低延迟模式允许开发人员调用相应函数请求自适应 Wi-Fi。谷歌希望这些功能有助于实时游戏、活动语音呼叫等类似用例。

  • 支持动态深度图像:应用程序可以请求动态深度图像,该图像包含一个 JPEG、与深度相关的 XMP 元数据,以及嵌入在同一文件中的深度和置信度图。这使得开发人员可以支持 3D 图像和 AR 摄影等用例。动态深度将是 Android 生态系统中的一种开放图像格式。

  • 全新的音频视频编码解码器:支持开源视频编解码器 AV1,音频编码 Opus 以及 HDR10+。

  • 原生 MIDI API:这个 API 允许在 C++ 环境中执行音频处理的应用程序通过 NDK 与 MIDI 设备通信。它允许使用非阻塞读取在音频回调中检索 MIDI 数据,从而支持对 MIDI 消息(示例应用程序源代码)进行低延迟处理。

  • 支持 Vulkan 原生渲染引擎 ANGLE:对渲染引擎 ANGLE 的支持使得应用 OpenGL ES 的应用程序和游戏将能够利用 Vulkan 的性能和稳定性,自由度和开放度都非常高。

  • Vulkan 扩展:谷歌正在与设备制造商合作伙伴合作,使所有运行 Android Q 或更高版本 64 位设备能够兼容 Vulkan 1.1。因此,Vulkan 将成为应用程序和游戏所使用的统一高性能图形 API。

  • 神经网络 API 1.2:其中包括 60 个新项目,包括 ARGMAX, ARGMIN,量化 LSTM,以及一系列性能优化。谷歌正在与硬件供应商和诸如 TensorFlow 等主流机器学习框架合作,优化对 NNAPI 1.2 的支持。

  • ART 性能:继续改进应用运行模式,帮助应用程序启动更快,消耗更少的内存,并帮助应用程序在低端设备上运行得更好。

  • 所有 TLS 连接都默认添加并启用了对 TLS 1.3 支持。谷歌表示,其基准测试表明,与 TLS 1.2 相比,使用 TLS 1.3 可以更快建立安全连接,速度高达 40%。

  • 通过公共 API 实现更多兼容性:谷歌限制了对更多非 SDK 接口的访问,并要求开发人员使用公共接口。

三、Android Studio 3.5 稳定版发布

谷歌发布了稳定版的 Android Studio 3.5,Project Marble 也同样是稳定版。此版本解决了,包括修复 600 多个 bug、50 个内存泄漏、20 个 IDE 挂起以及改进 XML & Kotlin 类型延迟等一系列问题。此外,对于 Android 模拟器,减少了 CPU 和内存对用户开发机器的影响。再也不用担心 AS 内存溢出了!

特性和改进:

Layout Editor:Google 改进了从约束选择和删除到更好的设备预览调整大小等一系列交互

Data-Binding:Google 团队研究了长期存在的数据绑定问题。从性能的角度来看,发现在 XML 文件中创建数据绑定表达式会导致代码编辑器严重挂起。修复了这个问题之后,改进了代码补全、导航和重构。在 Android Studio 3.5 中,改进输入延迟,用 XML 编辑数据绑定表达式的速度更快

Build Speed:Android 应用程序开发的另一个长期问题是构建应用程序所需的时间。新版的 Android Studio 为应用程序编译带来了两个显著的改进,第一个是注解处理器中添加了增量构建支持,包括 Glide、AndroidX 数据绑定、Dagger,、Realm 和 Kotlin(KAPT)。第二个改进涉及 Windows 上的磁盘 I/O。Windows Defender(现在称为 Windows Security)具有实时扫描文件(创建或修改文件时)的功能,以保护用户免受恶意软件的攻击。Android Studio 3.5 将显示一个提示,说明你可以采取哪些步骤将项目目录排除在这个实时保护之外,完成最佳设置以加快构建速度。增量支持可以对构建速度产生显著影响。例如,在初步分析中,仅为 Kotlin 添加增量支持就将谷歌 I/O schedule 应用程序的非 ABI 子模块更改从 9.1 秒提高到了 3.6 秒–提高了 60%

Apply Changes 能够在不重启应用程序的情况下快速编辑和查看代码更改,这对于应用程序开发非常高效。比如改了个 Java 某行代码,可以通过 Apply Changes,然后 Run。两年前,Google 尝试使用 Instant Run 机制来解决这个痛点,但一直效果未能达到预期。在 Android Studio 3.5 中重新构建并实现了一个更实用的方法,叫做 Apply Changes。Apply Changes 使用 Android Oreo 及更高版本的特定于平台的 API,以确保可靠和一致的行为;与 Instant Run 机制不同,Apply Changes 更改不修改 APK。为了支持这些更改,Google 团队重新设计了整个部署管道的架构,以提高部署速度,还调整了 run 和 deployment 工具栏按钮,以获得更流畅的体验。

APP 部署:该版本有一个新的下拉菜单,可以快速选择要将应用程序部署到哪个设备。此菜单还包括一个新选项,允许一次在多个设备上运行应用程序。

系统健康—自动推荐内存设置,默认情况下,Android Studio 的最大内存堆大小为 1.2 GB。对于很多大项目来说,这个数量可能不够。即使你的机器有大量 RAM, IDE 也不会超过这个值。在 Android Studio 3.5 中,IDE 会识别出一个应用程序项目在内存容量更高的机器上什么时候需要更多内存,并在通知中通知你增加内存堆大小。另一种方式,你也可以在Appearance & Behavior → Memory Settings 的新设置面板中进行调整

系统健康-IDE速度,过去,觉得 IDE 运行慢时,就关闭一些 Android Studio 插件,比如 Android NDK 支持,以提高性能,让他为我们更高效使用。这一次,Android Studio 3.5 开始,Google 团队删除了一些不必要的 performance hotspots,因为这些 performance hotspots 之前影响了 IDE 的整体速度

系统健康-Lint 代码分析 Lint 代码分析,在公司用这个扫描一些提示错误和无用文件时,还有可能会出现的空指针情况,非常方便。Android Lint 是 Android Studio 中的一个代码分析框架,可以帮助识别常见的编程错误。但是有的工程是有 c/c++ 的,每次分析时,相当慢。大概 20-30 分钟。这严重影响了我的热情。Google 团队经过一些挖掘,在 Android Studio 3.5 后,发现并修复了几个较大的内存泄漏,导致 Lint 性能提高了大约 2 倍

Sync重编译:明明项目没有问题,也可以编译运行到手机上,就是在应用程序代码中有红色符号,解决办法就是重新 gradle sync 下。出现的许多红色符号事件的根本原因是,在最近的 Gradle 更改中,为了节省硬盘空间,这些缓存被定期删除了。从 Android Studio 3.5 后,Google 团队增加了检查这种状态的条件逻辑,以后类似的情况会很少了

c++ 的改进:c++ 项目支持也是项目 Marble 中的一个重点领域。对于大型项目,CMake 构建现在要快 25%。此外,一个改进的单一构建变量用户界面面板,它允许开发者单独指定 ABI 架构目标。最后,Android Studio 3.5 允许在构建中并排使用多个版本的 Android NDK 的 Grale 版本,这就意味着多重构建,并减轻 NDK 版本和 Android gradle 插件之间的不兼容性。