2017-04-20 3 views
0

私は配列の初期化で使用されているイミディエートを書き直す方法を見つけようとしています。例えばARRAY_PAYLOAD命令の書き換え

、このJavaコード:

# direct methods 
.method static constructor <clinit>()V 
    .locals 1 

    .prologue 
    .line 4 
    const/4 v0, 0x3 

    new-array v0, v0, [I 

    fill-array-data v0, :array_0 

    sput-object v0, Lmy/Test;->SomeArray:[I 

    return-void 

    nop 

    :array_0 
    .array-data 4 
     0xa 
     0x14 
     0x1e 
    .end array-data 
.end method 

I 100に即時の値を変更したい、200、300:

package my; 

public class Test { 
    public static final int[] SomeArray = { 10, 20, 30 }; 
} 

は以下smali(省略無関係な部分)を生成します(適切に)。

array-data要素は、ARRAY_PAYLOADオペコードを持ち、DexBackedArrayPayloadクラスのインスタンスとして表現されます。 Instruction rewriter filters instancesReferenceInstructionで、DexBackedArrayPayloadReferenceInstructionのインスタンスではないため、すぐに使用できるサポートはありません。

私はDexBackedArrayPayloadの新しいインスタンスを作成(返す)と考えましたが、その名前が示すように、配列要素を取得するためには、dexファイルから直接読み取ります。

その他の回避策はありますか?

+0

更新:回避策を見つけました.DexBackedArrayPayloadを返す代わりに、[ArrayPayload](https://github.com/JesusFreke/smali/blob/76d69c7466b74b79e492d0edc6ff619adaeb78a1/dexlib2)を実装する匿名クラスのインスタンスを返します。 /src/main/java/org/jf/dexlib2/iface/instruction/formats/ArrayPayload.java)インターフェイス。 –

+0

しかし、私はまだそれを行う別の(おそらく、よりエレガントな)方法があるかどうか見ることに興味があります。 –

答えて

1

あなたが見ている再書き込みの一般的な考え方は、自分が興味を持っているもののための独自のサブクラスを提供し、書き換えメソッドをオーバーライドすることです。する。

この場合、独自の数値定数で新しいImmutableArrayDataPayloadを作成して返すように思えます。

関連する問題