幼敏悟过人,读书辄成诵。这篇文章主要讲述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,我可以看到这个方法影响定义和参考甲基计数。
文章图片
另一方面,Kotlin stdlib仅影响引用的方法计数,并且没有定义方法。
文章图片
那我错过了什么?我无法找到关于在android中内联方法以及它如何影响性能的任何好的来源,以及我找不到任何文档如何计算dex方法计数。
我找到了Jake Wharton utility,但如果它的工作正确,那么Kotlin库中的所有方法都会影响方法。而且这也意味着这个答案https://stackoverflow.com/a/39635849/4727432出了问题
...标准库非常小,它的许多功能都是内联的,这意味着它们在编译之后不存在,只是成为内联代码。 Proguard也可以照顾很多......那么内联函数如何影响方法计数呢?任何解释dex方法计数过程的文章或帖子都是受欢迎的。
答案Kotlin生成真正的方法,即使它们被标记为
inline
用于从java调用,因此它们仍然反映在dex计数中。内联帮助是无开销的lambda。通常,每个lambda在每个调用位置至少用一个方法(有时甚至是一个类)来表示。但是内联lambda会跳过这个开销,因此不会影响dex计数。
标准库非常小,它的许多功能都是内联的【Kotlin内联函数和Android方法都很重要】标准库使用特殊技巧(
@inlineOnly
注释)来为某些方法跳过生成内联函数的方法(如上所述)。但是这个注释在kotlin
包中是内部的,不能在普通代码中使用。推荐阅读
- 如何将ImageView放在Xamarin.Android应用程序中,根据设备屏幕大小自行调整大小()
- 添加编译'com.google.android.gms(play-services-ads:11.6.0'ERROR)
- 如何在android Firestore上实现Paginate查询[重复]
- lapply和do.call有什么区别()
- Android DatePicker显示月份名称
- 在Android上禁用蓝牙可发现模式
- 在Android 2.3上实现OBEX PUSH服务器
- Android和双模蓝牙设备(与BR / EDR(经典)配对时未找到自定义BLE服务)
- Android的多重连接