Kotlin内联函数和Android方法计数

我想了解内联函数如何影响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只影响引用的方法计数,没有定义的方法。

在这里输入图像说明

那么我错过了什么? 我无法find任何有关Android内联方法的良好源代码,以及它如何影响性能,以及我无法find任何文档如何计算dex方法。

我发现了杰克·沃顿(Jake Wharton)的实用工具,但是如果它的工作方式正确的话,那么Kotlin库的所有方法都会影响方法计数。 而且这也意味着在这个答案的错误https://stackoverflow.com/a/39635849/4727432

…标准库是非常小的,它的许多函数是内联的,这意味着它们不存在过去的编译,并成为内联代码。 Proguard也可以照顾很多…

那么内联函数如何影响方法呢? 任何解释dex方法计数过程的文章或post都是受欢迎的。

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

哪里内联帮助是免费的lambdas。 通常每个lambdaexpression式都至少有一个方法(有时甚至是一个类)在每个调用的地方。 但是内联lambda会跳过这个开销,因此不影响dex计数。

标准库很小,其许多function都是内联的

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