android - SMALI HELP - 从资源中获取字符串
问题描述
我用 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, p0, 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}, Ljava/lang/Object;-><init>()V
const-string v0, "Choose Storage"
const v1, 0x7f1200a3
iget-object v0, p0, Lc/c/a/a;->l:Landroid/content/Context;
invoke-virtual {v0, v1}, Landroid/content/Context;->getString(I)Ljava/lang/String;
move-result-object v0
.line 2
iput-object v0, p0, 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
没有价值,所以尝试使用 Context 构造。
.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, p0, Lc/c/a/a;->a:Ljava/lang/String;
return-void
.end method
推荐阅读
- shiny - readLine(prompt =) 在闪亮中使用
- swift - 为什么 Xcode 将我的 Integers 转换为 Floats 而没有我指定它这样做?
- powershell - PowerShell“创建管道时出错”#Requires -Version 3.0
- swift - 如何在领域上设置 .realm 文件
- php - 如何在codeigniter中获取用户列表?
- sql-server - 无法在 azure sql 中为 master 数据库创建主密钥
- python - 检查导入到交互式控制台的模块
- blockchain - 如果被投票的节点成为提议者,投票者会得到钱吗
- ios - 键盘消失时增加Tableview的高度?
- linux - shell脚本中的%和%%有什么区别?