Ho creato una semplice applicazione, un'app contatore, che premendo un pulsante si aumenta un intero di uno e si aggiorna una vista testo. Il codice può essere visto sotto:Assegnazione strana, TextView to Bundle, dopo la decompilazione, perché?
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));
}
});
}
...
}
Dopo decompilazione la stessa applicazione con dex2jar e JD-GUI che ho ricevuto il seguente codice di nuovo:
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));
}
});
}
...
}
Sulla riga seguente:
paramBundle = (TextView)findViewById(2131296257);
paramBundle.setText(Integer.toString(count));
Com'è possibile che il sistema imposti la visualizzazione di testo sul paramBundle? E perché sta succedendo questo? paramBundle è di tipo Bundle e TextView non è una sottoclasse di Bundle, inoltre più Bundle è definitivo in base alla versione decompilata. Qualcosa è andato storto dopo aver decompilato? Le informazioni del decompilatore sono errate o perché otteniamo questo risultato?
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
io sono sicuramente un esperto Smali, solo un novizio. Ma ho decodificato l'applicazione usando apktool e ho ricevuto il codice smali qui sopra. Da quanto ho capito, la funzione salvata (paramBundle) è caricata in p1 (= v3) e usata in onCreate, e non è usata in alcun modo nella riga 20 o 21. A me questo punto verso un errore di decomposizione? Tieni presente che apktool consente di creare nuovamente l'applicazione e quindi non è possibile perdere dati durante la decompilazione.
Mi piace questa domanda –
@ElJazouli Sono contento che tu l'abbia trovato interessante, per favore vota la domanda in modo da ottenere più attenzione. – Rawa
puoi postare un link al tuo APK, cercherò di decompilarlo e vedere se si tratta di un problema di decompilazione o altro, perché è davvero strano –