java代码编译得到smali代码

首先用Sublime(其他文本编辑器也可)编写一个java类

class A{
    String s = new String("text");
}

第二步:使用javac命令编译java文件得到class文件

javac是JDK自带的

javac A.java

第三步:使用jar命令编译class文件得到jar文件

jar是JDK自带的

jar cvf A.jar A.class

第四步:使用dx命令将jar文件编译成dex文件

dx.bat在Android SDK/build-tools/某一个版本下..

dx --dex --output A.dex A.jar

第五步:使用baksmali命令将dex文件反编译成smali文件

baksmali.jar可以网上去下载

java -jar baksmali-2.1.3.jar A.dex

最终得到一个out文件夹,里面就是我们需要的A.smali文件

.class LA;
.super Ljava/lang/Object;
.source "A.java"

# instance fields
.field s:Ljava/lang/String;

# direct methods
.method constructor <init>()V
    .registers 3

    .prologue
    .line 1
    invoke-direct {p0}, Ljava/lang/Object;-><init>()V

    .line 2
    new-instance v0, Ljava/lang/String;

    const-string v1, "text"

    invoke-direct {v0, v1}, Ljava/lang/String;-><init>(Ljava/lang/String;)V

    iput-object v0, p0, LA;->s:Ljava/lang/String;

    return-void
.end method

因为在热修复框架中,smali是绕不过去的

posted @ 2020-04-13 16:16  嘉禾世兴  阅读(515)  评论(0编辑  收藏  举报