【问题标题】:Kotlin bytecode in Android AppsAndroid 应用程序中的 Kotlin 字节码
【发布时间】:2018-11-13 15:54:50
【问题描述】:

我是一名 kotlin 和 Java 开发人员,最近开始分析 kotlin 生成的字节码。我发现了很多包装器代码和编译器生成的其他内容,以便将我在 Kotlin 中编写的代码转换为 Java。

所以,我的问题是:

想象一下,我有一个应用程序,它的代码 100% 用 kotlin 编写。 依赖项和主应用程序。所有科特林。

  1. 这是否意味着将使用不同的编译器来避免与 Java 兼容的字节码?
  2. 或者在这种情况下编译器是否做了优化?

非常感谢。


我知道Kotlin Native,但我认为它将来只会应用于Android。

【问题讨论】:

  • 你说的为了避免字节码是什么意思?
  • kotlin 有自己的编译器,是的
  • @TimCastelijns 但它仍然会变成 Java 字节码,尽管它绝对是一团糟。
  • 是什么让你说“一团糟?”不是。
  • @yole 好吧,我想我不知道字节码,但是当它被反编译时,使用 Android Studio 的反编译器、JADx 或 APKTool(Java、Java、Smali),要遵循代码要困难得多与 Java 应用程序相比。 Kotlin 类在编译时仍然使用kotlin.Stringkotlin.Intkotlin.Unit 类型,而不是java.lang.Stringintvoid

标签: android kotlin decompiler


【解决方案1】:

使用 Kotlin 避免 Java 字节码的唯一方法是使用 Kotlin Native,在这种情况下您将无法使用 Android SDK。

Kotlin JVM,顾名思义,就是编译成 JVM 字节码;这是使用它的主要吸引力之一。如果它编译成不同的东西,那就是 Kotlin Native。

回答你的子弹:

  1. 不,无论您是否有 Java 源文件,都使用相同的编译器。
  2. 可能不会。 Kotlin JVM 几乎可以与 Java 完全互操作,无论您的项目是否包含 Java 代码都是如此。

考虑一下您是否正在使用 Kotlin 创建一个 Android 库。在这种情况下,你真的希望它自动编译成 Java 字节码以外的东西吗?它无法在 Java 项目中使用,这与 Kotlin 作为 Java 替代品如此出色的主要原因之一背道而驰。

另外请记住,您使用的是 Android SDK。即使您的 build.gradle 中没有依赖项,您仍然会引用核心 SDK 本身,即 Java。 SDK 未包含在您的 APK 中,但仍会在编译期间使用。

如果您想要避免 Java 字节码的东西,请使用 Flutter 之类的东西。它有自己的 SDK,并且可以桥接回 Java 组件。当然,你不能完全避开 JVM,因为你仍然需要某种方式让 Android 安装和打开应用程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多