Mengoptimalkan aplikasi Android sebelum rilis [ditutup]

120

Saya berada dalam situasi " khusus " tentang efisiensi program saya. Sekarang saya berada pada fase di mana saya perlu meningkatkan kinerja aplikasi dan mengurangi konsumsi baterai .

Sebelum pertanyaan:

Sekarang, saya ingin tahu tentang perbaikan khusus pengembang lain yang telah mereka gunakan untuk mengoptimalkan aplikasi mereka sendiri. Hal-hal yang mungkin tidak pernah dikenali atau diperhatikan oleh pengguna. Namun, perbaikan akan meningkatkan masa pakai baterai atau membantu meningkatkan pemeliharaan aplikasi.

Jadi, apa trik pengoptimalan unik Anda?

Saya berada dalam situasi tertentu di mana saya benar-benar mencari pengetahuan dan saya pikir ini akan menjadi peluang bagus untuk berbagi pengetahuan pengembang tentang situasi yang mereka hadapi.

Tolong, pilih jawaban yang bagus karena itu akan mendorong pengembang hebat untuk berbagi pengetahuan mereka.

Wroclai
sumber
2
Karena efisiensi pada akhirnya bermuara pada tidak melakukan apa pun yang tidak perlu (atau lebih sering daripada yang Anda perlukan), menurut saya, banyak hal akan bergantung pada jenis hal apa yang harus dicapai aplikasi Anda ... Tanpa menentukan itu, Anda semua bisa lakukan adalah mendapatkan koleksi "tersangka biasa"
Chris Stratton
1
@ Chris Stratton: Ya, Anda benar. Tetapi juga, "tersangka" atau sedikit jawaban tentang trik tertentu akan memudahkan orang lain untuk membuat keputusan jika "tebakan" itu yang mereka cari (dan jika berguna untuk situasi khusus mereka).
Wroclai
Konyol betapa banyak pertanyaan yang sangat menarik ditutup di situs ini.
Patrick
Baca postingan
Developine

Jawaban:

68

Pada titik tertentu Anda akan sampai pada titik di mana menggunakan trik yang diketahui akan mencapai batasnya. Hal terbaik untuk dilakukan pada titik ini adalah membuat profil kode Anda dan melihat area mana yang menjadi leher botol berdasarkan kebutuhan spesifik Anda.

Menyelidiki penggunaan RAM menggunakan MAT dan Menggunakan Traceview : artikel tentang cara menggunakan alat untuk membuat profil aplikasi Anda.

unholysampler
sumber
Terima kasih! Saya sangat suka jawaban dengan sumber daya. :-)
Wroclai
1
Baca postingan blog ini. medium.com/@hammad_tariq/…
Developine
37

Lacak dan squash alokasi. Semakin banyak Anda mengalokasikan, semakin sering pengumpul sampah perlu dijalankan, menghentikan proses Anda dari melakukan hal lain untuk jangka waktu yang relatif lama, seperti 100 md atau lebih.

Alat terbaik yang saya tahu untuk ini adalah Allocation Tracker yang disertakan dalam DDMS .

Tidak hanya GC yang dapat berdampak pada pengalaman pengguna, tetapi alokasi yang berlebihan dan GC menghabiskan beberapa sumber daya komputasi.

Berikut contoh dan trik kecil. Di aplikasi saya, saya memiliki jam yang menunjukkan waktu (audio) saat ini, termasuk sepersepuluh detik. Ini sering diperbarui. Dan TextView melakukan alokasi secara internal setiap kali Anda memanggil setText () dengan CharSequence. Tapi itu tidak mengalokasikan apa pun dengan varian setText (char [] text, int start, int len). Ini tidak didokumentasikan, dan tidak ada yang menjawab ketika saya bertanya tentang itu.

Ada banyak yang seperti ini. Dan ini adalah salah satu alasan mengapa aplikasi saya berisi 50% kode asli (tetapi ada alasan lain).

Selain itu, saya dapat menyarankan Anda untuk bereksperimen dengan ProGuard . Ia melakukan beberapa langkah pengoptimalan, dan mencatat informasi seperti metode yang tidak digunakan dalam proyek, yang dapat membantu Anda menghapus sisa dalam kode Anda.

olivierg.dll
sumber
1
Jawaban yang bagus! Trik konkret dihargai.
Wroclai
22

Jika aplikasi Anda memiliki banyak waktu layar, gunakan warna hitam di mana pun Anda bisa . Itu akan mengurangi konsumsi baterai dari bagian terburuk perangkat: layar, khususnya di ponsel dan tablet AMOLED.

Aleadam
sumber
Penggunaan warna gelap yang bijaksana berarti kemenangan untuk baterai.
Robert Massaioli
7
Di sisi lain, warna hitam membutuhkan lebih banyak daya daripada putih pada layar LCD, karena cahaya (yang bersumber dari lampu latar) mulai putih dan harus diblokir secara aktif untuk menghasilkan hitam. [ scientamerican.com/article.cfm?id=fact-or-fiction-black-is ] Intinya: Jangan terlalu mengandalkan pengoptimalan warna ini.
Sparky
16

Untuk aplikasi dengan banyak aktivitas, pastikan Anda tidak memulai ulang aktivitas yang hanya perlu dibawa ke depan dengan menggunakan flag Intent yang sesuai. Periksa apakah heap Anda terkendali, dan tampilan, binding, dan konteks yang tidak perlu tidak sedang dibuat.

Saya menemukan alat terbaik untuk menunjukkan kepada Anda semua ini saat aplikasi berjalan:

adb shell dumpsys meminfo 'your apps package name'
NickT
sumber
1
Oh, itu baru. Terima kasih telah berbagi!
Wroclai
15

Saat menggunakan SQLlite, beri perhatian khusus pada indeks. Jangan berasumsi apapun. Saya mendapatkan kecepatan yang luar biasa di Zwitscher, ketika saya meletakkan indeks pada kolom yang biasa digunakan untuk pencarian.

Heiko Rupp
sumber
13

Beberapa tips yang dapat membantu Anda mengoptimalkan aplikasi Anda dalam hal UI :

  • digunakan convertViewuntuk adaptor daftar - akan sangat mahal jika Anda membuat tampilan baru di dalam Adapter.getView()karena rutinitas ini dipanggil untuk setiap posisi dalam daftar. Menggunakan convertViewmemungkinkan Anda menggunakan kembali tampilan yang sudah dibuat. Contoh yang bagus (bersama dengan penggunaan ViewHolder) dapat ditemukan di ApiDemos .

  • Mungkin saja tata letak Anda tidak sepenuhnya dioptimalkan dan dapat ditingkatkan (misalnya dengan menggunakan penggabungan atau penghapusan orang tua). Tata letak alat Android akan menemukan situasi seperti itu untuk Anda. Ini bisa digunakan dengan HierarchyViewer untuk memeriksa tampilan individual. Info selengkapnya di sini .

  • hapus drawable latar belakang - Kerangka kerja Android dulu (apakah masih memiliki?) masalah dalam mendeteksi tampilan apa yang harus digambar. Ada kemungkinan drawable latar belakang (default) Anda hanya akan ditarik untuk kemudian disembunyikan oleh UI buram Anda. Untuk menghilangkan gambar boros ini cukup hapus drawable latar belakang.

Itu bisa dilakukan dengan menggunakan gaya khusus

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

Beberapa tip yang dapat membantu Anda mengoptimalkan aplikasi Anda dalam hal penggunaan baterai :

  • periksa jenis jaringan dan tunggu sampai pengguna masuk ke area dengan wifi atau 3G (dan tidak roaming) dan baru kemudian izinkan dia untuk menggunakan koneksi

  • gunakan gzip untuk data tekstual jika memungkinkan untuk mempercepat pengunduhan dan penguraian

  • mendaur ulang objek java yang kompleks seperti XmlPullParserFactory/ BitmapFactory/ StringBuilder/ Matcherdll.

Untuk trik baterai lainnya, lihat Coding for Life - Battery Life, That Is .

Andai
sumber
"mendaur ulang objek java yang kompleks seperti ..." Bagaimana caranya? sedangkan Java memiliki GC
Yousha Aleayoub
9

Sesuatu untuk dipikirkan: JANGAN menggunakan String secara berlebihan, misalnya dalam loop besar. Ini akan membuat banyak objek String yang harus di-GC. Contoh "Pengodean buruk" akan menghasilkan 2 objek string setiap loop. Contoh selanjutnya hanya akan menghasilkan satu String terakhir dan satu pembuat string tunggal. Ini membuat perbedaan besar saat mengoptimalkan putaran besar untuk kecepatan. Saya sering menggunakan stringbuilder saat membuat aplikasi Wordlist Pro Android, dan aplikasi ini menjadi sangat cepat saat menelusuri 270000 kata dalam waktu singkat.

    //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);
    }

Saya menulis posting blog yang lebih panjang tentang masalah ini. baca disini

ernell
sumber
6

Saya kira menggunakan variabel "final" di mana pun yang memungkinkan juga dapat meningkatkan kecepatan eksekusi.

Stan
sumber
1
Saya ingat pernah membacanya di suatu tempat, dapatkah Anda memberikan tautannya?
Wesley Wiser
1
Tidak begitu yakin itu benar untuk variabel final, tetapi bisa juga untuk variabel final statis - lihat stackoverflow.com/questions/3117770/…
Alistair Collins
Tidak dapat memberikan tautannya tetapi saya mendapat pemberitahuan tentangnya di "Panduan pemula untuk android" oleh Reto Meier (19 Mei 2010) / Google IO. Singkatnya, ini gratis untuk diunduh dan ada saran bagus tentang cara membuat aplikasi yang bagus.
Stan
2
Variabel terakhir dapat membuat kode lebih efisien karena ini berarti bahwa semua objek akan digabungkan dalam proses yang sama. Tidak pada waktu yang berbeda berdasarkan saat Anda menyetelnya ke null.
Robert Massaioli
1
Pertanyaan: Bukankah kompilator melakukannya secara eksplisit untuk Anda? Saya pikir itu harus melakukannya dalam fase analisis kodenya.
Pawan
6

Optimalkan gambar PNG Anda dengan alat seperti OptiPNG dan PNGCrush untuk mengurangi beberapa (kilo) byte dari ukuran APK. Kiat pengoptimalan gambar untuk situs web juga berlaku di sini: gunakan format gambar yang sesuai, mainkan dengan kompresi JPG, pertimbangkan untuk menggunakan transparansi biner daripada transparansi 8-bit, dll.

Jika Anda kapal PNG besar dengan alpha channel, Anda dapat perdagangan beberapa ukuran APK untuk kecepatan startup dan menggunakan JPG terpisah untuk RGB dan A saluran .

Jika Anda membuat koneksi HTTP, periksa apakah klien HTTP Anda menggunakan kompresi konten. Jika cache menerima respons HTTP, periksa apakah ia memahami dan menggunakan header HTTP terkait cache dengan benar.

Pēteris Caune
sumber
Terima kasih atas wawasannya! Saya belum pernah mendengar tentang ini!
Wroclai
5

Jika Anda memiliki operasi jaringan, coba gunakan kembali contoh httpclient yang sama. Hindari menggunakan ekspresi reguler.

Naresh
sumber
Alasan? bisa kamu jelaskan kenapa
Yousha Aleayoub
5

Coba gunakan DDMS untuk melacak semua utas yang berjalan di sistem. Misalnya saya perhatikan bahwa saya menggunakan tampilan web untuk menampilkan konten html, saya perhatikan bahwa itu membuat beberapa utas untuk manajemen sesi manajemen cookie dll .. yang meningkatkan cetakan kaki memori saya. Jadi, kecuali Anda memiliki kebutuhan yang serius untuk menampilkan html yang kompleks, coba gunakan kelas utilitas normal "Html" di android untuk menampilkan konten html. Ini mungkin berguna untuk orang yang menampilkan Eula karena eula typicall berisi teks html.

Jika Anda harus melakukan operasi jaringan, coba gunakan AndroidHttpClient jika Anda seorang pemula, ini memiliki beberapa kemampuan yang baik untuk Caching sesi SSL dan semua itu sangat membantu dalam meningkatkan kinerja Anda. Selalu atur waktu tunggu koneksi soket Anda menjadi sekitar 60 detik atau nilai terbatas karena batas waktu tak terbatas dapat menyebabkan kebuntuan terutama jika Anda memutuskan koneksi selama jabat tangan ssl.

Naresh
sumber
4

Gunakan Android Resource Tracker untuk menemukan sumber daya yang tidak digunakan dalam proyek Anda yang dapat dihapus.

FrVaBe
sumber
4

Hindari menggunakan XPath jika Anda dapat mengurai input XML Anda dengan menggunakan rutinitas manipulasi string untuk mendapatkan teks di antara tag. Saya telah menguji dan dapat mengonfirmasi peningkatan 10x dalam kasus ini, pada kumpulan data 50000 item, pada HTC Desire.

luvieere
sumber
3

Saya tahu saya akan bergabung nanti dalam percakapan ini, tetapi akan sempurna jika memiliki banyak tip bagus di satu tempat, jadi saya harap utas ini akan aktif dan sering diperbarui. Kiat saya:

  • Jangan memblokir utas UI dengan pekerjaan mahal, pengguna akan keluar jika tidak ada respons dari aplikasi (gunakan AsyncThreads).
  • Gunakan LINT , alat baru yang memindai sumber proyek Android untuk potensi bug.

..akan diperbarui..

Ewok
sumber