2015-03-18 96 views
3

早上好/下午/傍晚,我用一種小語言安靜地做了一個新手,在編譯時,有一個我無法解決的問題。我希望以前沒有問過這個問題,但是我檢查了Google和一些stackoverflow上的線程,並且找不到任何解決方案,所以我認爲它沒有。那麼,會發生什麼:編輯smali。問題:低16位必須清零。十六進制ID是否錯誤?

我想修改我的應用程序的C1.smali文件,我只是想改變一個數組的錯誤ID。所以我只是換了id,我沒有碰別的東西。

smali文件修改後:

.line 52 
invoke-virtual {p0}, Lcom/one/aplication/C1;->getResources()Landroid/content/res/Resources; 

move-result-object v6 

const/high16 v7, 0x7f060001 
# array "Codes", id was 0x7f050000 

invoke-virtual {v6, v7}, Landroid/content/res/Resources;->getStringArray(I)[Ljava/lang/String; 

move-result-object v5 

當然,我覈實,該ID是正確的,通過檢查public.xml文件(在res \值)。我讓你自己看:

<public type="string" name="name1" id="0x7f05003d" /> 
<public type="string" name="surname1" id="0x7f05003e" /> 
<public type="array" name="server" id="0x7f060000" /> 
<public type="array" name="Codes" id="0x7f060001" /> 
<public type="menu" name="search" id="0x7f070000" /> 
<public type="id" name="txt" id="0x7f080000" /> 
<public type="id" name="button1" id="0x7f080001" /> 

現在,當我想重新編譯,apktool扔,我不明白一個問題: C:\apktool>apktool b CC I: Using Apktool 2.0.0-RC4 I: Checking whether sources has changed... I: Smaling smali folder into classes.dex... CC\smali\com\one\aplication\C1.smali[58,4] Invalid literal value: 2131099649. Low 16 bits must be zeroed out. Exception in thread "main" brut.androlib.AndrolibException: Could not smali file : com/one/aplication/C1.smali at brut.androlib.src.SmaliBuilder.buildFile(SmaliBuilder.java:71) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:55) at brut.androlib.src.SmaliBuilder.build(SmaliBuilder.java:41) at brut.androlib.Androlib.buildSourcesSmali(Androlib.java:354) at brut.androlib.Androlib.buildSources(Androlib.java:294) at brut.androlib.Androlib.build(Androlib.java:280) at brut.androlib.Androlib.build(Androlib.java:255) at brut.apktool.Main.cmdBuild(Main.java:225) at brut.apktool.Main.main(Main.java:84)

難道有人知道一些關於這種情況的原因問題? apktool問題指向我修改的行[58]。我真的不知道會發生什麼!感謝任何會盡力幫助我的人,請原諒我可憐的英語。祝你有美好的一天! :)

+0

如果應用程序是你的,你爲什麼要編輯smali而不是Java文件? – jb15613 2015-03-18 21:33:34

+2

我嘗試學習如何在我自己的應用程序上編輯smali文件,因爲我完全知道它是如何工作的。在未來,當我將獲得一些知識時,我將開始研究那些不屬於我的工具。 – MisterX 2015-03-18 21:39:26

回答

6

在原始的字節碼,所述const/high16指令接受一個16位操作數,然後將其加載到寄存器之前左移16位。在smali 2.0及更高版本中,操作數是以後移位格式給出的,當然這要求最低有效16位全爲0。

例如,將值0x12340000加載到寄存器,可以使用

const/high16 0x12340000 

而在原始的字節碼,操作數將被表示爲16位值「0×1234」。

值0x7f060001不符合這一要求,因此它不能與const/high16指令使用。您可以改爲使用const指令。

const v7, 0x7f060001 
+1

現在完美的作品,非常感謝耶穌!我現在和其他班級有同樣的問題,我也會這樣做。你幫了我很多,祝你有美好的一天。 :) – MisterX 2015-03-18 22:12:00

+0

太棒了。 – Sayka 2016-04-12 22:06:20