- Hybrid app (混合App)
o 多View混合型:Native View与WebView交替出现的场景
o 单View混合型:在同一个View内,同时包括Native View和Web View
o Web主体型:移动应用的主体是WebView
过去收银台模块采用单View混合型,我们称之为H5收银台。H5收银台开发快,一次开发,iOS和Android两端通用。在享受开发便利的同时长期使用过程中发现:
-
H5收银台首屏加载时间长,大多数时候超过1秒以上;
-
弹窗动画生硬,用户体验不够友好;
-
技术栈链路过长:JDWebView容器,H5前端页面,原生页面和JDWebView统一控件交互,原生和H5页面交互,定位问题、排查问题相对耗时长;
-
从占用手机大量内存的页面比如游戏网页跳转到收银台时,配置低的手机存在大概率性的黑屏或者白屏问题。
瓶颈是WebView,基于上述认识我们需要对业务较稳定的收银台首页去掉WebView,改成纯原生页面。改造后的架构图:
在原生化改造过程中我们面临一个选择:是继续使用Java还是选用Kotlin,收银台团队认为Kotlin是Andrioid开发的未来,谷歌的全力支持和未来丰富的语言生态让我们有理由相信Kotlin在移动端的远大且光明的前景。
接着来聊聊Kotlin和我们对Kotlin的实践,本文将从下面两部分展开:
-
对Kotlin的理解
-
Kotlin在收银台里的具体实践
编程语言的时空观
想对Kotlin有全面、深刻的理解,还得从语言的源头入手,溯洄从之,一路探究。纵观过去100年,编程语言经历了三大阶段,分别是机器语言,汇编语言和高级语言。Kotlin隶属于高级语言,从高级语言这一阶段出发来看看编程语言的发展历程:
摘自:Most Popular Programming Languages 1965 - 2019 by youtube
上图为最受欢迎的高级语言的变化过程。高级语言从20世纪50年代到1983年为早期孕育阶段,按时间先后顺序发展出面向过程的结构化设计,面向对象的分析与设计,函数式编程范式等。随着语言的发展,原本常用的“面向对象”和“函数式”的边界变得越来越模糊。Kotlin于2011年问世,并在2017年得到谷歌官方支持,开始作为Android开发语言。
找到了Kotlin在时间轴线上的位置,Kotlin和其他语言的横向比较的位置在哪儿呢?
根据运行时是否允许隐式变量类型转换,把语言分为强类型和弱类型。Kotlin是强类型语言(隐式类型转换:不需要用户干预,编译器私下进行的类型转换行为)
根据对类型的检测时机是在编译期还是运行期,把语言分为静态语言和动态语言;Kotlin是静态语言。
根据程序的源文件被运行前是否需要提前转化为机器码,把语言分为编译型和解释型;Kotlin和Java类似,需要编译成字节码的解释型语言。
依据动态性和类型强度可以建立一个直角坐标系,如下图所示:沿着X轴正方向,静态性越来越强;沿着Y轴正方向,类型强度越来越强。
摘自网络
随着时间流逝,动态语言加入了静态能力,静态语言加入了动态能力,静态和动态正在相互靠拢,未来的编程语言属于这两者的杂交产物。Kotlin作为JVM语言,它落在第一象限,动态性比Java强,类型强度比Java弱。
小结:
于是对Kotlin的基本的认识便有了:Kotlin是现代化的编译型、强类型、静态语言。Kotlin相比于Java,更动态性,符合编程语言发展的趋势。上述所展示的Kotlin特点最终是通过语言特性得以落实。
kotlin的语言特性
语言特性分为通用特性,面向过程的特性,面向对象的特性,函数式的特性。
通用的特性,比如:
-
变量
-
作用域
-
…
面向过程的特性,比如:
-
流程控制:条件语句,分支语句,循环语句
-
基本数据类型
-
数据容器(数组&集合)
-
方法定义与调用
-
访问权限
-
…
面向对象的特性,比如:
-
类和类层次结构
-
对象和类型
-
封装、继承、多态、抽象
-
接口&抽象方法
-
混合mixin
-
并发
-
异常处理
-
垃圾回收
-
递归
-
…
函数式的特性,比如:
-
引用透明
-
高阶函数
-
lambda表达式
-
模式匹配
-
Monad结构
-
柯里化
-
不变性&可变性
-
闭包
-
…
Koltin和Java在语言特性上的差异
Kotlin独有的特性有:data类,sealed类,解构,中缀表达,访问范围,操作符重载,主从构造器,内部类/嵌套类,属性访问器(内置setter和getter方法),属性延迟初始化,类型继承体系。如下:
-
增加类型继承体系
-
增加默认参数、可变参数
-
强化了不可变性
-
强化了空安全
-
强化了泛型
-
强化了函数/lambda表达
-
去掉了可受检异常
-
增加了运算符重载
-
修改了权限访问范围
-
把最佳实践融入到语法
可以看到Kotlin和Java特性差异还是挺多的,这里举两个方面说一说:函数式和类型。
函数式
Kotlin较Java一个很大的特性差异便是对函数式的支持大大提高了。我们知道函数式基本元素有:
-
不可变性
-
引用透明
-
无副作用
-
高阶函数与lambda表达式
-
Monad结构
-
柯里化
-
模式匹配
-
智能类型推断
-
递归
-
并发安全
函数式编程有如下等式:
程序 = 可变性程序 + 不可变性程序
可变性程序 = 对象 + 依赖关系
不可变程序 = 纯函数 + 组合 (Monad结构)
Kotlin的语言特性对此都做了支持,相比于Java在组件化和响应式上Kotlin更加简洁、直观。
类型差异
Kotlin和Java类型上的差异,有类型声明差异和类型体系差异。
类型声明差异
val a: String = “I am Kotlin”
这与函数定义时返回类型,类继承,接口实现提供了一致的书写体验
fun sum(x: Int, y: Int): Int {
Java是类型前置的写法,定义方法时返回类型写在了前面,但是继承和实现是后置的。类型后置的好处:通过类型推导实现类型省略时一致的书写体验;Kotlin做到了三种场景符号一致,书写一致(类型推导)
类型体系差异
下图是Kotlin类型体系,Kotlin把基本数据类型统一成对象类型,形成了面向对象的继承体系。
Kotlin的瑕疵
kotlin的语言特性丰富而有力,带来了与Java的特性差异。任何事物都有正、反两面,kotlin也不例外。
1)多维数组需要通过嵌套的方式创建
val bytes = Array(3) { ByteArray(4) }
对比一下Java
byte[][] bytes = new byte[3][4];
相比Kotlin的,Java清晰简便多了
2)Kotlin没法实现的接口样子
这样的Java接口
interface Itest{
在Kotlin里实现该接口,class A会因为实现了两个相同签名方法而报错
class A : Itest{
3)抛弃了受检异常(checked exception)
这是颇有争议的瑕疵,有坏处也有好处。
**坏处:**对异常不强制要求处理。有时候调用一些方法,特别涉及到硬件或者网络相关的方法,往往不一定知道它可能会抛出什么异常,或者根本不知道它会抛出异常。便会在这块地方遗漏了某些异常的处理或者没做异常处理,埋下一些潜在的问题。
**好处:**Kotlin不区分checked exception,这样能简化代码书写,符合Kotlin一贯的简洁设计理念。因此Kotlin是没有受检异常的。
Kotlin在收银台具体实践
Kotlin语言所拥有的特性为面向过程特性、面向对象特性和函数式特性的部分总和。从V9.2.2版本开始,安卓收银台模块开始全面使用Kotlin语言。为了稳定,我们采用了Java和Kotlin混合开发的模式。
01与Java的互操作
先来看看Kotlin和Java的互操作。
1)Kotlin调用Java的代码
几乎和Java调用Java代码相同,有几个不相同的点如下:
1.属性前缀
示意代码:
public final class User {
2.平台类型
kotlin调用Java代码后返回的类型在Kotlin侧叫做平台类型。平台类型既可当作可空类型也可作为非空类型。换句话说,kotlin编译时,平台类型被认为是非空类型,不需要非空判断顺利编译通过,在运行时被认为是可空类型。平台类型可能触发空指针异常。收银台空安全实践避免了这种空指针,详见后文内容。
2)Java调用Kotlin的代码
在kotlin代码上增加Kotlin注解,Java调用Kotlin便能像Java调用Java代码般
1)@JvmOverloads 默认参数重载
@JvmOverloads
引入默认参数重载的注解后,只需要一次方法定义就够满足收银台对底部支付文案的内容更新,减少了方法定义的模版代码。
2)@JvmStatic 静态
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
,18年进入阿里一直到现在。**
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-FWKXeLKL-1715838041963)]
[外链图片转存中…(img-FZ2IRB0u-1715838041964)]
[外链图片转存中…(img-6gJVLgj4-1715838041965)]
[外链图片转存中…(img-VV5TVj0p-1715838041966)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!