【问题标题】:How to return a static result in this smali code如何在这个 smali 代码中返回静态结果
【发布时间】:2016-04-20 19:01:58
【问题描述】:
.method private a()Landroid/content/Intent;
.locals 5

.prologue
.line 297
:try_start_0
iget-object v0, p0, Lcom/myapp/c/f;->b:Lcom/myapp/context/ApplicationContext;

iget-object v0, v0, Lcom/myapp/context/ApplicationContext;->o:Lcom/myapp/context/b;

iget-object v0, v0, Lcom/myapp/context/b;->b:Ljava/util/List;

iget v1, p0, Lcom/myapp/c/f;->c:I

.line 298
invoke-interface {v0, v1}, Ljava/util/List;->get(I)Ljava/lang/Object;

move-result-object v0

check-cast v0, Lcom/myapp/data/weblink;

.line 299
new-instance v1, Landroid/content/Intent;

const-string v2, "android.intent.action.SEND"

invoke-direct {v1, v2}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V

.line 300
const-string v2, "text/plain"

invoke-virtual {v1, v2}, Landroid/content/Intent;->setType(Ljava/lang/String;)Landroid/content/Intent;

.line 301
const-string v2, "android.intent.extra.SUBJECT"

.line 302
invoke-virtual {v0}, Lcom/myapp/data/weblink;->getTitle()Ljava/lang/String;

move-result-object v3

.line 301
invoke-virtual {v1, v2, v3}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;

.line 303
const-string v2, "android.intent.extra.TEXT"

new-instance v3, Ljava/lang/StringBuilder;

invoke-direct {v3}, Ljava/lang/StringBuilder;-><init>()V

.line 304
invoke-virtual {v0}, Lcom/myapp/data/weblink;->getTitle()Ljava/lang/String;

move-result-object v4

invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

move-result-object v3

const-string v4, " "

invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

move-result-object v3

invoke-virtual {v0}, Lcom/myapp/data/weblink;->getLink()Ljava/lang/String;

move-result-object v0

invoke-virtual {v0}, Ljava/lang/String;->toString()Ljava/lang/String;

move-result-object v0

invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

move-result-object v0

invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

move-result-object v0

.line 303
invoke-virtual {v1, v2, v0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

move-object v0, v1

.line 309
:goto_0
return-object v0

.line 307
:catch_0
move-exception v0

invoke-static {v0}, Lcom/myapp/d/e;->a(Ljava/lang/Exception;)V

.line 309
const/4 v0, 0x0

goto :goto_0
.end method

.method static synthetic a(Lcom/myapp/c/f;)Lcom/myapp/context/ApplicationContext;
.locals 1

.prologue
.line 51
iget-object v0, p0, Lcom/myapp/c/f;->b:Lcom/myapp/context/ApplicationContext;
return-object v0
.end method

这是一个 smali 代码,它从数据库文件中的“weblink”返回一个标题和一个链接。我想从数据库文件返回一个静态值(例如 'This is the link www.google.com' )而不是 Title 和 Link 。我怎样才能做到这一点?我应该更改什么代码?这类似于这里的这个问题(How to return a static result in smali function),我已经尝试过这个解决方案。但是应用程序正在强制关闭。有人可以帮忙吗?

【问题讨论】:

  • 安装 github.com/ollide/intellij-java2smali 并创建一个 java 类,该类具有返回所需内容的方法。将其转换为 smali 并从中学习
  • 解决了一半。我能够更改标题的链接并将我自己的文本添加到 const-string v4 。现在链接从可共享的文本中消失了,但标题被添加了两次。我试图同时删除标题和链接,并仅在 const-string v4 中显示值。但是当我这样做时,应用程序会强制关闭......知道吗?
  • 使用调试器 (DDMS) 记录异常。没有它,我们无法为您提供帮助。
  • 我尝试了 intellij java2smali 但我遇到了问题。当我点击“compile to smali”时,什么也没有发生。没有 smali 代码。它显示“清理输出导向器完成,正在保存...”但是没有生成 smali 文件。我不知道怎么了。使用 intellijidea 2016.1.1

标签: java android smali


【解决方案1】:

只需在字符串对象附加到 StringBuilder 之前覆盖它的内容。

.line 304
invoke-virtual {v0}, Lcom/myapp/data/weblink;->getTitle()Ljava/lang/String;

move-result-object v4

# Add following line to override v4 before it's appended to the StringBuilder
const-string v4, "This is the link"

invoke-virtual {v3, v4}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

同样,你可以对链接做同样的事情

invoke-virtual {v0}, Lcom/myapp/data/weblink;->getLink()Ljava/lang/String;

move-result-object v0

invoke-virtual {v0}, Ljava/lang/String;->toString()Ljava/lang/String;

move-result-object v0

# Add following line to override v0 before it's appended to the StringBuilder
const-string v0, "www.google.com"

invoke-virtual {v3, v0}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;

实际上,您可以在将其放入意图之前一次覆盖整个字符串。

invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;

move-result-object v0

# Add this line
const-string v0, "The whole text you want, including the title and link"

.line 303
invoke-virtual {v1, v2, v0}, Landroid/content/Intent;->putExtra(Ljava/lang/String;Ljava/lang/String;)Landroid/content/Intent;
:try_end_0
.catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0

希望你没有做坏事。

【讨论】:

  • 哇...我不知道该怎么感谢你。我想我会放弃我的最后一个解决方案,即设置两个 gettitle 而不是链接。你的回答解决了我的问题。现在我可以设置标题和自定义文本而不是链接。顺便说一句,我没有做任何坏事。我只想添加一个“共享通过(应用程序名称)文本而不是链接。完全没有恶意。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多