Ottimizzazione dell'applicazione Android prima del rilascio [chiusa]


120

Sono in una situazione " speciale " riguardo all'efficienza del mio programma. Ora sono in una fase in cui devo migliorare le prestazioni dell'applicazione e ridurre il consumo della batteria .

Prima della domanda:

Ora, sono curioso di conoscere le correzioni speciali di altri sviluppatori che hanno utilizzato per ottimizzare le proprie applicazioni. Cose che gli utenti potrebbero non riconoscere né prestare mai attenzione. Tuttavia, le correzioni aumenteranno la durata della batteria o contribuiranno a migliorare la manutenzione dell'applicazione.

Allora, qual è il tuo trucco di ottimizzazione unico?

Mi trovo in una situazione particolare in cui sto davvero cercando conoscenza e penso che questa sarà una grande opportunità per condividere la conoscenza degli sviluppatori su una situazione in cui si sono trovati tutti.

Per favore, vota ottime risposte in quanto ciò incoraggerà i grandi sviluppatori a condividere le loro conoscenze.


2
Poiché l'efficienza alla fine si riduce al non fare nulla di cui non hai bisogno (o più spesso del necessario), penserei che molto dipenderà dal tipo di cose che la tua applicazione deve realizzare ... Senza specificarlo, tutti voi Non si può fare altro che ottenere una raccolta dei "soliti sospetti"
Chris Stratton

1
@ Chris Stratton: Beh, hai ragione. Ma anche i "soliti sospetti" o una piccola risposta su un trucco specifico renderanno più facile per gli altri prendere una decisione se quella "supposizione" è ciò che stanno cercando (e se è utile per la loro situazione specifica).
Wroclai

Ridicolo quante domande davvero interessanti vengono chiuse su questo sito.
Patrick

Leggi questo post sul
Developine

Risposte:


68

Ad un certo punto arriverai al punto in cui l'uso di trucchi noti raggiungerà i loro limiti. La cosa migliore da fare a questo punto è profilare il codice e vedere quali aree sono i colli di bottiglia in base alle proprie esigenze specifiche.

Indagare sull'utilizzo della RAM utilizzando MAT e utilizzando Traceview : un articolo su come utilizzare gli strumenti per profilare la propria applicazione.


Grazie! Mi piacciono molto le risposte con le risorse. :-)
Wroclai

1
Leggi questo post del blog. medium.com/@hammad_tariq/…
Developine

37

Traccia e schiaccia le allocazioni. Più si alloca, più spesso sarà necessario eseguire il Garbage Collector, impedendo al processo di fare qualsiasi altra cosa per periodi di tempo relativamente lunghi, ad esempio 100 ms circa.

Lo strumento migliore che conosco per questo è l'Allocation Tracker incluso in DDMS .

Non solo GC può avere un impatto sull'esperienza dell'utente, ma le allocazioni superflue e GC consumano alcune risorse di elaborazione.

Ecco un esempio e un piccolo trucco. Nella mia app, ho un orologio che mostra l'ora (audio) corrente, inclusi i decimi di secondo. Questo viene aggiornato spesso. E TextView esegue le allocazioni internamente le ogni volta che chiami setText () con CharSequence. Ma non alloca nulla con la variante setText (char [] text, int start, int len). Questo non è documentato e nessuno ha risposto quando glielo ho chiesto.

Ce ne sono molti come questo. E questo è uno dei motivi per cui la mia app contiene il 50% di codice nativo (ma ci sono altri motivi).

Oltre a questo, posso consigliarti di sperimentare con ProGuard . Esegue diversi passaggi di ottimizzazione e registra tali informazioni come metodi non utilizzati all'interno del progetto, il che può aiutarti a rimuovere gli avanzi nel codice.


1
Bella risposta! I trucchi concreti sono apprezzati.
Wroclai

22

Se la tua app avrà molto tempo sullo schermo, usa il nero ovunque puoi . Ciò ridurrà il consumo della batteria della parte peggiore del dispositivo: lo schermo, specialmente nei telefoni e tablet AMOLED.


Un uso giudizioso dei colori scuri significa una vittoria per la batteria.
Robert Massaioli

7
D'altra parte, il nero assorbe più energia del bianco sugli schermi LCD, perché la luce (generata dalla retroilluminazione) inizia bianca e deve essere bloccata attivamente per produrre il nero. [ scientificamerican.com/article.cfm?id=fact-or-fiction-black-is ] Conclusione: non contare troppo su questa ottimizzazione del colore.
Sparky

16

Per le applicazioni con più attività, verifica di non riavviare le attività che devono solo essere portate in primo piano utilizzando i flag Intent appropriati. Verificare che l'heap sia sotto controllo e che non vengano creati visualizzazioni, associazioni e contesti non necessari.

Trovo che lo strumento migliore per mostrarti tutto questo mentre l'app viene eseguita è:

adb shell dumpsys meminfo 'your apps package name'

1
Oh, quello era nuovo. Grazie per la condivisione!
Wroclai

15

Quando si utilizza SQLlite, prestare particolare attenzione agli indici. Non dare per scontato nulla. Ho ottenuto enormi accelerazioni in Zwitscher, quando ho inserito gli indici nelle colonne comunemente usate per la ricerca.


13

Alcuni suggerimenti che possono aiutarti a ottimizzare la tua app in termini di interfaccia utente :

  • utilizzare convertViewper gli adattatori di elenco: sarebbe molto costoso creare una nuova vista all'interno Adapter.getView()poiché questa routine viene chiamata per ogni posizione nell'elenco. L'utilizzo convertViewconsente di riutilizzare la vista già creata. Un buon esempio (insieme all'uso di ViewHolder) può essere trovato in ApiDemos .

  • Potrebbe accadere che i tuoi layout non siano completamente ottimizzati e possano essere migliorati (ad esempio utilizzando l'unione o la rimozione dei genitori). Lo strumento Android layoutopt troverà una situazione del genere per te. Può essere utilizzato con HierarchyViewer per ispezionare singole viste. Maggiori info qui .

  • rimuovere lo sfondo disegnabile: il framework Android aveva (ha ancora?) un problema con il rilevamento delle viste da disegnare. È possibile che il tuo disegnabile di sfondo (predefinito) venga disegnato solo per essere successivamente nascosto dalla tua interfaccia utente opaca. Per sbarazzarsi di questo disegno dispendioso è sufficiente rimuovere lo sfondo disegnabile.

Può essere fatto utilizzando uno stile personalizzato

<resources>
    <style name="Theme.NoBackground" parent="android:Theme">
        <item name="android:windowBackground">@null</item>
    </style>
</resources>

Alcuni suggerimenti che possono aiutarti a ottimizzare la tua app in termini di utilizzo della batteria :

  • controllare il tipo di rete e attendere che l'utente entri nell'area con wifi o 3G (e non in roaming) e solo dopo consentirgli di utilizzare la connessione

  • usa gzip per i dati testuali quando possibile per velocizzare il download e l'analisi

  • riciclare oggetti java complessi come XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matcherecc.

Per ulteriori trucchi sulla batteria, vedere Coding for Life - Battery Life, That Is .


"riciclare oggetti java complessi come ..." Come? mentre Java ha GC
Yousha Aleayoub

9

Qualcosa a cui pensare: NON usare troppo String, ad esempio in un ciclo enorme. Questo creerà molti oggetti String che devono essere sottoposti a GC. L'esempio "Bad coding" produrrà 2 oggetti stringa ogni ciclo. Il prossimo esempio produrrà solo una stringa finale e un singolo costruttore di stringhe. Questo fa un'enorme differenza quando si ottimizzano enormi loop per la velocità. Ho usato molto stringbuilder quando ho creato la mia app Wordlist Pro per Android, ed è diventato davvero veloce quando ho passato 270000 parole in pochissimo tempo.

    //Bad coding:
    String s = "";
    for(int i=0;i<999999;i++){
        s = "Number=";
        s = s + i;
        System.out.println(s);
    }

    //Better coding
    final String txt = "Number=";
    StringBuilder sb = new StringBuilder();
    for(int i=0;i < 999999;i++){
        sb.setLength(0);
        sb.append(txt);
        sb.append(i);
        System.out.println(sb);
    }

Ho scritto un post sul blog più esteso sull'argomento. leggi qui


6

Immagino che l'utilizzo di variabili "finali" ovunque sia possibile potrebbe anche migliorare la velocità di esecuzione.


1
Ricordo di aver letto che da qualche parte, potresti fornire un link?
Wesley Wiser

1
Non sono così sicuro che sia vero per le variabili finali, ma può essere per le variabili finali statiche - vedi stackoverflow.com/questions/3117770/…
Alistair Collins

Non è possibile fornire il collegamento, ma ho ricevuto un avviso in merito nella "Guida per principianti ad Android" di Reto Meier (19 maggio 2010) / Google IO. È breve, può essere scaricato gratuitamente e contiene buoni consigli su come creare una buona app.
Stan

2
Le variabili finali potrebbero rendere il codice più efficiente perché significherà che tutti gli oggetti verranno GC nella stessa esecuzione. Non in momenti diversi in base a quando li imposti su null.
Robert Massaioli

1
Domanda: il compilatore non lo fa esplicitamente per te? Penso che dovrebbe farlo nella sua fase di analisi del codice.
Pawan

6

Ottimizza le tue immagini PNG con strumenti come OptiPNG e PNGCrush per eliminare alcuni (kilo) byte dalla dimensione dell'APK . I suggerimenti per l'ottimizzazione delle immagini per i siti Web si applicano anche qui: usa formati di immagine appropriati, gioca con la compressione JPG, considera l'utilizzo di lucidi binari invece di lucidi a 8 bit ecc.

Se spedite grandi PNG con canale alfa, è possibile barattare un certo formato APK per la velocità di avvio e utilizzare JPG separate per canali RGB e A .

Se stai effettuando connessioni HTTP, verifica che il tuo client HTTP utilizzi la compressione del contenuto. Se memorizza nella cache le risposte HTTP ricevute, verificare che comprenda e utilizzi correttamente le intestazioni HTTP relative alla memorizzazione nella cache.


Grazie per l'intuizione! Non ne ho mai sentito parlare!
Wroclai

5

Se hai operazioni di rete, prova a riutilizzare la stessa istanza httpclient. Evita di usare espressioni regolari.


Motivo? puoi spiegare perché?
Yousha Aleayoub

5

Prova a utilizzare DDMS per tenere traccia di tutti i thread in esecuzione nel sistema. Ad esempio ho notato che stavo usando webview per visualizzare contenuti html, ho notato che crea pochi thread per la gestione delle sessioni di gestione dei cookie, ecc., Il che ha aumentato la mia memoria. Quindi, a meno che tu non abbia una seria necessità di visualizzare HTML complesso, prova a utilizzare la normale classe di utilità "Html" in Android per visualizzare il contenuto html. Questo potrebbe essere utile per le persone che visualizzano Eula poiché eula typicall contiene testo html.

Se devi eseguire operazioni di rete, prova a utilizzare AndroidHttpClient se sei un principiante, ha alcune buone capacità per le sessioni di caching SSL e tutto ciò che aiuta davvero a migliorare le tue prestazioni. Imposta sempre i timeout di connessione del socket su circa 60 secondi o su alcuni valori finiti perché timeout infiniti possono causare deadlock soprattutto se interrompi la connessione durante l'handshake ssl.



4

Evita di utilizzare XPath se puoi analizzare l'input XML utilizzando routine di manipolazione delle stringhe per ottenere il testo tra i tag. Ho testato e posso confermare un miglioramento di 10 volte in questo caso, su un set di dati di 50000 elementi, su un HTC Desire.


3

So che mi unirò un po 'più tardi a questa conversazione, ma sarebbe perfetto avere molti buoni consigli in un unico posto, quindi spero che questo thread sia vivo e aggiornato abbastanza spesso. I miei consigli:

  • Non bloccare il thread dell'interfaccia utente con lavori costosi, l'utente se ne andrà se non c'è risposta dall'app (usa AsyncThreads).
  • Usa LINT , nuovo strumento che analizza le fonti del progetto Android per potenziali bug.

..sarà aggiornato..

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.