Android kotlin和java反编译后的smali 有什么区别?

简介: 转载请标明出处: http://blog.csdn.net/DJY1992/article/details/72488456 本文出自:【奥特曼超人的博客】kotlin反编译后的smali 有什么区别?以前有使用过Kotlin,后来觉得不习惯就放弃了,编译速度也让我有点蛋蛋的忧伤,直到今天谷歌承认之后,才对它有了点希望。

转载请标明出处:
http://blog.csdn.net/DJY1992/article/details/72488456
本文出自:【奥特曼超人的博客】



kotlin反编译后的smali 有什么区别?

以前有使用过Kotlin,后来觉得不习惯就放弃了,编译速度也让我有点蛋蛋的忧伤,直到今天谷歌承认之后,才对它有了点希望。
逆向的同学比较关心一个问题,“Kotlin编译出来的smail和java编译出来的一样吗?”,我忽然也很好奇,以前知道是不一样的,但是具体有哪些改变,也不是很清楚,也没深究速度效率和底层方面会有什么不相同,今天就带大家一起来了解下,具体有 哪些不同和它的运行方式 是怎样的。

了解安装和使用的可以查看上篇文章: Android AndroidStudio 详解Kotlin的安装和使用(附下载demo)

直接进入主题,首先放入Convert之后的代码:

/**
 * 测试 Kotlin
 * @author Karl-dujinyang
 */
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initView()//初始化
        testValue()//赋值和事件
    }

    private fun testValue() {
        btnWs!!.setOnClickListener {
            tvWs!!.text = "I'm immqy"
            edtWs!!.setText("Karl-dujinyang")
        }
    }

    private var btnWs: Button? = null
    private var tvWs: TextView? = null
    private var edtWs: EditText? = null

    private fun initView() {
        btnWs = this.findViewById(R.id.btn_hw) as Button
        tvWs = this.findViewById(R.id.tx_hw) as TextView
        edtWs = this.findViewById(R.id.edt_hw) as EditText
    }
}

很常见,定义的Button,Textview,Edittext,还有给它们赋值和定义方法,来看看生成的apk界面,点击效果和原生其实是一样的。
SouthEast SouthEast


ok,我们先来编译这个包,看下底层的运行是如何操作的。


(1). 编译后的目录结构不同 :smail 会编译出两个smail_classes2 ,可以看到 kotlin 编译到 unknown里 ,细心的同学会发现里面有个 install-run.zip ,最主要的是里面包含了slice_0-classes.dex ~ slice_9-classes.dex ,这里没太多关注里面的东西,接着往下走

  • 1.1 奥特曼超人杜锦阳
  • 1.2 奥特曼超人杜锦阳



(2). MainActivity 包名路径改变了

奥特曼超人杜锦阳



(3). MainActivity 类名也改变了

奥特曼超人杜锦阳



(4). 发现编译后执行字节都是不同的,里面到Lcom/android/tools/fd/runtime/AppInfo;->usingApkSplits

奥特曼超人杜锦阳



(5). 我们来看下 smail_classes2 中,有个关键的类,是Server.smail,顾名思义,服务
android/tools/fd/runtime/Server$SocketServerThread 下 执行了socketServerThread,可以从图中看到,它执行了 InstantRun ,可以大胆猜测,它是去执行了 unknown 里的 install-run 。

奥特曼超人杜锦阳



(6). 最后来看下install-run.zip 压缩包里面有些什么,似乎也没什么东西,supportV4和V7包,还有kotlin-stdlib,annotations注解,剩下的估计是封装切割 0~9 的classes.dex了。

奥特曼超人杜锦阳

我们可以看到,用了Kotlin编译后,里面的类和对象,都是给了dex,这样如果项目很大,那我们查看起来也有一定的困难度,所以从某些方面来说,以我们熟悉的方式去破解它,不是那么方便,但是……。




|| 版权声明:本文为博主杜锦阳原创文章,转载请注明出处。

相关文章
|
15天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
16天前
|
Java Android开发
Android反编译查看源码
Android反编译查看源码
21 0
|
28天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【2月更文挑战第30天】 随着Kotlin成为开发Android应用的首选语言,开发者社区对于其性能表现持续关注。本文通过深入分析与基准测试,探讨Kotlin与Java在Android平台上的性能差异,揭示两种语言在编译效率、运行时性能和内存消耗方面的具体表现,并提供优化建议。我们的目标是为Android开发者提供科学依据,帮助他们在项目实践中做出明智的编程语言选择。
|
22天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
5天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
28天前
|
安全 Android开发 开发者
构建高效Android应用:Kotlin与协程的完美结合
【2月更文挑战第30天】在移动开发领域,性能优化和流畅的用户体验是关键。本文深入探讨了如何通过结合Kotlin语言和协程技术来提升Android应用的性能和响应能力。我们将分析Kotlin的优势,介绍协程的基本概念,并通过实际案例展示如何在应用中实现协程以简化异步编程,从而提供更加高效的解决方案。
|
1月前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin与协程的完美融合
【2月更文挑战第25天】 在移动开发领域,性能优化和应用响应性的提升是永恒的追求。随着Android Jetpack组件库的不断丰富,Kotlin语言已经成为Android开发的首选。而Kotlin协程作为一种新的并发处理方案,它以轻量级线程的形式,为开发者提供了简洁高效的异步编程手段。本文将深入探讨Kotlin协程在Android应用中的实践运用,以及如何通过这种技术改善用户界面的流畅度和后台任务的处理能力,进而构建出更高效、更稳定的Android应用。
|
1月前
|
移动开发 调度 Android开发
构建高效Android应用:Kotlin与协程的完美结合
【2月更文挑战第21天】随着移动开发技术的不断进步,Android平台正寻求更高效、更简洁的编程解决方案。Kotlin作为一种现代编程语言,以其简洁性和对函数式编程的支持赢得了开发者的青睐。而协程作为处理异步任务的强大工具,在提升应用性能方面显示出巨大潜力。本文将深入探讨Kotlin语言和协程技术如何相辅相成,帮助开发者构建更加流畅和高效的Android应用。
|
1月前
|
安全 Java Android开发
构建高效Android应用:Kotlin与协程的完美融合
【2月更文挑战第15天】随着移动开发技术的不断进步,Android平台的开发者寻求更高效的编程解决方案以提升应用性能和用户体验。Kotlin作为官方推荐的开发语言,以其简洁性和功能安全性受到青睐。而协程,作为一种轻量级的线程管理机制,在异步编程和网络请求等方面展现出巨大潜力。本文将深入探讨Kotlin语言结合协程如何优化Android应用的性能,包括提高响应性、简化异步代码结构以及减少资源消耗等方面,旨在为开发者提供实战指南,帮助他们构建更加流畅和高效的Android应用。
|
设计模式 前端开发 调度
Android体系课之--Kotlin协程进阶篇-协程在Android组件中的使用(四)
1.协程通过将复杂性放入库来简化异步编程。程序的逻辑可以在协程中顺序地表达,而底层库会为我们解决其异步性。该库可以将用户代码的相关部分包装为回调、订阅相关事件、在不同线程(甚至不同机器!)上调度执行,而代码则保持如同顺序执行一样简单。 2.协程是一种并发设计模式,您可以在Android平台上使用它来简化异步执行的代码