Ich erstellte eine einfache Anwendung, eine Zähler-App, die auf Knopfdruck eine ganze Zahl um eins erhöht und eine Textansicht aktualisiert. Der Code kann unten gesehen werden:Seltsame Zuordnung, TextView zu Bundle, nach dem Dekompilieren, warum?
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));
}
});
}
...
}
Nach decompiling der gleichen App mit dex2jar und jd-gui i den folgenden Code zurückerhalten:
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));
}
});
}
...
}
Auf der folgenden Zeile:
paramBundle = (TextView)findViewById(2131296257);
paramBundle.setText(Integer.toString(count));
Wie kann das System den textview auf den paramBundle setzen? Und warum passiert das? paramBundle ist vom Typ Bundle und TextView ist keine Unterklasse von Bundle, weiter ist das Bundle gemäß der dekompilierten Version endgültig. Hat beim Dekompilieren etwas schief gelaufen? Sind die Informationen vom Decompiler falsch oder warum erhalten wir dieses Ergebnis?
Edit:
# 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
Ich bin definitiv kein smali Experte, nur ein Anfänger. Aber ich habe die Anwendung auch mit apktool entschlüsselt und den obigen Code erhalten. Nach meinem Verständnis wird die gespeicherteInstanz (paramBundle) in p1 (= v3) geladen und in onCreate verwendet, und in Zeile 20 oder 21 wird sie in keiner Weise verwendet. Das deutet auf einen Dekompilierungsfehler hin? Beachten Sie, dass apktool es ermöglicht, die Anwendung erneut zu erstellen und somit beim Dekompilieren keine Daten verloren gehen können.
Ich mag diese Frage –
@ElJazouli Froh, dass Sie es interessant fanden, bitte stimmen Sie die Frage ab, damit es mehr Aufmerksamkeit bekommt. – Rawa
können Sie einen Link zu Ihrem APK veröffentlichen ich werde versuchen und es zu dekompilieren und sehen, ob es ein Dekompilierungsproblem oder was auch immer ist, weil es wirklich seltsam ist –