Kotlin 内联函数和 Android 方法计数

Kotlin inline functions and Android methods count

我想了解内联函数如何影响 classes.dex 和方法的数量。根据我的理解,内联函数应该对方法计数的开销为零。但是 APK 分析器给了我相反的结果。 我写了小测试来检查这个。

InlineFunction.kt 文件:

inline fun inlined(block: () -> Unit) {
    block()
}

MainActivity.kt文件:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        inlined {
            println("Inlined")
        }
    }
}

从生成的代码的角度来看,它看起来很清楚:

public final class MainActivity extends AppCompatActivity {
    private HashMap _$_findViewCache;

    protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       String var2 = "Inlined";
       System.out.println(var2);
   }

正如我们所见,没有调用其他方法。但是如果我用分析器打开 apk,我可以看到这个方法影响定义和引用 methpds 计数。

另一方面,Kotlin stdlib 只影响引用的方法计数而不影响定义的方法。

那我错过了什么?我找不到关于 Android 中内联方法的任何好的来源以及它如何影响性能,也找不到任何文档如何计算 dex 方法计数。

我找到了Jake Wharton utility but if it works correct than all methods from Kotlin library impacts methods count. And it also means that something wrong in this answer

...Standard library is very small and many of its functions are inline-only which mean they don't exist past compilation and just become inline code. Proguard can take care of a lot as well...

那么内联函数如何影响方法计数?欢迎任何解释 dex 方法计数过程的文章或帖子。

Kotlin 生成真正的方法,即使它们被标记为 inline 用于从 java 调用,所以它们仍然反映在 dex 计数中。

内联的帮助在于无开销的 lambda。通常每个 lambda 在每个调用位置都至少用一个方法(有时甚至是 class)表示。但是内联的 lambda 跳过了这个开销,因此不会影响 dex 计数。

Standard library is very small and many of its functions are inline-only

标准库对某些方法使用特殊技巧(@inlineOnly 注释)来跳过为内联函数生成方法(如上所述)。但是这个注解是kotlin包内部的,不能在正常代码中使用。