【发布时间】:2018-01-01 16:45:53
【问题描述】:
我想了解内联函数如何影响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,我可以看到这个方法会影响定义和引用的方法计数。
另一方面,Kotlin 标准库只影响引用的方法计数,而不影响定义的方法。
那么我错过了什么?我找不到关于 Android 中内联方法的任何好的来源以及它如何影响性能,也找不到任何文档如何计算 dex 方法计数。
我找到了Jake Wharton utility,但如果它工作正常,那么 Kotlin 库中的所有方法都会影响方法计数。这也意味着这个答案有问题https://stackoverflow.com/a/39635849/4727432
...标准库非常小,它的许多函数都是内联的,这意味着它们在编译后不存在,只是变成内联代码。 Proguard 也可以处理很多事情......
那么内联函数是如何影响方法计数的呢?欢迎任何解释 dex 方法计数过程的文章或帖子。
【问题讨论】:
标签: java android compilation kotlin dex