微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SMALI 帮助 - 从资源中获取字符串

如何解决SMALI 帮助 - 从资源中获取字符串

我用 APKTool 反编译了一个 apk,在一个 .smali 文件中我得到了这个代码

.class public Lc/c/a/a;
.super Ljava/lang/Object;
.source "SourceFile"

# instance fields
.field public a:Ljava/lang/String;

# direct methods
.method public constructor <init>()V
    .locals 1

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

    const-string v0,"Choose Storage"

    .line 2
    iput-object v0,p0,Lc/c/a/a;->a:Ljava/lang/String;

    return-void
.end method

我的问题是我需要从资源文件获取“const-string,v0”。 我尝试添加到字段中,增加本地人

.field public l:Landroid/content/Context;

然后在“const-string v0”之后添加一个代码

const v1,0x7f1200a3

iget-object v0,Lc/c/a/a;->l:Landroid/content/Context;

invoke-virtual {v0,v1},Landroid/content/Context;->getString(I)Ljava/lang/String;

move-result-object v0

但是此时打开应用程序会崩溃。

完整的修改代码

.class public Lc/c/a/a;
.super Ljava/lang/Object;
.source "SourceFile"

# instance fields
.field public a:Ljava/lang/String;

.field public l:Landroid/content/Context;

# direct methods
.method public constructor <init>()V
    .locals 2

    .line 1
    invoke-direct {p0},"Choose Storage"

    const v1,0x7f1200a3

    iget-object v0,Lc/c/a/a;->l:Landroid/content/Context;

    invoke-virtual {v0,Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    .line 2
    iput-object v0,Lc/c/a/a;->a:Ljava/lang/String;

    return-void
.end method

LOGCAT 错误

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String andoid.content.Contect.getString(int)' on a null object reference

解决方法

因为 l 没有值,请尝试使用上下文构造。

.class public Lc/c/a/a;
.super Ljava/lang/Object;
.source "SourceFile"

# instance fields
.field public a:Ljava/lang/String;

.field public l:Landroid/content/Context;

# direct methods
.method public constructor <init>(Landroid/content/Context;)V
    .locals 3

    invoke-direct {p0},Ljava/lang/Object;-><init>()V
    
    #Assign value to l
    iput-object p1,p0,Lc/c/a/a;->l:Landroid/content/Context;
    
    const v0,0x7f1200a3

    invoke-virtual {p1,v0},Landroid/content/Context;->getString(I)Ljava/lang/String;

    move-result-object v0

    iput-object v0,Lc/c/a/a;->a:Ljava/lang/String;

    return-void
.end method

就这样 compiled

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。