我试图找到一种方法来重写数组初始化中使用的即时性。
例如,这个Java代码:
package my;
public class Test {
public static final int[] SomeArray = { 10, 20, 30 };
}生成以下smali (不相关部分省略):
# 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我想将即时值更改为100,200,300 (适当)。
array-data元素有一个ARRAY_PAYLOAD操作码,在smali中表示为DexBackedArrayPayload类的一个实例。指令重写器过滤实例 of ReferenceInstruction,而且由于DexBackedArrayPayload不是ReferenceInstruction的实例,所以没有现成的支持。
我想创建(并返回) DexBackedArrayPayload的新实例,但正如它的名称所描述的那样--直接从dex文件中读取数组元素。
还有其他解决办法吗?
发布于 2017-04-20 18:31:59
好的,你所看到的重写内容的一般思想是为你感兴趣的事情提供你自己的子类,并重写重写方法。不管你想做什么。
在本例中,听起来像是要创建并返回一个具有自己的数值常量的新ImmutableArrayDataPayload。
https://stackoverflow.com/questions/43522466
复制相似问题