奇怪的分配,文本视图到捆绑包,在反编译后,为什么?
我创建了一个简单的应用程序,一个计数器应用程序,按下按钮后,它将整数递增一并更新文本视图。代码可以在下面看到:
public class MainActivity extends Activity {
    public static int count = 0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        final TextView textView = (TextView) findViewById(R.id.count);
        textView.setText(Integer.toString(count));
        final Button button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count++;
                textView.setText(Integer.toString(count));
            }
        });
    }
    ...
}
使用dex2jar和jd-gui反编译同一应用程序后,我收到了以下代码:
public class MainActivity extends Activity {
    public static int count = 0;
    protected void onCreate(final Bundle paramBundle) {
        super.onCreate(paramBundle);
        setContentView(2130903040);
        paramBundle = (TextView)findViewById(2131296257);
        paramBundle.setText(Integer.toString(count));
        ((Button)findViewById(2131296256)).setOnClickListener(new View.OnClickListener() {
            public void onClick(View paramAnonymousView) {
                MainActivity.count += 1;
                paramBundle.setText(Integer.toString(MainActivity.count));
            }
        });
    }
    ...
}
在以下行:
        paramBundle = (TextView)findViewById(2131296257);
        paramBundle.setText(Integer.toString(count));
系统如何将文本视图设置为参数Bundle?为什么会发生这种情况?paramBundle是 Bundle 类型,TextView 不是 Bundle 的子类,根据反编译的版本,更多的 Bundle 是最终的。反编译时是否出错?是来自反编译器的信息是错误的,还是为什么我们得到这个结果?
编辑:
# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 3
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;
    .prologue
    .line 17
    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V
    .line 18
    const/high16 v2, 0x7f030000
    invoke-virtual {p0, v2}, Lcom/example/rawa/helloworld/MainActivity;->setContentView(I)V
    .line 20
    const v2, 0x7f090001
    invoke-virtual {p0, v2}, Lcom/example/rawa/helloworld/MainActivity;->findViewById(I)Landroid/view/View;
    move-result-object v1
    check-cast v1, Landroid/widget/TextView;
    .line 21
    .local v1, "textView":Landroid/widget/TextView;
    sget v2, Lcom/example/rawa/helloworld/MainActivity;->count:I
    invoke-static {v2}, Ljava/lang/Integer;->toString(I)Ljava/lang/String;
    move-result-object v2
    invoke-virtual {v1, v2}, Landroid/widget/TextView;->setText(Ljava/lang/CharSequence;)V
    .line 22
    const/high16 v2, 0x7f090000
    invoke-virtual {p0, v2}, Lcom/example/rawa/helloworld/MainActivity;->findViewById(I)Landroid/view/View;
    move-result-object v0
    check-cast v0, Landroid/widget/Button;
    .line 23
    .local v0, "button":Landroid/widget/Button;
    new-instance v2, Lcom/example/rawa/helloworld/MainActivity$1;
    invoke-direct {v2, p0, v1}, Lcom/example/rawa/helloworld/MainActivity$1;-><init>(Lcom/example/rawa/helloworld/MainActivity;Landroid/widget/TextView;)V
    invoke-virtual {v0, v2}, Landroid/widget/Button;->setOnClickListener(Landroid/view/View$OnClickListener;)V
    .line 30
    return-void
.end method
我绝对不是斯马利专家,只是一个新手。但是我也使用apktool解码了应用程序,并收到了上面的smali代码。根据我的理解,保存的实例(paramBundle)被加载到p1(=v3)中并在onCreate中使用,并且在第20行或第21行中没有以任何方式使用。对我来说,这一点指向一个分解错误?请记住,apktool允许再次构建应用程序,因此在反编译时不会丢失任何数据。