又一巨頭從 Java 遷移到 Kotlin,簡直很無語。。

来源:https://www.cnblogs.com/javastack/archive/2022/11/14/16888296.html
-Advertisement-
Play Games

出品 | OSC開源社區(ID:oschina2013) Meta 發佈了一篇博客表示,正在將其 Android 應用的 Java 代碼遷移到 Kotlin,並分享了這一過程中的一些經驗。 該公司認為,Kotlin 是一種流行的 Android 開發語言,與 Java 相比具有一些關鍵優勢。“因此, ...


出品 | OSC開源社區(ID:oschina2013)

Meta 發佈了一篇博客表示,正在將其 Android 應用的 Java 代碼遷移到 Kotlin,並分享了這一過程中的一些經驗。

該公司認為,Kotlin 是一種流行的 Android 開發語言,與 Java 相比具有一些關鍵優勢。“因此,在我們努力使我們的開發工作流程更加高效的過程中,將 Meta 的 Android 開發轉向 Kotlin 是非常合理的......Kotlin 通常被認為是一種比 Java 更好的語言,在年度 Stack Overflow 開發者調查中,它的好感度要高於 Java。”

除了受歡迎程度外,Meta 還將最新的 Kotlin 版本與 Java 11(可用於 Android 開發的最新版本)進行了比較,並得出了 Kotlin 的一些主要優勢:可空性、函數式編程、更短的代碼、以及領域特定語言 (DSL) / 類型安全構建器等。

Facebook 軟體工程師 Omer Strulovich 指出,Meta 旗下幾個流行的 Android 應用 --Facebook、Instagram、Messenger、Portal 和 Quest 都已經開始從 Java 轉向 Kotlin。截至目前,Facebook、Messenger 和 Instagram 的 Android 應用程式都有超過 100 萬行 Kotlin 代碼,並且轉換率正在提高。Meta 的 Android 代碼庫總共已包含有超過 1000 萬行的 Kotlin 代碼。作為此次遷移的一部分,Meta 透露其也正在開源用於操作 Kotlin 代碼的各種示例和實用程式。

不過,採用 Kotlin 也有一些不能忽視的缺點。博客內容指出,比如:兩種語言的混合代碼庫需要長時間的處理維護;以及 Kotlin 與 Java 相比,流行度還是存在明顯的差距,這意味著 Kotlin 可用的工具也更少。更糟糕的是所有 Kotlin 工具還都需要考慮 Kotlin 和 Java 的互操作性,這使得它們的實現就變得複雜。

最大的問題還在於構建時間。“我們從一開始就知道 Kotlin 的構建時間會比 Java 的要長。該語言及其生態系統更加複雜,Java 在優化其編譯器方面領先了 20 年。由於我們擁有多個大型應用程式,較長的構建時間可能會對我們的開發人員體驗產生負面影響。”

*如何處理遷移*

Meta 稱,遷移到 Kotlin 既簡單又非常複雜。因為 Kotlin 的設計允許從 Java 進行簡單的轉換,並具有經過深思熟慮的互操作性。這種設計使 JetBrains 能夠為開發人員社區提供 J2K,即 IntelliJ/Android Studio 中的 Java 到 Kotlin 轉換器。但 J2K 不是萬能的,遷移中的有些情況仍然很複雜。

遷移之前,該公司考慮了兩個選擇:

  • 一個是可以使用 Kotlin 在 Meta 上編寫新代碼,但將大部分現有代碼保留在 Java 中。
  • 還有一個是可以嘗試將幾乎所有內部代碼轉換為 Kotlin。

第一個選項的優勢很明顯,即少得多的工作量;但是這種方法也有兩個明顯的缺點。首先,在 Kotlin 和 Java 代碼之間實現互操作性引入了 Kotlin 中 platform types 的使用。platform types 會導致運行時空指針取消引用,從而導致崩潰,破壞了純 Kotlin 代碼提供的靜態安全優勢。在一些複雜的情況下,Kotlin 的空檢查省略還可能漏掉空值通過,進而引發空指針異常。例如,如果 Kotlin 代碼調用由 Java 介面實現的 Kotlin 介面,就會發生這種情況。其他問題包括 Java 無法將類型參數標記為可空性(直到最近才修複),以及 Kotlin 的重載規則考慮了可空性,而 Java 的重載規則卻沒有。

第二個缺點是考慮到 Meta 的大多數軟體開發都需要修改現有代碼。“如果我們的大部分代碼都是用 Java 編寫的,我們就無法讓我們的開發人員充分享受 Kotlin 的樂趣。由於遷移是一個漫長的過程,期望每個工程師在接觸文件之前將文件轉換為 Kotlin 既費力又低效。”

因此,Meta 方面最終選擇了第二條選項,決定將幾乎所有代碼轉換為 Kotlin。而在嘗試為現有應用程式引入 Kotlin 時,Meta 也遇到了很多麻煩,例如需要更新 Redex 以支持 Java 不生成的位元組碼模式。以及使用的某些內部庫依賴於在編譯期間進行位元組碼轉換來獲取更好的性能。而將其作為 Kotlin 編譯的一部分運行時,這部分代碼則無法生效。為此,Meta 專門構建瞭解決工具。

此外,他們還發現在現有工具中存在的一些差異。例如代碼審查或 wiki 中缺少 Kotlin 語法高亮顯示。“我們更新了我們正在使用的庫 Pygments,以使體驗與 Java 相媲美。我們更新了一些內部代碼修改工具,以便能夠處理 Kotlin。我們還構建了 Ktfmt,這是一個基於 google-java-format 的代碼和理念的確定性 Kotlin 格式化程式。”

準備好所有工具後,Meta 就可以正式開始批量轉換大量代碼。“隨著我們工具的改進,我們已經能夠將相當大的一部分代碼轉換成 Kotlin。我們的代碼庫中已經有超過 1000 萬行 Kotlin 代碼,而且 Meta 的大多數 Android 開發人員現在都在編寫 Kotlin 代碼”。平均而言,此次遷移使代碼行數減少了 11%。

Meta 方面表示,其向 Kotlin 的遷移仍在進行中併在加速。“我們已經允許 Meta 的任何想要使用 Kotlin 的 Android 開發人員這樣做,併為他們提供了工具來輕鬆地將現有代碼遷移到 Kotlin。Kotlin 仍然缺少一些我們在使用 Java 時已經習慣的工具和優化。但我們正在努力縮小這些差距。隨著我們取得進展以及這些工具和庫的成熟,我們還將努力將它們反饋給社區。”

更多詳情可查看官方博客:https://engineering.fb.com/2022/10/24/android/android-java-kotlin-migration/

近期熱文推薦:

1.1,000+ 道 Java面試題及答案整理(2022最新版)

2.勁爆!Java 協程要來了。。。

3.Spring Boot 2.x 教程,太全了!

4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!

5.《Java開發手冊(嵩山版)》最新發佈,速速下載!

覺得不錯,別忘了隨手點贊+轉發哦!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文花了較短的篇幅重點介紹了JVM Sandbox的功能,實際用法,以及基礎原理。它通過封裝一些底層JVM控制的框架,使得對JVM層面的AOP開發變的異常簡單,就像作者自己所說“JVM-SANDBOX還能幫助你做很多很多,取決於你的腦洞有多大了。” ...
  • 本篇學習 Yarn Application 編寫方法,將帶你更清楚的瞭解一個任務是如何提交到 Yarn ,在運行中的交互和任務停止的過程。通過瞭解整個任務的運行流程,幫你更好的理解 Yarn 運作方式,出現問題時能更好的定位。 一、簡介 本篇將對 Yarn Application 編寫流程進行介紹。 ...
  • 數據結構是Python中一個很重要的概念,是以某種方式(如通過編號)組合起來的數據元素(如數字、字元乃至其他數據結構)的集合。 在Python中,最基本的數據結構是序列(sequence)。 序列中的每個元素都有編號,及其位置或索引,其中的第一個元素的索引為0,第二個元素位的索引為1,依此類推 在有 ...
  • 先說結論 : extern "C"隻影響到鏈接期的name mangling 什麼是name mangling? 請看 : C++函數重載的實現機制之name mangling - 知乎 (zhihu.com) 舉個例子 : // external.h #ifdef __cplusplus exte ...
  • 迷人的兩度搜索 1、BFS和DFS 深度優先搜索演算法(DFS)和廣度優先搜索演算法(BFS)是一種用於遍歷或搜索樹或圖的演算法,在搜索遍歷的過程中保證每個節點(頂點)訪問一次且僅訪問一次,按照節點(頂點)訪問順序的不同分為深度優先和廣度優先。 1.1、深度優先搜索演算法 深度優先搜索演算法(Depth-Fi ...
  • 今天跟大家分享一個關於“狀態機”的話題。給你講清楚什麼是狀態機、為什麼需要狀態機、適用場景、有哪些具體的實現方案以及各個方案對比(附帶github源碼地址) ...
  • 現代應用已經進入多數據源階段了,不再是一個單一的資料庫包打天下,一個應用中會涉及除關係資料庫外各種數據源,如文本文件類數據、NOSQL、多維資料庫、HTML Webservice等等,即使是關係資料庫,也可能不止一個 應用這樣了,那麼應用中的報表自然也會涉及到多樣性的數據源了 現在的報表,基本都是用 ...
  • 命題邏輯里的一個法則 定義:非p或非q=非(p且q) 最近在看一本書啊《python工匠......》一個騰訊大佬寫的,從這裡面瞭解到這個東西,確實不錯 1 1 # 德摩根定律 2 2 def func(): 3 3 a = 10 4 4 b = 20 5 5 if not a < 5 or not ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...