3

おはよう/午後/夕方、私はスマリ語の初心者で静かですが、コンパイル中に解決できない問題があります。この質問が以前に聞かれたことがないことを願っていますが、Google と stackoverflow のいくつかのスレッドをチェックアウトしましたが、解決策が見つからなかったので、解決していないと思います。それで、何が起こるか:

アプリの 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

もちろん、public.xml ファイル (res\values 内) をチェックして、id が正しいことを確認しました。私はあなたに自分で見てもらいました:

 <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] を指しています。本当にどうなるかわからない!私を助けてくれる人に感謝し、私の下手な英語を許してください。良い一日を過ごしてください!:)

4

1 に答える 1

8

生のバイトコードでは、const/high16命令は 16 ビットのオペランドを受け入れ、レジスタにロードされる前に左に 16 ビットシフトされます。smali 2.0 以降では、オペランドはポスト シフト形式で指定されます。これには、もちろん、最下位 16 ビットがすべて 0 である必要があります。

たとえば、値 0x12340000 をレジスタにロードするには、次のように使用できます。

const/high16 0x12340000

生のバイトコードでは、オペランドは 16 ビット値「0x1234」として表されます。

値 0x7f060001 はこの要件を満たしていないため、このconst/high16命令では使用できません。代わりにconst命令を使用できます。

const v7, 0x7f060001
于 2015-03-18T21:59:43.787 に答える