Now in Android #17 —— 最新 Android 动态分享

luyao     2020年05月08日 173次浏览

大家好,我是秉心说。最新一期的 Now in Android 又更新啦,原文地址如下:

https://medium.com/androiddevelopers/now-in-android-17-9d73f7bed7f

下面照例给大家总结归纳一波。

Android 11: Developer Preview 3

最近发布了 Android 11 开发者预览版 3,在修复以往版本带来的 bug 的同时,也发布了一些新功能。

优化 Debug

由于设备和使用场景的多样性,捕获线上问题通常都是比较困难的。如果能够在发生问题或者 crash 处得到更多的信息,对开发者无疑将会有很大帮助。

在 Android 11 上提供了两个工具来帮助我们获得这样的信息。

第一个是 ActivityManager.getHistoricalProcessExitReasons() 。通过该 API 可以获取到应用最近退出的详细原因,以帮助开发者排查问题。

另一个工具是对 Native 开发者很有帮助的 GWP-ASan ,它是一个分配采样工具,用以检测堆内存错误,且能将运行开销和对性能的影响降到最低。系统可执行文件和系统应用中已经默认启用了 GWP-ASan 。现在,你也可以为你的应用开启它。

无线调试

我们可能总是没有足够的 USB 接口(这是在吐槽 Mac 么) ,这个时候无线调试就很方便。

其实现在通过 Android Studio 插件也可以进行无线连接,但在 Android 11 中这已经是系统级功能了。

通过命令行和配对码就可以直接使用该功能。具体使用步骤见官方文档:

https://developer.android.com/preview/features#wireless-adb

ADB 增量安装

在游戏开发中,可能会有数 GB 大小的安装包,原有的 adb 安装速度很慢,即使安装包只做了一点点修改。ADB 增量安装 加速了这一过程,最快可达到原来的 10 倍。

要使用这个新开发者工具,首先请用新的 APK 签名方案 v4 进行签名,然后用 Android 11 预览版 SDK 中的最新版 ADB 命令行工具安装 APK。由于需要在设备级别上更改文件系统,ADB 增量安装 只适用于 Pixel 4 / 4XL 设备。所有新推出的 Android 11 设备都将包含这一变化并支持 ADB 增量安装。

数据访问审核更新

Android 11 提供了数据访问审核能力,它可以让你更好地了解自己的应用(本身或者依赖的第三方库)访问用户数据的情况,以及访问的流程路径。

当你的应用很庞大,或者使用了很多第三方类库时,这个 API 可以帮助你更好的了解隐私数据的访问,无论是你已知的或者不在预期内的。

具体使用方式见官方文档:

https://developer.android.com/preview/privacy/data-access-auditing

另外,Jeremy Walker 用 Kotlin 写了一个 Sample 来展示如何使用这个 API,地址如下:

https://github.com/android/permissions-samples/tree/master/DataAccessAuditingKotlin

其他

关于 Android 11 开发者预览版 3 的官方博客介绍:

https://android-developers.googleblog.com/2020/04/android-11-developer-preview-3.html

另外,掘金上也有官方团队的介绍:

https://juejin.im/post/5ea27932f265da47e6493789

文章

CameraX Preview

Husayn Hakeem 发表了一篇关于如何使用 CameraX 进行简单预览的文章 —— 《Display a camera preview with PreviewView》,地址如下:

https://medium.com/androiddevelopers/display-a-camera-preview-with-previewview-86562433d86c

在以往的相机开发中,我们需要手动管理 Surface,配置,旋转等等,而 CameraX 自动帮我们管理。感兴趣的同学可以阅读一下上面的文章。

在 Android Studio 上使用 Dagger

《Dagger navigation support in Android Studio》,地址如下:

https://medium.com/androiddevelopers/dagger-navigation-support-in-android-studio-49aa5d149ec9

继 Database Inspector 之后,Android Studio 4.1 Canary 又内置了对 Dagger 的自动跳转支持,如下图所示:

Kotlin objects

Kotlin Vocabulary 系列的最新文章 —— 《The one and only object》,地址如下:

https://medium.com/androiddevelopers/the-one-and-only-object-5dfd2cf7ab9b

主要介绍了 Kotlin 中的 object 关键字。

在 Kotlin 中,object 有几个用法。第一是实现单例类。object 修饰的单例类,其实是通过私有化构造函数并在静态代码块中实例化来完成的。

通过 Tools > Kotlin > Show Kotlin Bytecode ,可以查看到 kotlinc 编译出来的字节码,再点击 Decompile 可以反编译为 Java 代码。

object Singleton {
    private var count: Int = 0

    fun count() {
        count++
    }
}

反编译成 Java 代码是这样的。

public final class Singleton {
   private static int count;
   public static final Singleton INSTANCE;
   public final int getCount() {return count;}
   public final void setCount(int var1) {count = var1;}
   public final int count() {
      int var1 = count++;
      return var1;
   }
   private Singleton() {}
   static {
      Singleton var0 = new Singleton();
      INSTANCE = var0;
   }
}

要注意的是,通过 object 修饰的单例类构造函数不能有参数。如果的确需要参数,也可以参照 DCL 模式。

第二种是 companion object ,Kotlin 中没有 static 关键字,可以用 companion object 来代替。

最后,object 也可以用来表示匿名类,诸如 object : XXX

动态刷新率

来自 Android 开发团队的一篇博客 —— 《High refresh rate rendering on Android》,地址如下:

https://android-developers.googleblog.com/2020/04/high-refresh-rate-rendering-on-android.html

Android 11 的一些最新旗舰设备上已经支持了动态刷新率。

很多年以来,大多数 Android 设备的刷新率都是 60 fps ,应用需要在 16 ms 内绘制完每一帧。但是最新的旗舰机已经支持了 90 Hz,甚至 120 Hz 。

上面的文章介绍了 Android 是如何渲染页面的,以及应用如何在 Android 11 上请求不同的刷新率。

AndroidX

AndroidX 发布了一些更新(通常是两周发布一次更新)。

https://developer.android.com/jetpack/androidx/releases/navigation#2.3.0-alpha06

此版本包含了使用 Kotlin DSL 动态创建 navigation graphs ,通过我们都是在 xml 代码中进行书写。一个很有用的应用场景就是 App Bundle(又和我们没关系了),你可以导航到尚未安装的动态模块中。

Ben Weiss 提供了一个例子来展示如何使用,地址如下:

https://github.com/android/app-bundle-samples/tree/master/DynamicFeatureNavigation/DSL

另外,官网上也有详细介绍,地址如下:

https://developer.android.com/guide/navigation/navigation-kotlin-dsl

Fragment 1.3.0-alpha04

https://developer.android.com/jetpack/androidx/releases/fragment#1.3.0-alpha04

这个版本做了挺大更新,Flywith24 在掘金发布的 【Jetpack更新之Fragment】1.3.0-alpha04 来袭,Fragment 间通信的新姿势 一文做了详细的介绍,推荐阅读。

官方文档中也介绍了如何使用新 API 在 Fragment 间传递输入,地址如下:

https://developer.android.com/training/basics/fragments/pass-data-between

播客

这一栏目其实一直都有,只是我在前面几期的文章里一直没提过。因为是音频节目,我也没听过,就不作介绍了。感兴趣的同学,可以区听一听,地址如下:

http://androidbackstage.blogspot.com/2020/04/episode-138-animated-ime-oh-my.html

最后

到目前为止,这是我的第五篇 Now in Android 系列,更新频率大概在半个月左右。

这个系列文章的反响还不错,我会坚持第一时间将新鲜内容带给大家,也欢迎读者朋友的在看,分享和转发!