侵权投诉

使用Kotlin替代Java重构AOSP应用

谷歌开发者 2021-09-16 09:26 次阅读

两年前,Android 开源项目 (AOSP) 应用团队开始使用 Kotlin 替代 Java 重构 AOSP 应用。之所以重构主要有两个原因: 一是确保 AOSP 应用能够遵循 Android 最佳实践,另外则是提供优先使用 Kotlin 进行应用开发的良好范例。Kotlin 之所以具有强大的吸引力,原因之一是其简洁的语法,很多情况下用 Kotlin 编写的代码块的代码数量相比于功能相同的 Java 代码块要更少一些。此外,Kotlin 这种具有丰富表现力的编程语言还具有其他各种优点,例如:

空安全: 这一概念可以说是根植于 Kotlin 之中,从而帮助避免破坏性的空指针异常;

兼容 Java: 尤其是在这次的重构项目中,Kotlin 与 Java 语言的兼容性能够让我们一个文件一个文件地进行 Kotlin 转换。

Android 开源项目 (AOSP) 应用

https://android.googlesource.com/platform/packages/apps/

Kotlin

https://kotlinlang.org/

Google I/O 2019

https://developer.android.google.cn/kotlin/first

AOSP 团队在去年夏天发表了一篇文章,详细介绍了 AOSP 桌面时钟应用的转换过程。而今年,我们将 AOSP 日历应用从 Java 转换成了 Kotlin。在这次转换之前,应用的代码行数超过 18,000 行,在转换后代码库减少了约 300 行。在这次的转换中,我们沿袭了同 AOSP 桌面时钟转换过程中类似的技术,充分利用了 Kotlin 与 Java 语言的互操作性,对代码文件一一进行了转换,并在过程中使用独立的构建目标将 Java 代码文件替换为对应的 Kotlin 代码文件。因为团队中有两个人在进行此项工作,所以我们在 Android.bp 文件中为每个人创建了一个 exclude_srcs 属性,这样两个人就可以在减少代码合并冲突的前提下,都能够同时进行重构并推送代码。此外,这样还能允许我们进行增量测试,快速定位错误出现在哪些文件。

AOSP 桌面时钟应用的转换过程

https://medium.com/androiddevelopers/re-writing-the-aosp-deskclock-app-in-kotlin-76c836370cb

在转换任意给定的文件时,我们一开始先使用 Android Studio Kotlin 插件中提供的从 Java 到 Kotlin 的自动转换工具。虽然该插件成功帮助我们转换了大部份的代码,但是还是会遇到一些问题,需要开发者手动解决。需要手动更改的部分,我们将会在本文接下来的章节中列出。

在将每个文件转换为 Kotlin 之后,我们手动测试了日历应用的 UI 界面,运行了单元测试,并运行了 Compatibility Test Suite (CTS) 的子集来进行功能验证,以确保不需要再进行任何的回归测试。

Android Studio

https://developer.android.google.cn/studio

从 Java 到 Kotlin 的自动转换工具

https://developer.android.google.cn/kotlin/add-kotlin#convert

Compatibility Test Suite (CTS)

https://source.android.google.cn/compatibility/cts

自动转换之后的步骤

上面提到,在使用自动转换工具之后,有一些反复出现的问题需要手动定位解决。在 AOSP 桌面时钟文章中,详细介绍了其中遇到的一些问题以及解决方法。如下列出了一些在进行 AOSP 日历转换过程中遇到的问题。

用 open 关键词标记父类

我们遇到的问题之一是 Kotlin 父类和子类之间的相互调用。在 Kotlin 中,要将一个类标记为可继承,必须得在类的声明中添加 open 关键字,对于父类中被子类覆盖的方法也要这样做。但是在 Java 中的继承是不需要使用到 open 关键字的。由于 Kotlin 和 Java 能够相互调用,这个问题直到大部分代码文件转换到了 Kotlin 才出现。

例如,在下面的代码片段中,声明了一个继承于 SimpleWeeksAdapter 的类:

class MonthByWeekAdapter(context: Context?, params: HashMap《String?, Int?》) : SimpleWeeksAdapter(context as Context, params) {//方法体}

由于代码文件的转换过程是一次一个文件进行的,即使是完全将 SimpleWeeksAdapter.kt 文件转换成 Kotlin,也不会在其类的声明中出现 open 关键词,这样就会导致一个错误。所以之后需要手动进行 open 关键词的添加,以便让 SimpleWeeksAdapter 类可以被继承。这个特殊的类声明如下所示:

open class SimpleWeeksAdapter(context: Context, params: HashMap《String?, Int?》?) {//方法体}

override 修饰符

同样地,子类中覆盖父类的方法也必须使用 override 修饰符来进行标记。在 Java 中,这是通过 @Override 注解来实现的。然而,虽然在 Java 中有相应的注解实现版本,但是自动转换过程中并没有为 Kotlin 方法声明中添加 override 修饰符。解决的办法是在所有适当的地方手动添加 override 修饰符。

覆写父类中的属性

在重构过程中,我们还遇到了一个属性覆写的异常问题,当一个子类声明了一个变量,而在父类中存在一个非私有的同名变量时,我们需要添加一个 override 修饰符。然而,即使子类的变量同父类变量的类型不同,也仍然要添加 override 修饰符。在某些情况下,添加 override 仍不能解决问题,尤其是当子类的类型完全不同的时候。事实上,如果类型不匹配,在子类的变量前添加 override 修饰符,并在父类的变量前添加 open 关键字,会导致一个错误:

type of *property name* doesn’t match the type of the overridden var-property

这个报错很让人疑惑,因为在 Java 中,以下代码可以正常编译:

public class Parent { int num = 0;}

class Child extends Parent { String num = “num”;}

而在 Kotlin 中相应的代码就会报上面提到的错误:

class Parent { var num: Int = 0}

class Child : Parent() { var num: String = “num”}

这个问题很有意思,目前我们通过在子类中对变量重命名来规避了这个冲突。上面的 Java 代码会被 Android Studio 目前提供的代码转换器转换为有问题的 Kotlin 代码,这甚至被报告为是一个 bug 了。

被报告为是一个 bug

https://youtrack.jetbrains.com/issue/KTIJ-8621

import 语句

在我们转换的所有文件中,自动转换工具都倾向于将 Java 代码中的所有 import 语句截断为 Kotlin 文件中的第一行。最开始这导致了一些很让人抓狂的错误,编译器会在整个代码中报 “unknown references” 的错误。在意识到这个问题后,我们开始手动地将 Java 中的 import 语句粘贴到 Kotlin 代码文件中,并单独对其进行转换。

暴露成员变量

默认情况下,Kotlin 会自动地为类中的实例变量生成 getter 和 setter 方法。然而,有些时候我们希望一个变量仅仅只是一个简单的 Java 成员变量,这可以通过使用 @JvmField 注解来实现。

@JvmField 注解的作用是 “指示 Kotlin 编译器不要为这个属性生成 getter 和 setter 方法,并将其作为一个成员变量允许其被公开访问”。这个注解在 CalendarData 类中特别有用,它包含了两个 static final 变量。通过对使用 val 声明的只读变量使用 @JvmField 注解,我们确保了这些变量可以作为成员变量被其他类访问,从而实现了 Java 和 Kotlin 之间的兼容性。

@JvmField 注解

https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.jvm/-jvm-field/

CalendarData 类

https://android.googlesource.com/platform/packages/apps/Calendar/+/42e4b43133c4f866e0729438fb38bebc6d03b0a4/src/com/android/calendar/CalendarData.kt

val

https://kotlinlang.org/docs/basic-syntax.html#variables

对象中的静态方法

在 Kotlin 对象中定义的函数必须使用 @JvmStatic 进行标记,以允许在 Java 代码中通过方法名,而非实例化来对它们进行调用。也就是说,这个注解使其具有了类似 Java 的方法行为,即能够通过类名调用方法。根据 Kotlin 的文档,“编译器会为对象的外部类生成一个静态方法,而对于对象本身会生成一个实例方法。”我们在 Utils 文件中遇到了这个问题,当完成转换后,Java 类就变成了 Kotlin 对象。随后,所有在对象中定义的方法都必须使用 @JvmStatic 标记,这样就允许在其他文件中使用 Utils.method() 这样的语法来进行调用。值得一提的是,在类名和方法名之间使用 .INSTANCE (即 Utils.INSTANCE.method()) 也是一种选择,但是这不太符合常见的 Java 语法,需要改变所有对 Java 静态方法的调用。

Kotlin 的文档

https://kotlinlang.org/docs/java-to-kotlin-interop.html#static-methods

Utils 文件

https://android.googlesource.com/platform/packages/apps/Calendar/+/42e4b43133c4f866e0729438fb38bebc6d03b0a4/src/com/android/calendar/Utils.kt

性能评估分析

所有的基准测试都是在一台 96 核、176 GiB 内存的机器上进行的。本项目中分析用到的主要指标有所减少的代码行数、目标 APK 的文件大小、构建时间和首屏从启动到显示的时间。在对上述每个因素进行分析的同时,我们还收集了每个参数的数据并以表格的方式进行了展示。

减少的代码行数

9a8bd36e-1657-11ec-8fb8-12bb97331649.png

从 Java 完全转换到 Kotlin 后,代码行数从 18,004 减少到了 17,729。这比原来的 Java 代码量减少了大约 1.5%。虽然减少的代码量并不可观,但对于一些大型应用来说,这种转换对于减少代码行数的效果可能更为显著,可参阅 AOSP 桌面时钟文中所举的例子。

AOSP 桌面时钟https://medium.com/androiddevelopers/re-writing-the-aosp-deskclock-app-in-kotlin-76c836370cb

目标 APK 大小

9a975cfc-1657-11ec-8fb8-12bb97331649.png

使用 Kotlin 编写的应用 APK 大小是 2.7 MB,而使用 Java 编写的应用 APK 大小是 2.6 MB。可以说这个差异基本可以忽略不计了,由于包含了一些额外的 Kotlin 库,所以 APK 体积上的增加,实际上是可以预期的。这种大小的增加可以通过使用 Proguard 或 R8 来进行优化。

Proguardhttps://developer.android.google.cn/studio/build/shrink-code

R8https://r8.googlesource.com/r8

编译时间

9aa1be04-1657-11ec-8fb8-12bb97331649.png

Kotlin 和 Java 应用的构建时间是通过取 10 次从零进行完整构建的时间的平均值来计算的 (不包含异常值),Kotlin 应用的平均构建时间为 13 分 27 秒,而 Java 应用的平均构建时间为 12 分 6 秒。据一些资料 (如 “Java 和 Kotlin 的区别” 以及 “Kotlin 和 Java 在编译时间上的对比”) 显示,Kotlin 的编译时间事实上比 Java 要更耗时,特别是对于从零开始的构建。一些分析断言,Java 的编译速度会快 10-15%,又有一些分析称这一数据为 15-20%。拿我们的例子进行从零开始完整构建所花费的时间来说,Java 的编译速度比 Kotlin 快 11.2%,尽管这个微小的差异并不在上述范围内,但这有可能是因为 AOSP 日历是一个相对较小的应用,仅有 43 个类。尽管从零开始的完整构建比较慢,但是 Kotlin 仍然在其他方面占有优势,这些优势更应该被考虑到。例如,Kotlin 相对于 Java,更简洁的语法通常可以保证较少的代码量,这使得 Kotlin 代码库更易维护。此外,由于 Kotlin 是一种更为安全有效的编程语言,我们可以认为完整构建时间较慢的问题可以忽略不计。

Java 和 Kotlin 的区别

https://www.educba.com/java-vs-kotlin/

Kotlin 和 Java 在编译时间上的对比https://medium.com/keepsafe-engineering/kotlin-vs-java-compilation-speed-e6c174b39b5d

首屏显示的时间

9aad76a4-1657-11ec-8fb8-12bb97331649.png

我们使用了这种方法来测试应用从启动到完全显示首屏所需要的时间,经过 10 次试验后我们发现,使用 Kotlin 应用的平均时间约为 197.7 毫秒,而 Java 的则为 194.9 毫秒。这些测试都是在 Pixel 3a XL 设备上进行的。从这个测试结果可以得出结论,与 Kotlin 应用相比,Java 应用可能具有微小的优势;然而,由于平均时间非常接近,这个差异几乎可以忽略不计。因此,可以说 AOSP 日历应用转换到 Kotlin,并没有对应用的初始启动时间产生负面影响。

方法https://developer.android.google.cn/topic/performance/vitals/launch-time#time-initial

结论

将 AOSP 日历应用转换为 Kotlin 大约花了 1.5 个月 (6 周) 的时间,由 2 名实习生负责该项目的实施。一旦我们对代码库更加熟悉并更加善于解决反复出现的编译时、运行时和语法问题时,效率肯定会变得更高。总的来说,这个特殊的项目成功地展示了 Kotlin 如何影响现有的 Android 应用,并在对 AOSP 应用进行转换的路途中迈出了坚实的一步。

欢迎您通过下方二维码向我们提交反馈,或分享您喜欢的内容、发现的问题。您的反馈对我们非常重要,感谢您的支持!

责任编辑:haq

原文标题:使用 Kotlin 重写 AOSP 日历应用

文章出处:【微信号:Google_Developers,微信公众号:谷歌开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
分享:

评论

相关推荐

华为开发者HarmonyOS零基础入门:完善功能逻辑

华为开发者HarmonyOS零基础入门:逻辑代码相应调试,导入系统能力包,引用UI资源,调用系统能力....
的头像 lhl545545 发表于 10-23 10:38 140次 阅读
华为开发者HarmonyOS零基础入门:完善功能逻辑

HDC华为开发者大会2021:harmony OS提供全力技术支持

HDC华为开发者大会2021:鸿蒙零基础入门满足harmonyOS开发者各类学习需求,逐步丰富的示例....
的头像 lhl545545 发表于 10-23 09:35 141次 阅读
HDC华为开发者大会2021:harmony OS提供全力技术支持

安卓12公布新要求,6GB内存成标配?

电子发烧友网报道(文/周凯扬)又到了安卓一年一度的版本更新,谷歌已在近期发布了AOSP版本的安卓12....
的头像 电子发烧友网 发表于 10-22 18:11 421次 阅读

微软官方开发的VS Code扩展介绍

【导语】:CodeTour(代码之旅)是微软官方开发的 VS Code 扩展,允许记录和回放代码的演....
的头像 数据分析与开发 发表于 10-22 17:13 221次 阅读

2021华为开发者大会:鸿蒙智联设备开发效率倍增

2021华为开发者大会:分布式应用服务开发环境,以用户为中心的自然智慧交互,突破跨端开发调试困难,丰....
的头像 lhl545545 发表于 10-22 15:57 301次 阅读
2021华为开发者大会:鸿蒙智联设备开发效率倍增

定义一个名为TV的类表示电视机。

转载于:https://www.cnblogs.com/Crystal12/p/10683569.h....
发表于 10-22 13:06 3次 阅读
定义一个名为TV的类表示电视机。

怎样去判断嵌入式有没有发展前途

怎样去判断嵌入式有没有发展前途? 嵌入式工程师有发展前途吗?...
发表于 10-22 08:47 0次 阅读

Android系统启动流程总结

Android系统是如何启动的?Android系统的启动过程是怎样的?...
发表于 10-22 07:14 0次 阅读

STM32F103C8T6的串口配置步骤有哪些

STM32F103C8T6有哪几个串口? STM32F103C8T6的串口配置步骤有哪些?怎样去编写代码呢? ...
发表于 10-22 06:35 0次 阅读

C语言堆栈程序内存的分配

    程序内存的分配       一个由C/C++编译的程序占用的内存分为以下几个部分: 栈区(s....
的头像 嵌入式ARM 发表于 10-21 14:51 86次 阅读

ML规模复杂的相关基础架构

  Waze 是世界上最大的基于社区的交通和导航应用。该应用借助实时数据来帮助用户避开路上的障碍,享....
的头像 TensorFlow 发表于 10-21 14:07 142次 阅读

java 嵌入式 web 服务器

http://www.oschina.net/search?scope=project&q=....
发表于 10-21 13:21 10次 阅读
java 嵌入式 web 服务器

嵌入式Tomcat示例

嵌入式Web服务器不使用jetty,太麻烦了。配置也不熟悉。代码嵌入式Tomcat示例参考资料嵌入式....
发表于 10-21 12:06 9次 阅读
嵌入式Tomcat示例

10种受欢迎的嵌入式软件开发工具

翻译自这篇博文不同物理设备之间的数字转换可以说是随处可见,让其智能又强大。驱动设备的引擎是嵌入式软件....
发表于 10-21 11:51 14次 阅读
10种受欢迎的嵌入式软件开发工具

嵌入式c语言 c语言_C和嵌入式C有什么区别?

嵌入式c语言 c语言C programming language was designed by t....
发表于 10-21 10:21 7次 阅读
嵌入式c语言 c语言_C和嵌入式C有什么区别?

从存储器哪一个位置开始读取代码呢

代码是从哪里开始运行的? 从存储器哪一个位置开始读取代码呢?...
发表于 10-21 09:11 0次 阅读

串口通信的相关代码学习

怎样去编写一种简单的串口通信代码呢? 什么是SBUF? ...
发表于 10-21 09:10 0次 阅读

如何对STM32H747 / STM32H745进行测试

STM32H747/757系列产品有哪些性能? 如何对STM32H747 / STM32H745进行测试? ...
发表于 10-21 08:24 0次 阅读

怎样用最新版的MDK530去编译原来的代码呢

怎样用最新版的MDK530去编译原来的代码呢? MDK530编译为什么会出现ARM版本不符的问题? ...
发表于 10-21 07:26 0次 阅读

小白对嵌入式系统的认知

@[小白新人谈嵌入式]#嵌入苏浅谈简单谈一谈个人对嵌入式系统的一个认识。有人认为学嵌入式就是学c语言....
发表于 10-20 21:21 10次 阅读
小白对嵌入式系统的认知

嵌入式工作会越来越少吗?答案肯定是不会

先说结论吧,我觉得会硬件会少,软件会多(嵌入式软件工程师岗位不会减少,相反可能需求会越来越多)我之前....
发表于 10-20 20:35 8次 阅读
嵌入式工作会越来越少吗?答案肯定是不会

嵌入式系统开发者需要掌握什么技术?

大家好,我是小嵌,在知乎上看到这个问题,其中有一个答主的答案很经典,特此分享给大家。说实话,问题中嵌....
发表于 10-20 20:20 6次 阅读
嵌入式系统开发者需要掌握什么技术?

Spring嵌入式数据库示例

在本教程中,我们将向您展示一些示例,以在Spring框架中配置嵌入式数据库引擎,例如HSQL,H2和....
发表于 10-20 19:35 4次 阅读
Spring嵌入式数据库示例

嵌入式累还是程序员累?学嵌入式还是java好?

大家好,我是无际。人生10年,都奉献给了技术,惭愧能力不佳,只能在灯红酒绿的城市苟且偷生混口饭吃。现....
发表于 10-20 17:21 7次 阅读
嵌入式累还是程序员累?学嵌入式还是java好?

探究IntelliJ IDEA 中JAVA代码的任务标记

【任务标记是以注释的方式定义】 一、作用:1、可以大大的提高开发效率。代码量非常大的项目,在某一行中....
的头像 Android编程精选 发表于 10-20 17:10 240次 阅读
探究IntelliJ IDEA 中JAVA代码的任务标记

机械专业有必要转嵌入式吗?

关注+星标公众号,不错过精彩内容编排 | strongerHuang微信公众号|嵌入式专栏前几天,有....
发表于 10-20 16:36 10次 阅读
机械专业有必要转嵌入式吗?

详细介绍go语言中的闭包的实现

什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关....
的头像 马哥Linux运维 发表于 10-20 16:18 242次 阅读

嵌入式Android底层开发

嵌入式Linux主要有这几部分:Bootloader:主要用于引导Linux内核到内存中,让内核进行....
发表于 10-20 15:36 9次 阅读
嵌入式Android底层开发

简述Python加速运行小窍门

Python 是一种脚本语言,相比 C/C++ 这样的编译语言,在效率和性能方面存在一些不足。但是,....
的头像 Linux爱好者 发表于 10-20 15:28 714次 阅读

Python协程与JavaScript协程的对比及经验技巧

前言以前没怎么接触前端,对 JavaScript 的异步操作不了解,现在有了点了解。一查发现 Pyt....
的头像 马哥Linux运维 发表于 10-20 14:30 192次 阅读

嵌入式真的没前途?

-上图是我的朋友邓总最近在互联网,然后从侧面了解了嵌入式的行业发展,嵌入式是离不开硬件的,但是硬件的....
发表于 10-20 11:36 14次 阅读
嵌入式真的没前途?

设置I帧的QP的示例代码

  介绍 在有些应用中,发现I帧不够大。MPSoC VCU CtrlSW可以设置每一帧的QP大小。因....
的头像 FPGA开发圈 发表于 10-20 11:35 247次 阅读

IAP编程page0返回失败的问题总结

最近在支持客户的时候遇到这样一个问题:客户在做自己的二级boot loader,并且在使用LPC54....
的头像 恩智浦MCU加油站 发表于 10-20 10:59 221次 阅读
IAP编程page0返回失败的问题总结

pyBGAPI蓝牙代码库的软件结构

新的Python代码库-pyBGAPI可帮助开发人员通过Silicon Labs(亦称“芯科科技”)....
的头像 SiliconLabs 发表于 10-20 09:57 166次 阅读

无接口驱动程序基于ATEasy代码功能

作为一款新型的自动化测试软件,ATEasy 驱动程序为 ATEasy 应用程序提供了一种与设备或仪器....
的头像 广州虹科电子科技有限公司 发表于 10-20 09:29 142次 阅读

怎样去操作基于STM32F407 HAL库的Flash编程呢

怎样去操作基于STM32F407 HAL库的Flash编程呢? flash的写入操作是怎样的? ...
发表于 10-20 06:05 0次 阅读

如何去实现一种基于51最小系统的跑马灯设计

如何去实现一种基于51最小系统的跑马灯设计?...
发表于 10-20 06:01 0次 阅读

深入探讨 Hilt的工作原理

所涉主题      多种 Hilt 注解协同工作并生成代码的方式。 当 Hilt 配合 Gradle....
的头像 谷歌开发者 发表于 10-19 15:11 201次 阅读
深入探讨 Hilt的工作原理

是什么原因导致Java的C2 JIT编译器报废的

是什么原因导致Java的C2 JIT编译器报废的?怎样去解决这个问题?...
发表于 10-19 07:47 0次 阅读

PCB的设计、打板和焊接

最近MicroPython在嵌入式系统领域受到大家的喜爱,攻城狮们都纷纷研究起来,就连我们Funpa....
的头像 电子森林 发表于 10-15 10:04 238次 阅读

美的联合华为打造全新物联网操作系统

美的联合华为正式发布全新的物联网操作系统1.0,据悉美的全新的物联网操作系统1.0最新搭载鸿蒙系统,....
的头像 lhl545545 发表于 10-14 17:41 776次 阅读

能快速找到代码运行最慢部分的编程神器

天下武功,唯快不破。 编程也不例外,你的代码跑的快,你能快速找出代码慢的原因,你的码功就高。 今天分....
的头像 Linux爱好者 发表于 10-13 16:40 148次 阅读

动态内存分配的注意事项及本质是什么

C语言中比较重要的就是指针,它可以用来链表操作,谈到链表,很多时候为此分配内存采用动态分配而不是静态....
的头像 C语言编程学习基地 发表于 10-13 15:37 282次 阅读
动态内存分配的注意事项及本质是什么

用Python实现3D地图教程

前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题....
的头像 马哥Linux运维 发表于 10-13 10:09 209次 阅读
用Python实现3D地图教程

关于Python对交通路口的红绿灯进行颜色检测

转自 |   Python联盟 1.视频读取 首先把视频读取进来,因为我测试的视频是4k的所以我用r....
的头像 新机器视觉 发表于 10-13 09:32 272次 阅读
关于Python对交通路口的红绿灯进行颜色检测

spring中声明式事务实现原理猜想

  @Transactional注解简介 @Transactional 是spring中声明式事务管....
的头像 Android编程精选 发表于 10-13 09:20 221次 阅读

Java日志框架中的王者是谁

来源丨juejin.cn/post/6945753017878577165 Logback 算是JA....
的头像 Android编程精选 发表于 10-13 09:12 175次 阅读

xv6的文件系统是如何实现的

文件系统 本文继续来看 的文件系统部分, 将文件系统的设计分为 7 层: ,磁盘、缓存区、日志三个部....
的头像 Linux阅码场 发表于 10-12 18:00 164次 阅读
 xv6的文件系统是如何实现的

Linux中匿名页的访问分析

Linux 中 有后备文件支持的页称为文件页,如属于进程的代码段、数据段的页,内存回收的时候这些页面....
的头像 Linux阅码场 发表于 10-12 17:52 188次 阅读

处理器中异常和中断解决

异常是能够引起程序流偏离正常流程的事件,当异常发生时,正在执行的程序就会被挂起,处理器转而执行一块与....
的头像 单片机匠人 发表于 10-12 17:14 307次 阅读

RUST的真实驱动案例

我们无法确定RUST在内核的最终趋势,有多少人愿意迁移,但是至少Linus愿意试水。 Wedson ....
的头像 Linux阅码场 发表于 10-12 15:59 126次 阅读
RUST的真实驱动案例

那些有着巨大影响力的代码盘点

2009 年,Facebook 推出了一份改变世界的代码——点「赞」按钮。「赞」是包括 Leah P....
的头像 strongerHuang 发表于 10-12 15:46 216次 阅读
那些有着巨大影响力的代码盘点

那些书本上都没有提到的C语言volatile用法

许多程序员都无法正确理解C语言关键字volatile,这并不奇怪。因为大多数C语言书籍通常都是一两句....
的头像 STM32嵌入式开发 发表于 10-12 14:47 1127次 阅读
那些书本上都没有提到的C语言volatile用法

什么是MicroPython 它能做什么有什么局限

随着Python成为主流的编程语言,MicroPython在嵌入式系统领域也越来越热门起来,尤其是大....
的头像 电子森林 发表于 10-12 11:44 282次 阅读

PO VO DTO转换神器的思路

当然有的人喜欢写get set,或者用BeanUtils 进行复制,代码只是工具,本文只是提供一种思....
的头像 Linux爱好者 发表于 10-12 11:13 232次 阅读

如何在Colab中使用SQL

如今,编码测试在数据科学面试过程中几乎是标准的。 作为一名数据科学招聘经理,我发现一个20-30分钟....
的头像 智能感知与物联网技术研究所 发表于 10-12 09:39 213次 阅读
如何在Colab中使用SQL

命令行工具Kubectl的别样用法

  kubectl 是 K8s 官方附带的命令行工具,可以方便的操作 K8s 集群。这篇文章主要介绍....
的头像 马哥Linux运维 发表于 10-12 09:31 172次 阅读

一本教你怎么写出让同事无法维护的代码

‍对,你没看错,本文就是教你怎么写出让同事无法维护的代码。一、程序命名 容易输入的变量名 。比如:F....
的头像 Linux爱好者 发表于 10-11 15:45 200次 阅读