Ho recentemente effettuato questo application per gli utenti root che modificano frequentemente il loro dispositivo.Come variano le dimensioni di installazione dell'applicazione sul telefono?
Ora ho notato un comportamento piuttosto strano con le dimensioni di installazione dell'applicazione.
Quando ho utilizzato un'attività regolare con visualizzazioni inizializzate dal file XML, la dimensione era 715 kb
.
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main_layout);
executeEvents = new ExecuteEvents(this);
display = (TextView) findViewById(R.id.display);
powermenu = (Button) findViewById(R.id.powermenu);
turnoffscreen = (Button) findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getResources().getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
}
Dopo sono passato a una finestra di dialogo che è stato creato impostando una vista che conteneva i widget nel file XML. La dimensione dell'app era ora 200kb
.
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
//setContentView(R.layout.main_layout);
LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(R.layout.main_layout, null);
executeEvents = new ExecuteEvents(this);
display = (TextView) view.findViewById(R.id.display);
powermenu = (Button) view.findViewById(R.id.powermenu);
turnoffscreen = (Button) view.findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) view.findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getResources().getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
Dialog dialog = new Dialog(this);
dialog.setContentView(view);
dialog.setTitle(getResources().getString(R.string.app_name));
dialog.show();
}
Si riduce a 80kb
quando ho usato questo:
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
dialog = new Dialog(this);
dialog.setContentView(R.layout.main_layout);
executeEvents = new ExecuteEvents(this);
display = (TextView) dialog.findViewById(R.id.display);
powermenu = (Button) dialog.findViewById(R.id.powermenu);
turnoffscreen = (Button) dialog.findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) dialog.findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
dialog.setTitle(getString(R.string.app_name));
dialog.show();
dialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialogInterface) {
dialog.dismiss();
MainActivity.this.finish();
}
});
}
Ho anche notato un altro strano cambiamento nelle dimensioni delle applicazioni quando ho cercato di aggiungere un animazione con l'ultimo stile del codice (il 80kb
uno) . Le dimensioni dell'app sono diventate un notevole 1 MB
. Questo è come mi inizializzato l'animazione e provato a chiamare quando il pulsante è stato cliccato:
private static final ScaleAnimation animation = new ScaleAnimation(1, .95f, 1, .95f, Animation.RELATIVE_TO_SELF, (float)0.5, Animation.RELATIVE_TO_SELF, (float)0.5);//declared as global variable
All'interno del metodo onCreate:
animation.setDuration(1000);
animation.setFillAfter(false);
Dopo di che ho chiamato nella onClickListener
:
mapButton.startAnimation(animation);
Perché c'è un cambiamento così drastico nelle dimensioni dell'applicazione quando non ho aggiunto nuove risorse ma modificato solo lo stile del codice? Dove c'è una differenza ENORME nel modo in cui inizializzo i widget presenti nelle finestre di dialogo? Perché c'è una differenza enorme quando aggiungo un'animazione come l'ho aggiunta?
Follow-up domanda:
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(R.layout.main_layout);
executeEvents = new ExecuteEvents(this);
display = (TextView) this.findViewById(R.id.display);
powermenu = (Button) this.findViewById(R.id.powermenu);
turnoffscreen = (Button) this.findViewById(R.id.turnscreenoff);
mapButton = (ImageButton) this.findViewById(R.id.mapButton);
SP = getSharedPreferences(PBConstants.Power_Button_SP, MODE_MULTI_PROCESS);
if(SP.contains(PBConstants.INPUT_DEVICE_TAG))
display.setText(getResources().getString(R.string.configured));
mapButton.setOnClickListener(this);
powermenu.setOnClickListener(this);
turnoffscreen.setOnClickListener(this);
}
SPECULAZIONE
Questo potrebbe essere dovuto ai pacchetti o le classi che sono importati? Ha senso per il numero animation
della domanda almeno.
L'aggiunta del contesto in cui vengono inizializzate le viste riduce l'utilizzo della memoria?
Puoi decomprimere il tuo APK e analizzarne i componenti. Puoi anche sezionare il file dex (http://code.google.com/p/smali) per vedere la sua struttura. –
La dimensione dell'APK è uguale. La dimensione dell'installazione è diversa. –
Wow, è interessante. Su un dispositivo rooted puoi comunque analizzare i singoli file relativi ad un'applicazione installata. Ad esempio, 'ls -l/data/app/{pacchetto}', 'ls -l/data/data/{pacchetto}'. –