最近看着APK不爽,于是乎,反编译之,看看反编译出来的是什么!呵呵,因为自己对Android这块是刚接触,因此不是很熟悉。
开发环境:windows xp 32位
反编译工具:APKTool http://code.google.com/p/android-apktool/downloads/list
查看工具:Eclipse(可以用记事本之类的东西打开的,因为有Eclipse因此就直接用了)
首先,新建一个HelloWorld工程,编译并在模拟器上运行。然后到工程目录找到\workspace\bin\HelloWord.apk,复制出来,放到APKTool的目录下。这里解释一下,APKtool下载后 解压到一个文件夹里。apktool1.4.1.tar.bz2 apktool-install-windows-r04-brut1.tar.bz2 这两个包解压到一个文件夹里。
然后在打开运行 输入cmd 回车 ,然后进入APKTool所在的目录 输入反编译命令 apktool d HelloWorld.apk,命令执行完成后会在APKTool目下生成一个HelloWorld的目录。如下图
打开文件夹,找到smali文件下的HelloWorld.smali,用Eclipse打开。
package com.seven.helloworld;
import android.app.Activity;
import android.os.Bundle;
public class HelloWorld extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
public Float fun(int i,Float j,String s) {
int x = 16;
int y = x;
System.out.println(x);
System.out.println(y);
System.out.println(j);
return j;
}
}
以上是我修改过后的HelloWorld文件,其中的内容不外乎就是增加了一个没有调用的fun方法。为什么我要这么做呢,下文会做解释的。
以下是反编译之后Eclipse打开的文件:
.class public Lcom/seven/helloworld/HelloWorld;
.super Landroid/app/Activity;
.source "HelloWorld.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
# virtual methods
.method public fun(ILjava/lang/Float;Ljava/lang/String;)Ljava/lang/Float;
.locals 3
.parameter "i"
.parameter "j"
.parameter "s"
.prologue
const/16 v0, 0x10
.local v0, x:I
move v1, v0
.local v1, y:I
sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual {v2, v0}, Ljava/io/PrintStream;->println(I)V
sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual {v2, v1}, Ljava/io/PrintStream;->println(I)V
sget-object v2, Ljava/lang/System;->out:Ljava/io/PrintStream;
invoke-virtual {v2, p2}, Ljava/io/PrintStream;->println(Ljava/lang/Object;)V
return-object p2
.end method
.method public onCreate(Landroid/os/Bundle;)V
.locals 1
.parameter "savedInstanceState"
.prologue
invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
const/high16 v0, 0x7f03
invoke-virtual {p0, v0}, Lcom/seven/helloworld/HelloWorld;->setContentView(I)V
return-void
.end method
哈哈,学习过汇编的人,是不是觉得这个代码看着熟悉啊。但是呢,这个跟汇编可是不同的哦,虽然有点像,并这个代码依然是面向对象的哦。
通过对比可以知道:
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
invoke-direct {p0}, Landroid/app/Activity;-><init>()V
return-void
.end method
这段主要表示继承Activity,.locals 0表示有几个局部变量。.prologue 以下的东西表示运算开始,这包括了执行运算符以及赋值运算等。
未完待续…………后面补上