我正在参与「启航方案」

由于前段时间看完了《不拘一格 网飞的自由与责任工作法》这本书,对 Netlifx 这家公司产生了巨大的好感。今天突然好奇,这家酷酷的硅谷公司所做的 Android 客户端,究竟运用了哪些开源库?一般来讲,外企在选择开源库的时分遍及会很慎重,一定是比照、pk 多轮之后决定的。在此做一个收拾,顺便也同步一下脑海中的干流认知,免得往后遇到类似需求的时分重复造轮子。

怎么查看

很简略,我的办法便是看开源协议。由于大部分开源库都会声明自己用了哪些开源库,引证者必须在 App 一个独自的页面将这些信息展示出来,因此咱们查看这个页面就可以知道接了哪些第三方库,省去了反编译的费事。

我运用的是 8.69.0 build 12版别的客户端,相关信息如下图所示:

太库辣!Netflix Android 客户端开源库大公开

开源库一览

留意:下表现已删除了大部分偏底层(如libCurl,libOpenSSL)、偏言语(如 KotlinMySQL),以及国内开发者耳熟能详的(如 RxJavaRxKotlinRxKotlin)开源库。

表格按照类型排序。别的,只要官方作者没有 archive 一个库 ,我都认为它是活泼的。

静态的表格或许无法让咱们按照自己喜爱的维度来查看,我也给咱们准备了在线表格。

称号 地址 类型 状况 阐明
Rounded ImageView github.com/vinc3m1/Rou… Android 界面组件 过期 用来完成各种 radius 的圆形 ImageView
AutoValue github.com/google/auto… Java 扩展 活泼 注解生成代码,简略了解便是做 Kotlin data class 的事
Java Poet github.com/square/java… Java 扩展 活泼 Square 出品,通过调用 Java API 来生成 .java 文件,许多 Gradle 插件在编译时生成代码背面完成都会用到它。
Paper Parcel github.com/grandstaish… Java 扩展 过期 注解生成 Parcelable 目标的CREATORwriteToParcel(...)
AutoDispose uber.github.io/AutoDispose… RxJava 扩展 活泼 主动绑定 RxJava的流到它内部完成好的一个 scope ,来完成主动 dispose
Relinker github.com/KeepSafe/Re… Android JNI 开发扩展 活泼 处理 API 23 以下 Android 版别或许呈现的 so 库 link 不上的问题
Seismic github.com/square/seis… Android 传感器 活泼 Android 手机晃动检测库。没想到 Square 还出过这玩意儿。
Sticky Scroll View github.com/amarjain07/… Android 界面组件 活泼 滑动列表的时分固定一个 View 在顶部
Bouncy Castle Crypto www.bouncycastle.org/ Java 扩展 活泼 一个用于 Java 渠道的开放源码的轻量级密码术包。
Lottie github.com/airbnb/lott… Android 界面组件 活泼 闻名动画库
Cronet developer.android.com/codelabs/cr… Android 网络请求 活泼 Chrome 运用的移动端网络库。支撑 HTTP、HTTP/2 以及 QUIC 协议。支撑 Android 和 iOS 渠道
Exoplayer github.com/google/ExoP… Android 音视频 活泼 闻名视频播映库
groupie github.com/lisawray/gr… Android RecyclerView 扩展 活泼 便利 RecyclerView 显现复杂布局
rtl-viewpager github.com/duolingo/rt… Android ViewPager 扩展 过期 扩展了 ViewPager 部分功用,现已被 ViewPager2 代替
Epoxy github.com/airbnb/epox… Android RecyclerView 扩展 活泼 简化 RecyclerView 多 ViewType 场景下的开发
FlexboxLayout github.com/google/flex… Android 界面组件 活泼 Google 出品的一个在 Android 渠道完成类似前端 Flex 布局的组件
RxDogTag github.com/uber/RxDogT… RxJava 扩展 活泼 不想在用 RxJava 时完成 onError 可以用这个,也便利查看过错在哪。
JaroWinklerSimilarity commons.apache.org/proper/comm… Java 扩展 活泼 字符串类似度比较算法
Mavericks github.com/airbnb/mave… Android 架构 活泼 之前叫 MvRx,airbnb 开源的一套闻名Android App 呼应式开发结构。
Bugsnag github.com/bugsnag/bug… Android 架构 活泼 溃散手机,国内类似 bugly
Facebook Battery github.com/facebookinc… Android 架构 活泼 Facebook 出的一款便利检测运用耗电的 SDK
Checker Framework checkerframework.org/ Java 扩展 活泼 可以通过编写插件来扩展 Java 编译器的功用,比如添加一些类型查看
card-stack-view github.com/yuyakaido/C… Android 界面组件 活泼 滑动卡片组件,完成探探那种左滑 dis 右滑 like 的效果
Tape by Square github.com/square/tape Android 架构 活泼 一个轻快的,事务性的,根据文件的FIFO的库
Moshi github.com/square/mosh… Java 扩展 活泼 目前对 Kotlin 兼容最好的 Json 解析库

接下来,我将按照这些开源库的“类型”跟咱们一同过一遍。

需求阐明的是,这儿面有些库我对它很了解,有些比较生疏,有些乃至让我觉得“原来现已有这样的库了”!

每个人的认知是不同的,我没见过的有或许反而是你最了解的,反之亦然,所以这部分主要仍是倾向我自己的了解。假如你用过上面这些库,欢迎在下方谈论区留言共享,而假如我的了解有误,也欢迎指出,我将不小心感激!

Android 界面控件类

太库辣!Netflix Android 客户端开源库大公开

这部分我最感兴趣的是 groupieEpoxy 这两个控件。

groupie 这个库,从用法上看有点像 Drakeet 大神早年写的 MultiType,用来处理 RecyclerView 里有许多不同 ViewType 的 item 需求显现的问题。

彼时 Google 还没有弄出 ConcatAdapter,咱们面对这样的需求只能在 Adapter 里重写 getItemViewType,然后在 onBindViewHolder 里根据不同的 ViewType 调用不同的 ViewHolder

MultiType 的呈现简化了这些过程,它把列表的每一项称数据认为是一个 ItemData,对应的有一个 ItemView。它封装了一个 MultiTypeAdapter,这个 adapter 供给一个仅有接纳数据的办法 setData(items: Items) 办法,Items 实质是一个 ArrayList<Object>,里边可以 add 一个个的 ItemData,同时供给一个 register() 办法,用来把 ItemDataItemView 的关系成对注册,最后把它设给 RecyclerViewadapter 即可。

groupie 从用法上看和 MultiType 应该类似,只不过它限制了每一个 ItemData 的写法,供给了 ItemBindableItem 很好地支撑了后来出的 ViewBinding。有点英雄所见略同,又有点站在伟人膀子上了的意思。尽管没有在项目里落地过,可是 MultiType 咱们至今有一个项目还在运用,在这儿 shout out to Drakeet 大神。

Epoxy 相对而言就复杂一些,不过也是为了处理 RecyclerView 构建复杂列表的。飞书文档团队之前写过一篇比较完整的介绍文章,咱们可以参阅,就不在此赘述了。

其它几个控件比较往常,在此略评一二:

Rounded Image View 这个库兴趣不大,现在干流的图片加载结构都可以在加载图片的时分去动态裁剪(Transform),在实践运用中也比写死 ImageView 要更灵敏。事实上我平时很少鼓励咱们去写自定义控件,由于基本上一写一个坑,我就敢说国内没有多少开发者是在写自定义控件的时分,会老老实实把旋屏、状况保存、自定义特点、无障碍、等各种情形处理好的,且不谈内存和性能方面的问题了。个人猜想 Netflix 引证这个控件估量也是前史原因,已然能用,也就懒得改了吧。

Sticky Scroll View 这个库也没什么好说的,列表滑动中固定某个头部现已有许多类似的完成了,这个控件是根据 View 嵌套和 ScrollView 的,而现在做列表大部分都是 RecyclerView 或许 CollapingToolbarLayout 了,后两者都可以比较完美完成类似的效果。

Lottie 很出名,也现已出来好久了,连 aosp 里的项目都在用,做简略的点线动画十分适宜,不在此赘述了。

rtl-viewpager 是对老的 ViewPager 的扩展,现在大部分需求应该都可以结合 ViewPager2 来完成了。

FlexboxLayoutConstranitLayout 呈现之前的产品,由所以 Google 亲生的所以迄今还在保护。我个人觉得现阶段的 App 需求应该没有 ConstranitLayout + MotionLayout 做不了的吧?当然了,仍是要结合具体需求,假如团队内有对前端比较了解的小伙伴,或许贴近 Flex 布局的需求,可以考虑。

Android 工具类

太库辣!Netflix Android 客户端开源库大公开

这部分我比较感兴趣的是 SeismicCronet

Seismic 令我感兴趣的主要仍是前史原因。它居然是 11 年前就开源的一个用来检测手机晃动的库,而且仍是 Sqaure 出品,假如你也是第一次知道,或许写到现在都是自己做晃动检测的,请把 “Squaure 牛逼” 打在谈论区。

Cronet 这个库我倒不生疏,原因是我一直有经常看 Android Developer 官网的习惯。在 Perform network operations overview 这一章,Google 好久之前就现已把 Cronet 给列出来了,只“惋惜” Retrofit 做得太好了,不管是稳定性,扩展性,仍是和 Kotlin 的兼容性都近乎完美,所以基本上咱们说到网络请求便是后者。可是 Cronet 也有它自己的优势,便是 QUIC,这一块估量过半数的 App 用不到,所以也不好怪咱们不知道了。

其它两个库就没什么好说的了。Relinker 国内只要有 so 库而且需求下沉低版别的 App 估量都在用吧?而 Exoplayer 就更不必说了,应该是音视频播映 App 的标配。

Java、Kotlin 扩展类

太库辣!Netflix Android 客户端开源库大公开

这部分我比较感兴趣的是 Auto DisposeJaroWinklerSimilarity ,而其它的简直现在都有更好的代替。

AutoDispose 是由 Uber 公司开源的,没错,便是国外滴滴打车那个公司。要提它就先要看 RxDogTag 这个库,用它可以便利地管理和调试 RxJavaRxAndroid 中的过错和反常(话说 Uber 真的好喜欢 RxJava 的样子)。而 AutoDispose在它的基础上,可以让开发者更便利地管理 RxJava 的订阅关系,而且可以削减代码的复杂度和出错几率。

还记得大概从 2021 年开端,由于协程渐渐成熟,我的确没怎么用过 RxJava 了,但之前最开端学习的时分,的确被它的 onComplete() onError() 搞得死去活来,印象中光这两个还不行,如同还要写一个处理 ExceptionConsumer,总之的确很繁琐(当然这跟我其时的认知有关,请了解 RxJava 的小伙伴看到这儿不要打我)。这个库看起来一定程度上处理了这个问题,就像它官网写的那样 AutoDisposeis an RxJava 2+ tool for automatically binding the execution of RxJava streams to a provided scope via disposal/cancellation.,既可以偷懒,而且在数据流出错的时分还能使堆栈愈加便利直观,单着两点我就觉得很值得一用了。我没有去细看源码,假如有在用的小伙伴,欢迎补充纠正。

再说 JaroWinklerSimilarity,精确说它不是独自开源的,而是 Apache Commons 里边的,可是我真的是第一次听说这个算法,它可以比较两个字符串之间的类似度,个人感觉仍是很风趣的。背面的原理即 Jaro-Winkler 类似度算法,这是一个字符等级的算法,可以用于任何言语的字符串比较,也包含中文,可是需求留意的是,由于 Jaro-Winkler 算法是根据字符等级的,因此假如拿来比较两串中文的话,需求对文本进行拆字处理,效果或许没有比较英文串时那么精确。

剩下几个库就简略点评一下:

AutoValue 是 Google 出品,但主要是一个 For Java 的库,在 Kotlin First 的前提下,可以彻底被 data class 代替,这一点在官方文档里也有阐明。

Paper Parcel 相同在 Kotlin First 的前提下,也现已可以运用官方的 kotlin-parcelize 来代替,简略便利。

Bouncy Castle Crypto 是一个 Java 完成的加解密库,跟 Netflix 用到的具体算法有关,这个不在此赘述了。

Checker Framework 是一个测验结构,在 Android 主动化测验中可以用于检测代码中的代码缺点和过错,进步测验的覆盖率和可靠性。公司有主动化测验的团队,可以考虑接入这个结构。

Moshi 这个就愈加不必说了,假如到现在还只知道 Gsonfastjson的 Android 开发者可以去面壁了。

Android 架构类

太库辣!Netflix Android 客户端开源库大公开

这部分我比较感兴趣的是 Maverickstape。 先说 Mavericks,这又是 Airbnb 开源的一个库,没错,大名鼎鼎 Lottie 动画结构也是他们出品的。

Mavericks 是一个 Android MVI 结构的开源结构,适用于需求构建复杂、高效、可保护的 Android 运用程序的场景,特别是在需求处理许多异步数据、网络请求和数据耐久化的情况下。Mavericks 的核心在于它的三大件,MavericksState,MavericksViewModel, 和MavericksView,再配合它独有的 onEach 还有 onEach简直就可以 cover 咱们平时开发的大部分场景,而且可以简化代码,同时官方还供给了依赖用以便利地集成运用 ViewBinding 乃至Hilt

写到这儿我突然想起这一个月来面试的不少同学,每次问题 App 架构,他们的回答总是,说到“数据驱动 UI 更新”便是 MVVM,说到“逻辑界面别离”便是 MVI。那么问题来了,假如我的运用是 MVI架构,可是我的数据需求关怀许多的状况,而且这些状况又要驱动 UI 更新呢?很少有同学可以答好这个问题。

请看回上上个自然段,恭喜你遇到了,Mavericks 便是用来处理这一问题的最好结构!

再说 Tape, 这个相对简略,是 Square 公司开源的一个组行列相关的完成,主要包含 FileObjectQueueInMemoryObjectQueueObjectQueueQueueFile 这四个完成。关于行列没什么好说的了,FIFO 罢了。这个库的存在就有点像 LRU 算法有 DiskLruCache 和 MemoryLruCache ,根据不同的介质去完成。

总结

总的来看,Netflix Android 客户端团队在开源库的选择方面,仍是偏 Square、Airbnb 这样的开源大厂出品居多。而不得不承认的是这些开源库大部分都是被广泛运用,经得起检测的,不至于出一些八怪七喇的问题,更不至于一段时间之后没人保护。

别的,信任咱们也感受到了,他们团队相对而言仍是比较快速跟进干流 Android 开发技术的,不管是言语层面仍是架构层面,对 MAD 仍是很努力地践行的。

而“自研”方面,与国内氛围不同,没有 KPI,没有面向晋级编程,已然能站在伟人的膀子上,也就不必去重复造轮子,信任咱们也看出了 Netflix 其实并没有自己写什么结构在里边。不过考虑到 Netflix 观看时分的杰出体会,我置疑音视频那块估量有?惋惜这不是我的擅长方向,假如有研讨的小伙伴欢迎谈论区补充。

最后还可以看出一点,大公司病相同也存在于他们团队。整个 Netflix Android 客户端存在许多现已过期、不再保护,或许 Google 官方现已有更好完成的开源库,但是他们客户端仍是保留着这些过期的代码,没有做搬迁,我估量要么也是“能用就不改”,要么便是“粘得太紧,真实改不动”吧。所以,莫非全世界的公司,项目大了都会面临这样的问题?

以上。