在大规模采用一种新语言时,需要考虑许多不同的因素,因为事情可能会发生巨大变化。对于许多人来说,选择一种语言可以说是个人喜好的问题,但在LinkedIn,我们有一个基础团队来评估这些基本技术决策的影响。最近,我们经历了评估Android开发语言的过程。我想从移动基础架构团队的角度与大家分享一下我们在评估语言时采取的步骤以及我们最终选择Kotlin的原因。方法移动语言的大规模采用需要考虑许多不同的因素。这样的决定会对开发人员的生产力、招聘、培训成本和最终产品产生巨大影响。例如,您可能会提高开发人员的工作效率并能够提供更多功能,但代价是增加应用程序大小,最终影响用户下载。为了更好地理解采用特定语言的投资和回报,我们认为公正的技术分析是我们决策的基础。一旦做出客观评估,我们就可以创建最适合整个公司的移动开发路线图。技术分析在Linkedin,Android开发涉及各种形式和规模的团队——从开发大型应用程序的大型团队,到开发多个中小型应用程序的小型团队,再到只专注于构建工具和基础设施的团队。为了尽可能全面地执行评估,我们成立了一个委员会,由来自每个应用程序团队的高级开发人员、基础架构团队和构建工具团队的代表组成。这些是我们在LinkedInAndroid开发背景下的研究领域。语言特性当Google宣布Kotlin成为官方支持的Android开发编程语言时,我们都非常兴奋。作为一种语言,Kotlin具有许多Java世界中没有的新特性,例如null-safety、扩展、数据类、协程等。在我们享受这些新特性的所有好处的同时,Kotlin在设计时也删除了某些Java特性,例如直接原始类型、静态成员、检查异常等。在我们的分析中,我们深入了解语言设计决策背后的思想和研究反编译代码以了解每个功能。这有助于我们在未来制定指导方针,并对我们发布的代码充满信心。兼容性在LinkedIn的规模下,如果我们决定迁移到一种新的语言,迁移将是一个漫长的过程,尤其是对于具有数百万行代码的代码库。正如了解每种语言的特性很重要一样,考虑互操作性也同样重要。幸运的是,Kotlin和AndroidStudio之间的集成通常会提供建议并帮助您重构代码。然而,归根结底,它们是两种不同的语言,让它发挥作用只是一个开始。在此过程中,您肯定希望构建一些增强功能。例如,我们遇到的一些问题是为静态成员添加JVM注释,并确保JavaAPI将单个抽象方法(SAM)转换参数放在最后,以便Kotlin编译器可以使用尾随lambda语法。可扩展的构建时间是移动工程师的首要任务之一。使用Kotlin,我们预计构建时间会增加。LinkedIn的移动开发代码从几千到几百万行不等;因此,构建时间的增加可能会有很大差异。这可能不会立即引起注意,但随着时间的推移,我们将密切关注迁移到Kotlin所导致的时间增加,尤其是在LinkedIn的规模上。为了测试构建时间,我们使用AndroidStudioPoet创建具有不同模块数量、不同行的Kotlin和Java代码作为模拟的Android项目,同时保持相似的项目大小和依赖关系图。我们使用GradleProfiler测量了干净构建和增量构建,以查看构建时间花在了哪里。鉴于项目的规模,它有可能影响从开发到生产的许多不同方面。运行时性能是本次分析的另一个关键领域。我们用Kotlin和Java实现了几种算法作为测试工具,并在物理设备上运行它们。为了使实验更加真实,我们还在这些测试中启用了ProGuard。研究结果与《AndroidRuntime上Kotlin和Java的性能评估》的结果一致。有趣的是,Kotlin中的大部分开销来自null-safety特性,这使得每次调用方法时都带有非可选参数,编译器无法将这些参数映射到原始类型。这导致调用Intrinsics.checkParameterIsNotNull,它负责我们实验中的大部分开销。应用程序的大小是由许多因素造成的。据谷歌称,最初的Kotlin标准库导入将使应用程序的大小增加约1MB。随着时间的推移,更多的Java代码被转换为Kotlin,应用程序将由于Kotlin字节码方法的增加而变得更小。大。幸运的是,ProGuard能够从Kotlin生成的代码中删除并大大减少未使用的方法。我们创建了示例应用程序并将它们从Java转换为纯Kotlin,以查看方法数量和应用程序大小的开销。语言升级移动开发环境在不断变化,了解升级过程非常重要。过去,我们看到语言升级伴随着不兼容的更改、构建失败和许多意外错误,最终迫使我们锁定主干甚至执行语言升级。JetBrains承诺为Kotlin提供两种形式的向后兼容性:新的编译器仍将能够使用旧的二进制文件(但旧的编译器可能无法识别新的二进制文件,例如javac1.6,它无法读取由javac1.8编译的类)。旧二进制文件将在运行时继续使用新二进制文件,而新代码可能需要新的依赖项。在源代码兼容性方面,Kotlin遵循API弃用警告的模式,一旦升级到新的编译器版本,这些警告就会逐渐变成错误。过去,我们看到升级通常会给社区足够的时间来适应变化。例如,KT-21515中的语言行为更改被标记为警告,并保留在下一个1.2.x补丁版本中,直到Kotlin1.3。然而,值得注意的是,JetBrains并未说明将在主要版本更改中提供何种类型的兼容性。毫不奇怪,开发者生态系统Kotlin可以轻松地与AndroidStudio一起使用,因为JetBrains是这两种产品的主要贡献者。大多数(如果不是全部)AndroidStudio工具都可以与Kotlin无缝协作,包括调试器、内存分析器、Android分析器等。值得注意的Kotlin功能包括Kotlin自动转换和Kotlin反编译器。后者让您深入了解Kotlin代码的底层工作原理。LinkedIn使用Gradle作为其Android和Java产品的实际构建系统。多亏了Kotlin-AndroidGradle插件,Kotlin可以与Gradle顺利协作。Gradle企业版提供远程缓存解决方案。Kotlin1.2.21允许Kotlin项目使用构建缓存。具体来说,对于Gradle构建缓存,它还需要KotlinGradlePlugin1.2.20和Gradle4.3或更高版本。总的来说,由于采用Kotlin而导致的构建工具变化很小。但是,我们的分析主要针对Gradle,可能不适用于Buck等其他构建系统。尽管我们关注开发人员的生产力,但质量是我们要考虑的另一个重要因素。编写测试对于确保代码质量至关重要。我们花了一些时间来了解测试生态系统的局限性及其与其他语言的兼容性。这不仅包括测试框架,还包括代码覆盖率分析、CI管道,最重要的是,在开始编写Kotlin测试之前要采取的不违反测试标准的步骤。分析还包括Android中主要的静态分析工具AndroidLint,现在支持使用UAST的Java和Kotlin分析和风格检查工具。行业分析自从2017年Kotlin在GoogleI/O上被宣布为Android开发的一流语言后,越来越多的工程师开始拥抱Kotlin。根据StackOverflow2018调查,Kotlin是第二流行的编程语言。Kotlin也被认为是未来发展最快的语言,与Swift、Go、Haskell和Rust并列第一。据谷歌称,2017年,当Kotlin被宣布为Android开发的第一语言时,GooglePlay中9%的应用程序已经在使用Kotlin。一年后,即2018年5月,谷歌宣布这一数字增长到35%,同比增长近六倍。我们分析了GooglePlay商店中排名前300位的免费应用程序(按DEX文件大小筛选),以了解其中有多少应用程序正在大规模使用Kotlin。虽然这个数字包括所有第三方库的代码,但它很好地反映了应用程序代码的大小。作为初步步骤,我们排除了APK中没有专用Kotlin文件夹的应用程序,这些文件夹将包含Kotlin运行时使用的一些Kotlin内置文件。由于代码混淆,计算代码中Kotlin的百分比很棘手。然而,我们使用apktool将所有DEX文件转换为SMALI代码,并发现了两条不同的线索,可以识别用Kotlin编写的类。对于不从.source属性中删除原始文件名的应用程序,我们可以提取扩展名*.kt。对于其他应用程序,我们寻找kotlin.Metadata类。总的来说,我们能够构建一个图表来显示应用程序及其类的数量、代码大小和Kotlin百分比。这让我们了解了社区的成熟程度以及我们可以期待从合作伙伴那里获得多少支持。起初,大多数库所有者认为在自己的代码中使用Kotlin实现细节为时过早,不应该强加给用户。随着Kotlin社区变得更加活跃,这种观点开始转变。Square拥有许多最流行的Android开源库,宣布他们的核心Okio库已用Kotlin重写,并且他们将在所有未来版本中使用Kotlin。其他一些库项目选择遵循Google为AndroidKTX提供的示例,并发布一个用Java编写的基础库,并在单独的工件中添加了特定于Kotlin的扩展点。例如,FasterXML的Jackson项目添加了一个用于序列化和反序列化Kotlin类的Kotlin模块,以及正在致力于添加针对Kotlin优化的模拟语法的Mockito。全面了解除了上面列出的要点之外,我们还花时间研究了与LinkedIn内部工具系统的集成,包括崩溃报告、审查流程和CI管道。我们一直与社区和其他公司(包括Google和JetBrains)的开发人员保持沟通,不仅是为了了解他们的方向,也是为了确保我们的决定与未来的Android开发保持一致。人才永远是我们首先考虑的因素之一;因此,与招聘和培训相关的费用也是我们分析的重要部分。总的来说,我们从社区听到了各种好处和推荐。综上所述,我们能够构建路线图,使用Kotlin将LinkedIn带入下一个Android开发时代,并且有信心,我们可以将技术风险降至最低,了解对招聘和培训的影响,维护技术标准,并持续为我们的成员提供价值。
