- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在玩弄 smali and baksmali在我编写的一个小型 Hello World Android 应用程序上。我的源代码是:
package com.hello;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
}
然后被拆解为:
.class public Lcom/hello/Main;
.super Landroid/app/Activity;
.source "Main.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 6
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
.line 10
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
.line 11
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/hello/Main;->setContentView(I)V
.line 12
return-void
.end method
我知道这是某种中间表示,但不确定它是什么。据我所知,必须有一些关于如何理解这种表示的规范,但我无法弄清楚如何搜索它。所以给定一个 apk 文件,有人可以通俗地解释一下 Dalvik opcode specification 是如何实现的吗?用于得出这种表示?我目前的理解是这样的:
有关上述两个步骤的任何信息(也许有一些简单的示例)都将极大地帮助我正确理解概念。
更新 1(在 Chris 回复后发布):
所以基本上,我会执行以下操作来获得 Dalvik 字节码:
然后反汇编程序读取 classes.dex 文件并确定 apk 中存在的所有类。你能提供一些关于如何做到这一点的信息吗?它是否以十六进制模式解析文件并查找 Dalvik 规范,然后适本地解析?还是发生了其他事情?例如,当我在 classes.dex 上使用 hexdump 时,它给了我这样的东西:
64 65 78 0a 30 33 ...
这些现在用于操作码查找吗?
实际上,简而言之,我很想知道所有这些“魔法”是如何完成的。因此,例如,如果我要学习编写这个工具,我应该遵循的高级路线图是什么?
最佳答案
您看到的是 davlik 字节码。 Java 代码由 dx 工具翻译成 Dalvik 字节码。 list 是一个单独的问题,我将在一分钟内讨论。实际上,当您编译 Android 应用程序时,dx 工具使用 256 个 dalvik 操作码将您的 Java 代码转换为字节码(对于标准 JVM 应用程序,javac 将 Java 转换为 Java 字节码的方式相同)。
例如,invoke-super
是指示 dvm(dalvik 虚拟机)调用父类(super class)上的方法的操作码。类似地,invoke-interface
指示 dvm 调用接口(interface)方法。
所以你可以看到
super.onCreate(savedInstanceState);
翻译成
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)
在这种情况下,invoke-super
有两个参数,{p0,p1
组和 Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)
参数是方法规范,必要时用于查找和解析方法。
然后就是构造函数区的invoke-direct
调用
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
每个类都有一个init
方法,用于初始化类的数据成员,也称为构造函数。当你构造一个类时,虚拟机也必须调用父类(super class)的构造函数。这解释了为什么您的类的构造函数调用 Activity
构造函数。
关于 list ,会发生什么(如果您查看源代码,这都在 Dalvik 规范中)是编译器(生成 apk 文件)将 list 转换为更压缩的格式(二进制 xml)为了节省空间。 list 与您发布的代码没有任何关系,它更多地指示 dvm 如何处理应用程序是一个关于 Activities
、Services
的整体,等。您发布的是实际执行的内容。
这是对您问题的高级回答。如果您需要更多,请告诉我,我会尽力而为。
编辑 你基本上是对的。反编译器从 dex 文件中读取二进制数据作为字节流。它了解格式应该是什么,并且能够提取常量、类等信息。关于操作码,这正是它所做的。它了解每个操作码的字节值是什么(或者它在 dex 文件中的表示方式)并且能够将其转换为人类可读的字符串。如果你要实现这个,除了了解编译器的一般基础知识外,我将从深入了解 dex 文件的结构开始。从那里,您需要构建一个表,将操作码值与人类可读的字符串相匹配。使用该信息和一些关于字符串常量等的附加信息,您可以构建已编译类的文本文件表示。这有意义吗?
关于java - 了解 Dalvik 代码的反汇编?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4820285/
我在 PID 上使用 showmap 命令,但我无法理解报告中的这一部分: 16384 3752 689 0 3132 0 620
在哪里可以找到 dalvik 操作码列表以及相应的允许操作数及其大小(8 位/16 位/32 位/62 位) 最佳答案 This给出 dalvik vm 中存在的每个操作码的所有详细信息和 this给
当我们在桌面系统上运行其他虚拟机时,是否可以直接在 Dalvik 虚拟机上执行任务? 最佳答案 如果我正确理解了您的问题:我正在考虑 task在问题中提到 apk (如果是这样,那么以下答案可能对 y
对此进行了一些研究,并发现了一些关于在应用程序中面临相同问题的人的帖子。我也在我的应用程序的谷歌控制台中遇到了这个崩溃,并关注了我发现的帖子( java.lang.ClassNotFoundExcep
我知道这可能是 Android 中的一个基本问题。但是什么是 Dalvik 和 dalvik-cache? 最佳答案 Dalvik 是 Android 使用的虚拟机。它通常被认为是一个 Java 虚拟
关于在运行时动态生成 java 字节码并将其加载到正在运行的 Dalvik VM 中,这个问题已被多次询问(并回答),但是有没有办法在运行时将 dex 文件/字节码加载到应用程序中? 谢谢 最佳答案
Android 中 Dalvik Bridge Function 和 Dalvik Native Function 调用有什么区别? 最佳答案 简单来说, Android 是基于 Linux 的操作系
我想获取标准 Java 库的 Dalvik 字节码,我的意思是,Android 使用的 java 库(例如 java.util.* 集合)。 我需要获取这些类文件,因为我想分析它们,不是全部,而是像
我正在尝试学习 smali,但有一些问题无法通过谷歌搜索找到。 1)我创建了一个简单的测试用例来更好地解释自己 const-string v1, "Start" :try_start_0 const-
在我的应用程序中,我将一些数据存储在 Application 类中: public HashMap> getConfigs() { if (mConfigs != null) {
Java 规范允许编译器和 VM 重新排序内存写入以提高效率。 Dalvik VM 是否具体利用了这一点? 免责声明:我无意依赖顺序,即使 Dalvik 不这样做(此外编译器也可能这样做),但很高兴知
我已经下载并安装了 SDK。但是我的手机没有显示在 Dalvik 调试监视器中。 请帮帮我,这是怎么回事?我已经杀死了服务器。并重新启动。但是 adb devices 没有列出我的设备。我知道在 ec
我有一个正在运行的 dalvik 实例: /system/bin/dalvikvm ... -Xmx100m ... memmap 看起来像: b01f6000-b05b7000 rwxp 00000
如果我知道变量的模式,例如 R.id.edit_x where x (1..N),我如何才能获得对给定 EditText 的引用,例如 findViewByID(R.id.edit_1)。 Dalvi
我刚刚做了一个基准测试来比较局部变量、成员变量、其他对象的成员变量和getter setter 的访问性能。基准测试在循环中增加了 10 次 mio 迭代的变量。这是输出: BENCHMARK:本地1
在我的 Dalvik 调试监视器中 在删除所有以前的日志消息后显示与以前的日志消息具有不同标记的新日志消息。这意味着日志一直在清除自身并且只显示几行。我将如何查看所有日志消息? 最佳答案 我也经常遇到
我试图了解为 Android 中的每个进程分配了多少内存。据我了解,对于每个应用程序进程,都有一个单独的 Zygote 进程实例,Zygote 将 fork Dalvik VM。 我写了一个小的示例
我使用的是 Android 2.2 SDK,无法让 MultiUserChat 类中的静态 block 执行。我试图将其强制加载为 try { String qual = MultiUserC
我们正在为 Android jelly bean 开发一个项目。我们的平台是arm-based,内核版本是3.1.10。在我们的开发过程中,我们发现在dalvik中发生应用崩溃的概率非常低。根据以下回
每个 ANR 转储都列出了 ANR 发生时所有线程的状态。我知道 WAIT 是什么意思,但是 SUSPENDED 和 MONITOR 是什么意思? 提前致谢... 最佳答案 Dalvik 线程状态总结
我是一名优秀的程序员,十分优秀!