2013-07-12 9 views
11

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?

+0

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. –

+0

La dimensione dell'APK è uguale. La dimensione dell'installazione è diversa. –

+0

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}'. –

risposta

9

Yup, le vostre speculazioni sono vicino per essere giusto, così come si può sapere tutto il codice Java per primo viene compilato per Java bytecode per esempio javac, poi dx li converte in Dalvik bytecode, il file bytecode Dalvik (aka dex) è impacchettato all'interno del tuo apk (la dimensione di apk di btw non varia molto come aiuta la compressione zip) di solito come classes.dex che più avanti quando installi l'apk nel tuo dispositivo, Android potrebbe ottimizzarlo per quel particolare dispositivo (noto anche come odex).

Quindi, per verificare che la cache finale dex cambi effettivamente ed è responsabile di questa modifica della dimensione, ad esempio aggiungendo semplicemente le animazioni, è possibile trovarla sia decomprimendo l'apk o all'interno del dispositivo, trovo sempre la seconda opzione in più emozionante:

ecco il tuo dex senza animazione (il vostro 80kb):

http://i.imgur.com/2JkpWS3.png

E le tue informazioni di app:

http://i.imgur.com/HseGJih.png

Così qui è il vostro dex con l'animazione (il vostro 1 MB):

http://i.imgur.com/pyrthYd.png

E le tue informazioni di app:

http://i.imgur.com/FSVPWAC.png

Uno sguardo più attento si possono trovare sono veramente diverso semplicemente guardando nel pool di costanti bytecode dalvik:

http://i.imgur.com/02mqaif.png

Per qualche motivo non ho avuto tale differenza di dimensioni radicale eppure è noticiable, ho costruito la vostra applicazione utilizzando Gradle + Android Studio quindi penso che ci aiutano e ottimizzare le cose un po '.

Infine, è possibile utilizzare ProGuard ma hey! alcuni k non sono così tanti oggi, non mi preoccuperei di aggiungere un po 'di "grasso" alla tua app a patto che lo migliori, ovviamente c'è sempre margine di miglioramento, ma ricorda che non sei in un java4k o roba del genere così :)

+0

Quando sono state eseguite queste modifiche, le prestazioni dell'applicazione variano con i diversi stili di implementazione? –

+0

@Torcellite questa è un'altra domanda, direi che dovresti prima preoccuparti di perdere 'MainActivity's con tutti i membri' static' prima ancora di preoccuparti delle prestazioni – eveliotc

+0

Ho avuto l'impressione che i membri statici abbiano solo una istanza e quindi non possano causano molte perdite Per favore perdona la mia ignoranza sull'argomento. Sto cercando di imparare. –